From: John McCall Date: Mon, 6 Dec 2010 18:36:11 +0000 (+0000) Subject: Do unary conversions on vararg arguments and *then* special-case float. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=40c2913cef2c211f1fe720ffef83fdb3e4d0fabf;p=clang Do unary conversions on vararg arguments and *then* special-case float. Fixes PR8742. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@121022 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 8eed9b10e0..bc8a7527c8 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -345,12 +345,11 @@ void Sema::DefaultArgumentPromotion(Expr *&Expr) { QualType Ty = Expr->getType(); assert(!Ty.isNull() && "DefaultArgumentPromotion - missing type"); + UsualUnaryConversions(Expr); + // If this is a 'float' (CVR qualified or typedef) promote to double. if (Ty->isSpecificBuiltinType(BuiltinType::Float)) - return ImpCastExprToType(Expr, Context.DoubleTy, - CK_FloatingCast); - - UsualUnaryConversions(Expr); + return ImpCastExprToType(Expr, Context.DoubleTy, CK_FloatingCast); } /// DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but diff --git a/test/CodeGenObjC/property.m b/test/CodeGenObjC/property.m index fe8737e917..dd0786eb30 100644 --- a/test/CodeGenObjC/property.m +++ b/test/CodeGenObjC/property.m @@ -89,3 +89,17 @@ void test3(test3_object *p) { struct test3_struct array[1] = { p.s }; struct test3_nested agg = { p.s }; } + +// PR8742 +@interface Test4 {} +@property float f; +@end +// CHECK: define void @test4 +void test4(Test4 *t) { + extern int test4_printf(const char *, ...); + // CHECK: [[TMP:%.*]] = call float {{.*}} @objc_msgSend + // CHECK-NEXT: [[EXT:%.*]] = fpext float [[TMP]] to double + // CHECK-NEXT: call i32 (i8*, ...)* @test4_printf(i8* {{.*}}, double [[EXT]]) + // CHECK-NEXT: ret void + test4_printf("%.2f", t.f); +}