diff options
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 12 | ||||
-rw-r--r-- | clang/test/Sema/variadic-promotion.c | 13 |
2 files changed, 21 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index fd165aca89e..5998fc9a028 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -581,8 +581,9 @@ ExprResult Sema::UsualUnaryConversions(Expr *E) { } /// DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that -/// do not have a prototype. Arguments that have type float are promoted to -/// double. All other argument types are converted by UsualUnaryConversions(). +/// do not have a prototype. Arguments that have type float or __fp16 +/// are promoted to double. All other argument types are converted by +/// UsualUnaryConversions(). ExprResult Sema::DefaultArgumentPromotion(Expr *E) { QualType Ty = E->getType(); assert(!Ty.isNull() && "DefaultArgumentPromotion - missing type"); @@ -592,8 +593,11 @@ ExprResult Sema::DefaultArgumentPromotion(Expr *E) { return Owned(E); E = Res.take(); - // If this is a 'float' (CVR qualified or typedef) promote to double. - if (Ty->isSpecificBuiltinType(BuiltinType::Float)) + // If this is a 'float' or '__fp16' (CVR qualified or typedef) promote to + // double. + const BuiltinType *BTy = Ty->getAs<BuiltinType>(); + if (BTy && (BTy->getKind() == BuiltinType::Half || + BTy->getKind() == BuiltinType::Float)) E = ImpCastExprToType(E, Context.DoubleTy, CK_FloatingCast).take(); // C++ performs lvalue-to-rvalue conversion as a default argument diff --git a/clang/test/Sema/variadic-promotion.c b/clang/test/Sema/variadic-promotion.c new file mode 100644 index 00000000000..b2487744305 --- /dev/null +++ b/clang/test/Sema/variadic-promotion.c @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -ast-dump %s | FileCheck %s + +void variadic(int, ...); + +void test_floating_promotion(__fp16 *f16, float f32, double f64) { + variadic(3, *f16, f32, f64); + +// CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast> +// CHECK-NEXT: 'half' + +// CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast> +// CHECK-NEXT: 'float' +} |