summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Sema/SemaExpr.cpp13
-rw-r--r--clang/test/Sema/va_arg_x86_64.c6
2 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 2982c45865e..003f3dea59f 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -2604,9 +2604,16 @@ Sema::ExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc,
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(),
diff --git a/clang/test/Sema/va_arg_x86_64.c b/clang/test/Sema/va_arg_x86_64.c
new file mode 100644
index 00000000000..86511349c39
--- /dev/null
+++ b/clang/test/Sema/va_arg_x86_64.c
@@ -0,0 +1,6 @@
+// RUN: clang -fsyntax-only -verify -triple=x86_64-unknown-freebsd7.0 %s
+
+char* foo(char *fmt, __builtin_va_list ap)
+{
+ return __builtin_va_arg((ap), char *);
+}
OpenPOWER on IntegriCloud