From fdea112f9cca521ca1d92820cfb12109d63def04 Mon Sep 17 00:00:00 2001 From: Manuel Klimek Date: Mon, 5 May 2014 18:21:06 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207985 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/CFG.cpp | 13 +++++-------- test/Analysis/temp-obj-dtors-cfg-output.cpp | 10 +++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 7c716116eb..fc0cc2dba8 100644 --- a/lib/Analysis/CFG.cpp +++ b/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(DS)); } return LastBlock; diff --git a/test/Analysis/temp-obj-dtors-cfg-output.cpp b/test/Analysis/temp-obj-dtors-cfg-output.cpp index 64f1fa535a..5fb33d36b8 100644 --- a/test/Analysis/temp-obj-dtors-cfg-output.cpp +++ b/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] -- 2.40.0