diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2008-08-20 22:17:17 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2008-08-20 22:17:17 +0000 |
commit | 1be92d297aa69ba19fe3b06c9632b73de0ce53c2 (patch) | |
tree | a42b9702d2ddaab71ac77ffa276bd276c62c2cce | |
parent | 002ad1274b1f7b61b69b32e66feb9d40e86c0dc6 (diff) | |
download | bcm5719-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.cpp | 2 | ||||
-rw-r--r-- | clang/test/Sema/va_arg_x86_64.c | 10 |
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)); +} + |