-
Notifications
You must be signed in to change notification settings - Fork 105
Open
Labels
Kind: Bug ⚠️Kind: Important 🥇Level: Intermediate (3)Plugin: C++Issues related to the parsing and presentation of C++ projects.Issues related to the parsing and presentation of C++ projects.
Milestone
Description
PPMacroCallback::MacroExpands
deliberately omits expanding #pragma
statements and other preprocessor directives:
CodeCompass/plugins/cpp/parser/src/ppmacrocallback.cpp
Lines 73 to 77 in d2b0ee6
// If this is a # at the start of a line, discard it from the token stream. | |
// We don't want the re-preprocess step to see #defines, #includes or other | |
// preprocessor directives. | |
if (tok.is(clang::tok::hash) && tok.isAtStartOfLine()) | |
continue; |
However, pragmas can also be defined with the _Pragma
operator, see reference:
https://gcc.gnu.org/onlinedocs/cpp/Pragmas.html
C99 introduced the _Pragma operator. This feature addresses a major problem with ‘#pragma’: being a directive, it cannot be produced as the result of macro expansion. _Pragma is an operator, much like sizeof or defined, and can be embedded in a macro.
Consider the following MWE, which will produce multiple errors, as the pragmas will be seemingly re-preprocessed.
#define CF_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
#define CF_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
CF_ASSUME_NONNULL_BEGIN // error: already inside '#pragma clang assume_nonnull'
int bar = 42;
CF_ASSUME_NONNULL_END // error: not currently inside '#pragma clang assume_nonnull'
Metadata
Metadata
Assignees
Labels
Kind: Bug ⚠️Kind: Important 🥇Level: Intermediate (3)Plugin: C++Issues related to the parsing and presentation of C++ projects.Issues related to the parsing and presentation of C++ projects.