CFG: Delay creating Dtors for CompoundStmts which end in ReturnStmt
Summary: VisitReturnStmt would create a new block with including Dtors, so the Dtors created in VisitCompoundStmts would be in an unreachable block. Example: struct S { ~S(); }; void f() { S s; return; } void g() { S s; } Before this patch, f has one additional unreachable block containing just the destructor of S. With this patch, both f and g have the same blocks. Reviewers: krememek Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D13973 llvm-svn: 253107
This commit is contained in:
parent
6d048942c5
commit
09a134eca3
|
@ -1942,7 +1942,15 @@ CFGBlock *CFGBuilder::VisitChooseExpr(ChooseExpr *C,
|
|||
|
||||
|
||||
CFGBlock *CFGBuilder::VisitCompoundStmt(CompoundStmt *C) {
|
||||
addLocalScopeAndDtors(C);
|
||||
LocalScope::const_iterator scopeBeginPos = ScopePos;
|
||||
if (BuildOpts.AddImplicitDtors) {
|
||||
addLocalScopeForStmt(C);
|
||||
}
|
||||
if (!C->body_empty() && !isa<ReturnStmt>(*C->body_rbegin())) {
|
||||
// If the body ends with a ReturnStmt, the dtors will be added in VisitReturnStmt
|
||||
addAutomaticObjDtors(ScopePos, scopeBeginPos, C);
|
||||
}
|
||||
|
||||
CFGBlock *LastBlock = Block;
|
||||
|
||||
for (CompoundStmt::reverse_body_iterator I=C->body_rbegin(), E=C->body_rend();
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
// RUN: %clang_cc1 -analyze -analyzer-checker=debug.Stats -verify -Wno-unreachable-code %s
|
||||
|
||||
struct S {
|
||||
~S();
|
||||
};
|
||||
|
||||
// the return at the end of an CompoundStmt does not lead to an unreachable block containing the dtors
|
||||
void test() { // expected-warning-re{{test -> Total CFGBlocks: {{[0-9]+}} | Unreachable CFGBlocks: 0 | Exhausted Block: no | Empty WorkList: yes}}
|
||||
S s;
|
||||
return;
|
||||
}
|
Loading…
Reference in New Issue