From: Chris Lattner Date: Mon, 29 Sep 2008 22:28:25 +0000 (+0000) Subject: Fix va_arg handling to do argument decaying at the correct place. This X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f77d545fe923d4c465fb07476254798135a8ed25;p=clang Fix va_arg handling to do argument decaying at the correct place. This fixes problems handling references of va_list, which happens on x86_64. This fixes PR2841 and rdar://6252231 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56809 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Builtins.cpp b/lib/AST/Builtins.cpp index 31e099af4e..3980d20521 100644 --- a/lib/AST/Builtins.cpp +++ b/lib/AST/Builtins.cpp @@ -137,9 +137,6 @@ static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context, case 'a': Type = Context.getBuiltinVaListType(); assert(!Type.isNull() && "builtin va list type not initialized!"); - // Do array -> pointer decay. The builtin should use the decayed type. - if (Type->isArrayType()) - Type = Context.getArrayDecayedType(Type); break; case 'V': { char *End; @@ -185,8 +182,15 @@ QualType Builtin::Context::GetBuiltinType(unsigned id, llvm::SmallVector ArgTypes; QualType ResType = DecodeTypeFromStr(TypeStr, Context); - while (TypeStr[0] && TypeStr[0] != '.') - ArgTypes.push_back(DecodeTypeFromStr(TypeStr, Context)); + while (TypeStr[0] && TypeStr[0] != '.') { + QualType Ty = DecodeTypeFromStr(TypeStr, Context); + + // Do array -> pointer decay. The builtin should use the decayed type. + if (Ty->isArrayType()) + Ty = Context.getArrayDecayedType(Ty); + + ArgTypes.push_back(Ty); + } assert((TypeStr[0] != '.' || TypeStr[1] == 0) && "'.' should only occur at end of builtin type list!"); diff --git a/test/Sema/varargs.c b/test/Sema/varargs.c index f52921c5fc..90568e0298 100644 --- a/test/Sema/varargs.c +++ b/test/Sema/varargs.c @@ -1,4 +1,5 @@ -// RUN: clang -fsyntax-only -verify %s +// RUN: clang -fsyntax-only -verify %s && +// RUN: clang -fsyntax-only -verify %s -triple x86_64-apple-darwin9 void f1(int a) {