From: Richard Smith Date: Wed, 27 Jun 2012 20:23:58 +0000 (+0000) Subject: Check for non-POD vararg argument type after default argument promotion, not X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=83ea530f9da1b8ca57773bf53418ce9fc98f46ac;p=clang Check for non-POD vararg argument type after default argument promotion, not before, so we don't incorrectly think arguments of function type are non-POD. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159290 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 2a7a8b9f19..aec941c4c1 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -679,7 +679,7 @@ ExprResult Sema::DefaultVariadicArgumentPromotion(Expr *E, VariadicCallType CT, // Diagnostics regarding non-POD argument types are // emitted along with format string checking in Sema::CheckFunctionCall(). - if (isValidVarArgType(Ty) == VAK_Invalid) { + if (isValidVarArgType(E->getType()) == VAK_Invalid) { // Turn this into a trap. CXXScopeSpec SS; SourceLocation TemplateKWLoc; diff --git a/test/CodeGen/varargs.c b/test/CodeGen/varargs.c index b3dba240b5..b6973d8337 100644 --- a/test/CodeGen/varargs.c +++ b/test/CodeGen/varargs.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm -o - %s +// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s // PR6433 - Don't crash on va_arg(typedef). @@ -9,3 +9,9 @@ void focus_changed_cb () { mfloat = __builtin_va_arg((pa), gdouble); } +void vararg(int, ...); +void function_as_vararg() { + // CHECK: define {{.*}}function_as_vararg + // CHECK-NOT: llvm.trap + vararg(0, focus_changed_cb); +}