]> granicus.if.org Git - clang/commitdiff
Fix handling of condition variables in the face of temp dtors.
authorManuel Klimek <klimek@google.com>
Mon, 5 May 2014 18:21:06 +0000 (18:21 +0000)
committerManuel Klimek <klimek@google.com>
Mon, 5 May 2014 18:21:06 +0000 (18:21 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207985 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFG.cpp
test/Analysis/temp-obj-dtors-cfg-output.cpp

index 7c716116eb9fe661a781b16b83c9bd1b8f77e1ee..fc0cc2dba8289a952aa5764b068835bfb602e7f1 100644 (file)
@@ -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;
index 64f1fa535ad8253179b6d12ce3e6764995e4c475..5fb33d36b8552f833b9175e5e22a00371610a667 100644 (file)
@@ -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]