aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Sema/SemaExpr.cpp29
-rw-r--r--test/Sema/implicit-cast.c8
2 files changed, 24 insertions, 13 deletions
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp
index f3381b8148..12897ea291 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -705,6 +705,16 @@ ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
return new CastExpr(castType, castExpr, LParenLoc);
}
+// promoteExprToType - a helper function to ensure we create exactly one
+// ImplicitCastExpr.
+static void promoteExprToType(Expr *&expr, QualType type) {
+ if (ImplicitCastExpr *impCast = dyn_cast<ImplicitCastExpr>(expr))
+ impCast->setType(type);
+ else
+ expr = new ImplicitCastExpr(type, expr);
+ return;
+}
+
inline QualType Sema::CheckConditionalOperands( // C99 6.5.15
Expr *&cond, Expr *&lex, Expr *&rex, SourceLocation questionLoc) {
UsualUnaryConversions(cond);
@@ -738,11 +748,14 @@ inline QualType Sema::CheckConditionalOperands( // C99 6.5.15
}
}
// C99 6.5.15p3
- if (lexT->isPointerType() && rex->isNullPointerConstant(Context))
+ if (lexT->isPointerType() && rex->isNullPointerConstant(Context)) {
+ promoteExprToType(rex, lexT); // promote the null to a pointer.
return lexT;
- if (rexT->isPointerType() && lex->isNullPointerConstant(Context))
+ }
+ if (rexT->isPointerType() && lex->isNullPointerConstant(Context)) {
+ promoteExprToType(lex, rexT); // promote the null to a pointer.
return rexT;
-
+ }
if (const PointerType *LHSPT = lexT->getAsPointerType()) { // C99 6.5.15p3,6
if (const PointerType *RHSPT = rexT->getAsPointerType()) {
// get the "pointed to" types
@@ -797,16 +810,6 @@ Action::ExprResult Sema::ActOnConditionalOp(SourceLocation QuestionLoc,
return new ConditionalOperator(CondExpr, LHSExpr, RHSExpr, result);
}
-// promoteExprToType - a helper function to ensure we create exactly one
-// ImplicitCastExpr. As a convenience (to the caller), we return the type.
-static void promoteExprToType(Expr *&expr, QualType type) {
- if (ImplicitCastExpr *impCast = dyn_cast<ImplicitCastExpr>(expr))
- impCast->setType(type);
- else
- expr = new ImplicitCastExpr(type, expr);
- return;
-}
-
/// DefaultArgumentPromotion (C99 6.5.2.2p6). Used for function calls that
/// do not have a prototype. Integer promotions are performed on each
/// argument, and arguments that have type float are promoted to double.
diff --git a/test/Sema/implicit-cast.c b/test/Sema/implicit-cast.c
new file mode 100644
index 0000000000..fe83bd93e3
--- /dev/null
+++ b/test/Sema/implicit-cast.c
@@ -0,0 +1,8 @@
+// RUN: clang -fsyntax-only %s
+
+static char *test1(int cf) {
+ return cf ? "abc" : 0;
+}
+static char *test2(int cf) {
+ return cf ? 0 : "abc";
+}