aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Swiderski <marcin.sfider@gmail.com>2010-10-24 08:21:40 +0000
committerMarcin Swiderski <marcin.sfider@gmail.com>2010-10-24 08:21:40 +0000
commite1667190dff025936a21e5eb43889ac93b570468 (patch)
treef845d66de93d75a88753e2f21259b86d622c957a
parentcd1af3d68b00aa729e382fe2cde186f237630804 (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.cpp16
-rw-r--r--test/Sema/warn-unreachable.c8
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: