diff options
author | Marcin Swiderski <marcin.sfider@gmail.com> | 2010-10-24 08:21:40 +0000 |
---|---|---|
committer | Marcin Swiderski <marcin.sfider@gmail.com> | 2010-10-24 08:21:40 +0000 |
commit | e1667190dff025936a21e5eb43889ac93b570468 (patch) | |
tree | f845d66de93d75a88753e2f21259b86d622c957a | |
parent | cd1af3d68b00aa729e382fe2cde186f237630804 (diff) |
- 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
-rw-r--r-- | lib/Analysis/CFG.cpp | 16 | ||||
-rw-r--r-- | test/Sema/warn-unreachable.c | 8 |
2 files changed, 13 insertions, 11 deletions
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: |