diff options
author | Chris Lattner <sabre@nondot.org> | 2009-04-19 18:26:34 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-04-19 18:26:34 +0000 |
commit | 249c38bb027a9152e7ed587da962e680ac65bf42 (patch) | |
tree | 529324395d5a1ee87e10bf19ddaf44b9fc37eb68 /clang/lib | |
parent | fc5571337e46a40d9a108e63a0c4e69f3d0d9d4e (diff) | |
download | bcm5719-llvm-249c38bb027a9152e7ed587da962e680ac65bf42.tar.gz bcm5719-llvm-249c38bb027a9152e7ed587da962e680ac65bf42.zip |
Fix PR4006, incorrect handling of __VA_ARGS__ when it was the first token
in a function-like macro body. This has the added bonus of moving some
function-like macro specific code out of the object-like macro codepath.
llvm-svn: 69530
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Lex/PPDirectives.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp index e0bd5a1ee07..15477b63d3a 100644 --- a/clang/lib/Lex/PPDirectives.cpp +++ b/clang/lib/Lex/PPDirectives.cpp @@ -1306,6 +1306,15 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { return; } + // If this is a definition of a variadic C99 function-like macro, not using + // the GNU named varargs extension, enabled __VA_ARGS__. + + // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro. + // This gets unpoisoned where it is allowed. + assert(Ident__VA_ARGS__->isPoisoned() && "__VA_ARGS__ should be poisoned!"); + if (MI->isC99Varargs()) + Ident__VA_ARGS__->setIsPoisoned(false); + // Read the first token after the arg list for down below. LexUnexpandedToken(Tok); } else if (Features.C99) { @@ -1334,15 +1343,6 @@ void Preprocessor::HandleDefineDirective(Token &DefineTok) { Diag(Tok, diag::warn_missing_whitespace_after_macro_name); } - // If this is a definition of a variadic C99 function-like macro, not using - // the GNU named varargs extension, enabled __VA_ARGS__. - - // "Poison" __VA_ARGS__, which can only appear in the expansion of a macro. - // This gets unpoisoned where it is allowed. - assert(Ident__VA_ARGS__->isPoisoned() && "__VA_ARGS__ should be poisoned!"); - if (MI->isC99Varargs()) - Ident__VA_ARGS__->setIsPoisoned(false); - // Read the rest of the macro body. if (MI->isObjectLike()) { // Object-like macros are very simple, just read their body. |