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)



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@78019 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/ParsePragma.cpp b/lib/Parse/ParsePragma.cpp
index 58c729a..68b1093 100644
--- a/lib/Parse/ParsePragma.cpp
+++ b/lib/Parse/ParsePragma.cpp
@@ -126,7 +126,7 @@
   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 @@
     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 @@
       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 @@
 
   // 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