aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-01-30 17:02:03 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-01-30 17:02:03 +0000
commitb1284ace14b7eb3cc206a3285e743861ab1a4773 (patch)
treece24ad0d3a73a3fd4a548477dbfe117143f3f895
parent01e3c9e06db9ba5729272879c2c9c4659354e707 (diff)
Fix codegen for conditionals with incommpatible pointer types. Code
that causes this isn't really correct, but if we're going to accept this, it should come up with a consistent AST. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46557 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Sema/SemaExpr.cpp8
-rw-r--r--test/CodeGen/conditional.c4
2 files changed, 11 insertions, 1 deletions
diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp
index a1cdb22566..bb4cb519f0 100644
--- a/Sema/SemaExpr.cpp
+++ b/Sema/SemaExpr.cpp
@@ -823,7 +823,13 @@ inline QualType Sema::CheckConditionalOperands( // C99 6.5.15
Diag(questionLoc, diag::ext_typecheck_cond_incompatible_pointers,
lexT.getAsString(), rexT.getAsString(),
lex->getSourceRange(), rex->getSourceRange());
- return lexT; // FIXME: this is an _ext - is this return o.k?
+ // In this situation, we assume void* type. No especially good
+ // reason, but this is what gcc does, and we do have to pick
+ // to get a consistent AST.
+ QualType voidPtrTy = Context.getPointerType(Context.VoidTy);
+ ImpCastExprToType(lex, voidPtrTy);
+ ImpCastExprToType(rex, voidPtrTy);
+ return voidPtrTy;
}
// The pointer types are compatible.
// C99 6.5.15p6: If both operands are pointers to compatible types *or* to
diff --git a/test/CodeGen/conditional.c b/test/CodeGen/conditional.c
index 15359e0c8a..24a5aca577 100644
--- a/test/CodeGen/conditional.c
+++ b/test/CodeGen/conditional.c
@@ -15,3 +15,7 @@ void test3(){
1 ? f() : (void)0;
}
+void test4() {
+int i; short j;
+float* k = 1 ? &i : &j;
+}