]> granicus.if.org Git - clang/commitdiff
Fix rdar://6252231 - cannot call vsnprintf with va_list on x86_64,
authorChris Lattner <sabre@nondot.org>
Sun, 28 Sep 2008 06:05:35 +0000 (06:05 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 28 Sep 2008 06:05:35 +0000 (06:05 +0000)
by decaying __builtin_va_list's type when forming builtins.  On
x86-64 (and other targets) __builtin_va_list is a typedef for
an array.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@56768 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Builtins.cpp
test/Sema/builtin-object-size.c

index 8249c4119d60d639c44fa3dc482958dc36c6e331..31e099af4ee5ba5fb8e4ed31a8806cf70fcd60e8 100644 (file)
@@ -137,6 +137,9 @@ 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;
index abc25da1a3242e543e76dc7f3c3436ec11aebfae..fc322ad4e3486860e6dd9fcf1560f4986803cb72 100644 (file)
@@ -1,4 +1,5 @@
 // RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -triple x86_64-apple-darwin9 -verify %s
 
 int a[10];
 
@@ -17,3 +18,11 @@ int f2() {
 int f3() {
   return __builtin_object_size(&a, 4); // expected-error {{argument should be a value from 0 to 3}}
 }
+
+
+// rdar://6252231 - cannot call vsnprintf with va_list on x86_64
+void f4(const char *fmt, ...) {
+ __builtin_va_list args;
+ __builtin___vsnprintf_chk (0, 42, 0, 11, fmt, args);
+}
+