From: Eli Friedman Date: Sat, 9 Aug 2008 23:32:40 +0000 (+0000) Subject: Fix for PR2631; make va_arg work correctly on x86-64. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c34bcde8d2aa7430cb2f3abb003d9248842748b8;p=clang 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 2982c45865..003f3dea59 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/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/test/Sema/va_arg_x86_64.c b/test/Sema/va_arg_x86_64.c new file mode 100644 index 0000000000..86511349c3 --- /dev/null +++ b/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 *); +}