diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-08-03 23:24:57 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-08-03 23:24:57 +0000 |
commit | fb50bf5a6f16fe2376f2b4276d40ec10ea0d538b (patch) | |
tree | 324e5ffaeac9d80b1b1eac8f5abeae5faa8c062a /clang/lib/Parse/ParsePragma.cpp | |
parent | d673098480b7572fae5119f253755ccde5ad193d (diff) | |
download | bcm5719-llvm-fb50bf5a6f16fe2376f2b4276d40ec10ea0d538b.tar.gz bcm5719-llvm-fb50bf5a6f16fe2376f2b4276d40ec10ea0d538b.zip |
Per advice that Doug Gregor gave me several months ago, clean up the
implementation of '#pragma unused' by not constructing intermediate
DeclRefExprs, but instead do the name lookup directly. The
implementation is greatly simplified.
Along the way, degrade '#pragma unused(undeclaredvariable)' to a
warning instead of being a hard error. This implements:
<rdar://problem/6761874> [sema] allow #pragma unused to reference undefined variable (with warning)
llvm-svn: 78019
Diffstat (limited to 'clang/lib/Parse/ParsePragma.cpp')
-rw-r--r-- | clang/lib/Parse/ParsePragma.cpp | 33 |
1 files changed, 8 insertions, 25 deletions
diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index 58c729aef29..68b10934b15 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -126,7 +126,7 @@ void PragmaUnusedHandler::HandlePragma(Preprocessor &PP, Token &UnusedTok) { SourceLocation LParenLoc = Tok.getLocation(); // Lex the declaration reference(s). - llvm::SmallVector<Action::ExprTy*, 5> Ex; + llvm::SmallVector<Token, 5> Identifiers; SourceLocation RParenLoc; bool LexID = true; @@ -134,27 +134,13 @@ void PragmaUnusedHandler::HandlePragma(Preprocessor &PP, Token &UnusedTok) { PP.Lex(Tok); if (LexID) { - if (Tok.is(tok::identifier)) { - Action::OwningExprResult Name = - Actions.ActOnIdentifierExpr(parser.CurScope, Tok.getLocation(), - *Tok.getIdentifierInfo(), false); - - if (Name.isInvalid()) { - if (!Ex.empty()) - Action::MultiExprArg Release(Actions, &Ex[0], Ex.size()); - return; - } - - Ex.push_back(Name.release()); + if (Tok.is(tok::identifier)) { + Identifiers.push_back(Tok); LexID = false; continue; } - // Illegal token! Release the parsed expressions (if any) and emit - // a warning. - if (!Ex.empty()) - Action::MultiExprArg Release(Actions, &Ex[0], Ex.size()); - + // Illegal token! PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_var); return; } @@ -170,11 +156,7 @@ void PragmaUnusedHandler::HandlePragma(Preprocessor &PP, Token &UnusedTok) { break; } - // Illegal token! Release the parsed expressions (if any) and emit - // a warning. - if (!Ex.empty()) - Action::MultiExprArg Release(Actions, &Ex[0], Ex.size()); - + // Illegal token! PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_punc); return; } @@ -188,10 +170,11 @@ void PragmaUnusedHandler::HandlePragma(Preprocessor &PP, Token &UnusedTok) { // Verify that we have a location for the right parenthesis. assert(RParenLoc.isValid() && "Valid '#pragma unused' must have ')'"); - assert(!Ex.empty() && "Valid '#pragma unused' must have arguments"); + assert(!Identifiers.empty() && "Valid '#pragma unused' must have arguments"); // Perform the action to handle the pragma. - Actions.ActOnPragmaUnused(&Ex[0], Ex.size(), UnusedLoc, LParenLoc, RParenLoc); + Actions.ActOnPragmaUnused(Identifiers.data(), Identifiers.size(), + parser.CurScope, UnusedLoc, LParenLoc, RParenLoc); } // #pragma weak identifier |