зеркало из https://github.com/microsoft/clang.git
Fix PR1820, an incredibly subtle macro expansion bug that Neil discovered.
Neil, please review this fix. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@44285 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
b235fc2cf3
Коммит
0c3eb29e79
|
@ -941,6 +941,16 @@ MacroArgs *Preprocessor::ReadFunctionLikeMacroArgs(Token &MacroName,
|
|||
// If this is a comment token in the argument list and we're just in
|
||||
// -C mode (not -CC mode), discard the comment.
|
||||
continue;
|
||||
} else if (Tok.is(tok::identifier)) {
|
||||
// Reading macro arguments can cause macros that we are currently
|
||||
// expanding from to be popped off the expansion stack. Doing so causes
|
||||
// them to be reenabled for expansion. Here we record whether any
|
||||
// identifiers we lex as macro arguments correspond to disabled macros.
|
||||
// If so, we mark the token as noexpand. This is a subtle aspect of
|
||||
// C99 6.10.3.4p2.
|
||||
if (MacroInfo *MI = getMacroInfo(Tok.getIdentifierInfo()))
|
||||
if (!MI->isEnabled())
|
||||
Tok.setFlag(Token::DisableExpand);
|
||||
}
|
||||
|
||||
ArgTokens.push_back(Tok);
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
// RUN: clang -P -E %s | grep 'int f(void)'
|
||||
// PR1820
|
||||
|
||||
#define f(x) h(x
|
||||
#define h(x) x(void)
|
||||
extern int f(f));
|
Загрузка…
Ссылка в новой задаче