Move the check for vprintf* functions inside of SemaCheckStringLiteral. Fixes PR4470.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74413 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index f6d6623..4f0553d 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -717,8 +717,6 @@
   if (E->isTypeDependent() || E->isValueDependent())
     return false;
 
-  E = E->IgnoreParenCasts();
-  
   switch (E->getStmtClass()) {
   case Stmt::ConditionalOperatorClass: {
     const ConditionalOperator *C = cast<ConditionalOperator>(E);
@@ -763,6 +761,28 @@
           return SemaCheckStringLiteral(Init, TheCall,
                                         HasVAListArg, format_idx, firstDataArg);
       }
+      
+      // For vprintf* functions (i.e., HasVAListArg==true), we add a
+      // special check to see if the format string is a function parameter
+      // of the function calling the printf function.  If the function
+      // has an attribute indicating it is a printf-like function, then we
+      // should suppress warnings concerning non-literals being used in a call
+      // to a vprintf function.  For example:
+      //
+      // void
+      // logmessage(char const *fmt __attribute__ (format (printf, 1, 2)), ...){
+      //      va_list ap;
+      //      va_start(ap, fmt);
+      //      vprintf(fmt, ap);  // Do NOT emit a warning about "fmt".
+      //      ...
+      //
+      //
+      //  FIXME: We don't have full attribute support yet, so just check to see
+      //    if the argument is a DeclRefExpr that references a parameter.  We'll
+      //    add proper support for checking the attribute later.
+      if (HasVAListArg)
+        if (isa<ParmVarDecl>(VD))
+          return true;
     }
         
     return false;
@@ -901,29 +921,6 @@
                              firstDataArg))
     return;  // Literal format string found, check done!
 
-  // For vprintf* functions (i.e., HasVAListArg==true), we add a
-  // special check to see if the format string is a function parameter
-  // of the function calling the printf function.  If the function
-  // has an attribute indicating it is a printf-like function, then we
-  // should suppress warnings concerning non-literals being used in a call
-  // to a vprintf function.  For example:
-  //
-  // void
-  // logmessage(char const *fmt __attribute__ (format (printf, 1, 2)), ...) {
-  //      va_list ap;
-  //      va_start(ap, fmt);
-  //      vprintf(fmt, ap);  // Do NOT emit a warning about "fmt".
-  //      ...
-  //
-  //
-  //  FIXME: We don't have full attribute support yet, so just check to see
-  //    if the argument is a DeclRefExpr that references a parameter.  We'll
-  //    add proper support for checking the attribute later.
-  if (HasVAListArg)
-    if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(OrigFormatExpr))
-      if (isa<ParmVarDecl>(DR->getDecl()))
-        return;
-
   // If there are no arguments specified, warn with -Wformat-security, otherwise
   // warn only with -Wformat-nonliteral.
   if (TheCall->getNumArgs() == format_idx+1)