From: Eli Friedman Date: Thu, 8 Dec 2011 22:01:56 +0000 (+0000) Subject: Fix an edge case in IRGen for conditionals. PR11509. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1e4f68ce0bffd9a6b9a8fc56d1766177382788e3;p=clang Fix an edge case in IRGen for conditionals. PR11509. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@146189 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprScalar.cpp b/lib/CodeGen/CGExprScalar.cpp index 3fc5c7b015..d556cdfd46 100644 --- a/lib/CodeGen/CGExprScalar.cpp +++ b/lib/CodeGen/CGExprScalar.cpp @@ -2566,6 +2566,11 @@ VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) { llvm::Value *CondV = CGF.EvaluateExprAsBool(condExpr); llvm::Value *LHS = Visit(lhsExpr); llvm::Value *RHS = Visit(rhsExpr); + if (!LHS) { + // If the conditional has void type, make sure we return a null Value*. + assert(!RHS && "LHS and RHS types must match"); + return 0; + } return Builder.CreateSelect(CondV, LHS, RHS, "cond"); } diff --git a/test/CodeGen/conditional.c b/test/CodeGen/conditional.c index 15e15f11e3..88538a2042 100644 --- a/test/CodeGen/conditional.c +++ b/test/CodeGen/conditional.c @@ -66,3 +66,9 @@ int test11(int c) { double test12(int c) { return c ? 4.0 : 2.0; } +// CHECK: @test13 +// CHECK: call {{.*}} @f2( +int f2(void); +void test13() { + f2() ? (void)0 : (void)0; +}