aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2007-12-21 19:49:00 +0000
committerTed Kremenek <kremenek@apple.com>2007-12-21 19:49:00 +0000
commitafe54333a744f6d72d78f13fa20541328d6d9704 (patch)
tree8ed9087a9d21b5ab6d0fd719ddb5f6cf9f13061d
parent3c40085b373d8e6e4523812e06f73a0cb9d5142c (diff)
Fixed successor order for CFG basic blocks when handling: x && y. The bug
is best explained by illustration: [ B2 ] 1: x T: [B2.1] && ... Predecessors (1): B4 Successors (2): B3 B1 Block "B3" should be the block where we evaluate "y" when "x" evaluates to true. Previously we had the successor list reversed. Now this behavior matches with how we handle other conditional branches. Thanks to Nuno Lopes for reporting this problem. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45288 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--AST/CFG.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/AST/CFG.cpp b/AST/CFG.cpp
index 1546079c92..93230744e6 100644
--- a/AST/CFG.cpp
+++ b/AST/CFG.cpp
@@ -340,14 +340,23 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* S, bool AlwaysAddStmt = false) {
// create the block evaluating the LHS
CFGBlock* LHSBlock = createBlock(false);
- LHSBlock->addSuccessor(ConfluenceBlock);
- LHSBlock->setTerminator(B);
+ LHSBlock->setTerminator(B);
// create the block evaluating the RHS
Succ = ConfluenceBlock;
Block = NULL;
CFGBlock* RHSBlock = Visit(B->getRHS());
- LHSBlock->addSuccessor(RHSBlock);
+
+ // Now link the LHSBlock with RHSBlock.
+ if (B->getOpcode() == BinaryOperator::LOr) {
+ LHSBlock->addSuccessor(ConfluenceBlock);
+ LHSBlock->addSuccessor(RHSBlock);
+ }
+ else {
+ assert (B->getOpcode() == BinaryOperator::LAnd);
+ LHSBlock->addSuccessor(RHSBlock);
+ LHSBlock->addSuccessor(ConfluenceBlock);
+ }
// Generate the blocks for evaluating the LHS.
Block = LHSBlock;