From: Marcin Swiderski Date: Sun, 24 Oct 2010 08:21:40 +0000 (+0000) Subject: - Fixed subexpressions evaluation order for binary operators to match order in code... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e1667190dff025936a21e5eb43889ac93b570468;p=clang - Fixed subexpressions evaluation order for binary operators to match order in code generated with the compiler, - Fixed test cases for unreachable code warnings produced by Sema. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117220 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index e44f0fc90b..6f7be9a252 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -912,15 +912,17 @@ CFGBlock *CFGBuilder::VisitBinaryOperator(BinaryOperator *B, AppendStmt(Block, B, asc); } - // If visiting RHS causes us to finish 'Block' and the LHS doesn't - // create a new block, then we should return RBlock. Otherwise - // we'll incorrectly return NULL. - CFGBlock *RBlock = Visit(B->getRHS()); - CFGBlock *LBlock = Visit(B->getLHS(), AddStmtChoice::AsLValueNotAlwaysAdd); - return LBlock ? LBlock : RBlock; + Visit(B->getLHS(), AddStmtChoice::AsLValueNotAlwaysAdd); + return Visit(B->getRHS()); } - return VisitStmt(B, asc); + if (asc.alwaysAdd()) { + autoCreateBlock(); + AppendStmt(Block, B, asc); + } + + Visit(B->getRHS()); + return Visit(B->getLHS()); } CFGBlock *CFGBuilder::VisitBlockExpr(BlockExpr *E, AddStmtChoice asc) { diff --git a/test/Sema/warn-unreachable.c b/test/Sema/warn-unreachable.c index 17a2c7c9a6..20e0c31724 100644 --- a/test/Sema/warn-unreachable.c +++ b/test/Sema/warn-unreachable.c @@ -35,8 +35,8 @@ void test2() { dead(); // expected-warning {{will never be executed}} case 3: - live() // expected-warning {{will never be executed}} - + + live() + + // expected-warning {{will never be executed}} halt(); dead(); @@ -75,8 +75,8 @@ void test2() { goto c6; case 7: halt() - + // expected-warning {{will never be executed}} - dead(); + + + dead(); // expected-warning {{will never be executed}} - // expected-warning {{will never be executed}} halt(); case 8: