summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Klimek <klimek@google.com>2014-05-05 18:21:06 +0000
committerManuel Klimek <klimek@google.com>2014-05-05 18:21:06 +0000
commit75f34c1386f6ee8e3d28f6c3f30b83d2bb7f6584 (patch)
treed239a9c93f0f2560a62baf3a383909c192f37c83
parente37f33c46607d119446ff2d8c891f5e422c27fa8 (diff)
downloadbcm5719-llvm-75f34c1386f6ee8e3d28f6c3f30b83d2bb7f6584.tar.gz
bcm5719-llvm-75f34c1386f6ee8e3d28f6c3f30b83d2bb7f6584.zip
Fix handling of condition variables in the face of temp dtors.
The assignment needs to be before the destruction of the temporary. This patch calls out to addStmt, which invokes VisitDeclStmt, which has all the correct logic for handling temporaries. llvm-svn: 207985
-rw-r--r--clang/lib/Analysis/CFG.cpp13
-rw-r--r--clang/test/Analysis/temp-obj-dtors-cfg-output.cpp10
2 files changed, 10 insertions, 13 deletions
diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp
index 7c716116eb9..fc0cc2dba82 100644
--- a/clang/lib/Analysis/CFG.cpp
+++ b/clang/lib/Analysis/CFG.cpp
@@ -2107,14 +2107,11 @@ CFGBlock *CFGBuilder::VisitIfStmt(IfStmt *I) {
// blocks will be pointed to be "Block".
CFGBlock *LastBlock = addStmt(I->getCond());
- // Finally, if the IfStmt contains a condition variable, add both the IfStmt
- // and the condition variable initialization to the CFG.
- if (VarDecl *VD = I->getConditionVariable()) {
- if (Expr *Init = VD->getInit()) {
- autoCreateBlock();
- appendStmt(Block, I->getConditionVariableDeclStmt());
- LastBlock = addStmt(Init);
- }
+ // Finally, if the IfStmt contains a condition variable, add it and its
+ // initializer to the CFG.
+ if (const DeclStmt* DS = I->getConditionVariableDeclStmt()) {
+ autoCreateBlock();
+ LastBlock = addStmt(const_cast<DeclStmt *>(DS));
}
return LastBlock;
diff --git a/clang/test/Analysis/temp-obj-dtors-cfg-output.cpp b/clang/test/Analysis/temp-obj-dtors-cfg-output.cpp
index 64f1fa535ad..5fb33d36b85 100644
--- a/clang/test/Analysis/temp-obj-dtors-cfg-output.cpp
+++ b/clang/test/Analysis/temp-obj-dtors-cfg-output.cpp
@@ -611,18 +611,18 @@ int testConsistencyNestedNormalReturn(bool value) {
// CHECK: [B5 (ENTRY)]
// CHECK: Succs (1): B4
// CHECK: [B1]
-// CHECK: 1: [B4.7].~C() (Implicit destructor)
+// CHECK: 1: [B4.6].~C() (Implicit destructor)
// CHECK: Succs (1): B0
// CHECK: [B2]
// CHECK: 1: 0
// CHECK: 2: return [B2.1];
-// CHECK: 3: [B4.7].~C() (Implicit destructor)
+// CHECK: 3: [B4.6].~C() (Implicit destructor)
// CHECK: Preds (1): B4
// CHECK: Succs (1): B0
// CHECK: [B3]
// CHECK: 1: 1
// CHECK: 2: return [B3.1];
-// CHECK: 3: [B4.7].~C() (Implicit destructor)
+// CHECK: 3: [B4.6].~C() (Implicit destructor)
// CHECK: Preds (1): B4
// CHECK: Succs (1): B0
// CHECK: [B4]
@@ -631,8 +631,8 @@ int testConsistencyNestedNormalReturn(bool value) {
// CHECK: 3: [B4.2] (ImplicitCastExpr, NoOp, const struct C)
// CHECK: 4: [B4.3]
// CHECK: 5: [B4.4] (CXXConstructExpr, struct C)
-// CHECK: 6: ~C() (Temporary object destructor)
-// CHECK: 7: C c = C();
+// CHECK: 6: C c = C();
+// CHECK: 7: ~C() (Temporary object destructor)
// CHECK: 8: c
// CHECK: 9: [B4.8].operator bool
// CHECK: 10: [B4.8]
OpenPOWER on IntegriCloud