Fix for PR2631; make va_arg work correctly on x86-64.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54600 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 2982c45..003f3de 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -2604,9 +2604,16 @@
   QualType T = QualType::getFromOpaquePtr(type);
 
   InitBuiltinVaListType();
-  
-  if (CheckAssignmentConstraints(Context.getBuiltinVaListType(), E->getType())
-      != Compatible)
+
+  // Get the va_list type
+  QualType VaListType = Context.getBuiltinVaListType();
+  // Deal with implicit array decay; for example, on x86-64,
+  // va_list is an array, but it's supposed to decay to
+  // a pointer for va_arg.
+  if (VaListType->isArrayType())
+    VaListType = Context.getArrayDecayedType(VaListType);
+
+  if (CheckAssignmentConstraints(VaListType, E->getType()) != Compatible)
     return Diag(E->getLocStart(),
                 diag::err_first_argument_to_va_arg_not_of_type_va_list,
                 E->getType().getAsString(),