summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-08-20 22:17:17 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-08-20 22:17:17 +0000
commit1be92d297aa69ba19fe3b06c9632b73de0ce53c2 (patch)
treea42b9702d2ddaab71ac77ffa276bd276c62c2cce
parent002ad1274b1f7b61b69b32e66feb9d40e86c0dc6 (diff)
downloadbcm5719-llvm-1be92d297aa69ba19fe3b06c9632b73de0ce53c2.tar.gz
bcm5719-llvm-1be92d297aa69ba19fe3b06c9632b73de0ce53c2.zip
Fix a regression from my fix to PR2631. Fixes PR2692.
llvm-svn: 55083
-rw-r--r--clang/lib/Sema/SemaExpr.cpp2
-rw-r--r--clang/test/Sema/va_arg_x86_64.c10
2 files changed, 12 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 4781ffb5782..2bb3983acf8 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -2613,6 +2613,8 @@ Sema::ExprResult Sema::ActOnVAArg(SourceLocation BuiltinLoc,
// a pointer for va_arg.
if (VaListType->isArrayType())
VaListType = Context.getArrayDecayedType(VaListType);
+ // Make sure the input expression also decays appropriately.
+ UsualUnaryConversions(E);
if (CheckAssignmentConstraints(VaListType, E->getType()) != Compatible)
return Diag(E->getLocStart(),
diff --git a/clang/test/Sema/va_arg_x86_64.c b/clang/test/Sema/va_arg_x86_64.c
index 86511349c39..3e51b8628c3 100644
--- a/clang/test/Sema/va_arg_x86_64.c
+++ b/clang/test/Sema/va_arg_x86_64.c
@@ -1,6 +1,16 @@
// RUN: clang -fsyntax-only -verify -triple=x86_64-unknown-freebsd7.0 %s
+// PR2631
char* foo(char *fmt, __builtin_va_list ap)
{
return __builtin_va_arg((ap), char *);
}
+
+// PR2692
+typedef __builtin_va_list va_list;
+static char *f (char * (*g) (char **, int), char **p, ...) {
+ char *s;
+ va_list v;
+ s = g (p, __builtin_va_arg(v, int));
+}
+
OpenPOWER on IntegriCloud