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

llvm-svn: 54600
This commit is contained in:
Eli Friedman 2008-08-09 23:32:40 +00:00
parent 53c362e34e
commit 121ba0c4d3
2 changed files with 16 additions and 3 deletions

View File

@ -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(),

View File

@ -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 *);
}