From: Chris Lattner Date: Sun, 19 Apr 2009 20:06:32 +0000 (+0000) Subject: Fix PR3918: Invalid use of __VA_ARGS__ not diagnosed, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=88e43a519e5ecc06b5e14da8ffb1e89cc15474c0;p=clang Fix PR3918: Invalid use of __VA_ARGS__ not diagnosed, by rejecting invalid poisoned tokens in the token pasting path. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69536 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/TokenLexer.cpp b/lib/Lex/TokenLexer.cpp index ec48690b35..8cec433221 100644 --- a/lib/Lex/TokenLexer.cpp +++ b/lib/Lex/TokenLexer.cpp @@ -457,7 +457,6 @@ bool TokenLexer::PasteTokens(Token &Tok) { // operator. if (Result.is(tok::hashhash)) Result.setKind(tok::unknown); - // FIXME: Turn __VA_ARGS__ into "not a token"? } // Transfer properties of the LHS over the the Result. @@ -475,7 +474,19 @@ bool TokenLexer::PasteTokens(Token &Tok) { if (Tok.is(tok::identifier)) { // Look up the identifier info for the token. We disabled identifier lookup // by saying we're skipping contents, so we need to do this manually. - Tok.setIdentifierInfo(PP.LookUpIdentifierInfo(Tok, ResultTokStrPtr)); + IdentifierInfo *II = PP.LookUpIdentifierInfo(Tok, ResultTokStrPtr); + Tok.setIdentifierInfo(II); + + // If this identifier was poisoned, emit an error. This won't be handled by + // Preprocessor::HandleIdentifier because this is coming from a macro + // expansion. + if (II->isPoisoned()) { + // We warn about __VA_ARGS__ with poisoning. + if (II->isStr("__VA_ARGS__")) + PP.Diag(Tok, diag::ext_pp_bad_vaargs_use); + else + PP.Diag(Tok, diag::err_pp_used_poisoned_id); + } } return false; }