From: Anders Carlsson Date: Thu, 4 Feb 2010 17:26:01 +0000 (+0000) Subject: Fix a bug where we would not mark temporaries as conditional when emitting a conditio... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c1b32f69687ed289fb1150df34965ada250caf70;p=clang Fix a bug where we would not mark temporaries as conditional when emitting a conditional operator as an lvalue. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95311 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 2ceefae0a0..563db0b2be 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -1538,9 +1538,12 @@ CodeGenFunction::EmitConditionalOperatorLValue(const ConditionalOperator* E) { EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock); + // Any temporaries created here are conditional. + BeginConditionalBranch(); EmitBlock(LHSBlock); - LValue LHS = EmitLValue(E->getLHS()); + EndConditionalBranch(); + if (!LHS.isSimple()) return EmitUnsupportedLValue(E, "conditional operator"); @@ -1548,8 +1551,11 @@ CodeGenFunction::EmitConditionalOperatorLValue(const ConditionalOperator* E) { Builder.CreateStore(LHS.getAddress(), Temp); EmitBranch(ContBlock); + // Any temporaries created here are conditional. + BeginConditionalBranch(); EmitBlock(RHSBlock); LValue RHS = EmitLValue(E->getRHS()); + EndConditionalBranch(); if (!RHS.isSimple()) return EmitUnsupportedLValue(E, "conditional operator"); diff --git a/test/CodeGenCXX/conditional-temporaries.cpp b/test/CodeGenCXX/conditional-temporaries.cpp index 66fd803c2e..b8ea5129d4 100644 --- a/test/CodeGenCXX/conditional-temporaries.cpp +++ b/test/CodeGenCXX/conditional-temporaries.cpp @@ -9,14 +9,20 @@ struct A { A() : i(0) { ctorcalls++; } ~A() { dtorcalls++; } int i; + + friend const A& operator<<(const A& a, int n) { + return a; + } }; void g(int) { } +void g(const A&) { } void f1(bool b) { g(b ? A().i : 0); g(b || A().i); g(b && A().i); + g(b ? A() << 1 : A() << 2); } struct Checker {