summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-06-27 22:48:56 +0000
committerChris Lattner <sabre@nondot.org>2008-06-27 22:48:56 +0000
commite6c693d9322c5b4077f9a246535d535693b694b8 (patch)
tree2b870157376c9c10023bd554be17d31b5382410b /clang
parentacbc2d200ded5d9d0fbf09b802bad43b15d886ca (diff)
downloadbcm5719-llvm-e6c693d9322c5b4077f9a246535d535693b694b8.tar.gz
bcm5719-llvm-e6c693d9322c5b4077f9a246535d535693b694b8.zip
Fix a bug where we didn't promote 'const float' (or typedefs) to
double in some places. llvm-svn: 52846
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaExpr.cpp10
-rw-r--r--clang/test/CodeGen/exprs.c7
2 files changed, 12 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index e84971062ed..70899190839 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -1045,10 +1045,12 @@ void Sema::DefaultArgumentPromotion(Expr *&Expr) {
QualType Ty = Expr->getType();
assert(!Ty.isNull() && "DefaultArgumentPromotion - missing type");
- if (Ty == Context.FloatTy)
- ImpCastExprToType(Expr, Context.DoubleTy);
- else
- UsualUnaryConversions(Expr);
+ // If this is a 'float' (CVR qualified or typedef) promote to double.
+ if (const BuiltinType *BT = Ty->getAsBuiltinType())
+ if (BT->getKind() == BuiltinType::Float)
+ return ImpCastExprToType(Expr, Context.DoubleTy);
+
+ UsualUnaryConversions(Expr);
}
/// DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
diff --git a/clang/test/CodeGen/exprs.c b/clang/test/CodeGen/exprs.c
index b4384ee0c2a..f1c9a5d73fa 100644
--- a/clang/test/CodeGen/exprs.c
+++ b/clang/test/CodeGen/exprs.c
@@ -1,4 +1,4 @@
-// RUN: clang %s -emit-llvm
+// RUN: clang %s -emit-llvm -o -
// PR1895
// sizeof function
@@ -34,3 +34,8 @@ void test4() {
t2 = __alignof__(test4());
}
+// 'const float' promotes to double in varargs.
+int test5(const float x, float float_number) {
+ return __builtin_isless(x, float_number);
+}
+
OpenPOWER on IntegriCloud