diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-11-01 06:46:05 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-11-01 06:46:05 +0000 |
commit | 0b51d4db8c4c22640652d6880bbb9567b0eef0b2 (patch) | |
tree | 9687663ddb15a4ba3c6615c2cf2d352c262756c8 | |
parent | 2623343625c01455765dee46ea6e2c29ddb578ac (diff) | |
download | bcm5719-llvm-0b51d4db8c4c22640652d6880bbb9567b0eef0b2.tar.gz bcm5719-llvm-0b51d4db8c4c22640652d6880bbb9567b0eef0b2.zip |
Make all CXXConstructExpr's block-level expressions. This is required by
method inlining. Temporarily fail a test case.
llvm-svn: 117907
-rw-r--r-- | clang/lib/Analysis/CFG.cpp | 29 | ||||
-rw-r--r-- | clang/test/Analysis/auto-obj-dtors-cfg-output.cpp | 1295 | ||||
-rw-r--r-- | clang/test/Analysis/initializers-cfg-output.cpp | 91 | ||||
-rw-r--r-- | clang/test/Analysis/method-call.cpp | 1 |
4 files changed, 749 insertions, 667 deletions
diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index 527d0eb870e..1ae4e207cd9 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -260,6 +260,9 @@ private: CFGBlock *VisitCXXCatchStmt(CXXCatchStmt *S); CFGBlock *VisitCXXThrowExpr(CXXThrowExpr *T); CFGBlock *VisitCXXTryStmt(CXXTryStmt *S); + CFGBlock *VisitCXXConstructExpr(CXXConstructExpr *C, AddStmtChoice asc); + CFGBlock *VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *C, + AddStmtChoice asc); CFGBlock *VisitCXXMemberCallExpr(CXXMemberCallExpr *C, AddStmtChoice asc); CFGBlock *VisitCallExpr(CallExpr *C, AddStmtChoice asc); CFGBlock *VisitCaseStmt(CaseStmt *C); @@ -761,6 +764,12 @@ tryAgain: return Visit(cast<CXXExprWithTemporaries>(S)->getSubExpr(), asc); } + case Stmt::CXXConstructExprClass: + return VisitCXXConstructExpr(cast<CXXConstructExpr>(S), asc); + + case Stmt::CXXTemporaryObjectExprClass: + return VisitCXXTemporaryObjectExpr(cast<CXXTemporaryObjectExpr>(S), asc); + case Stmt::CXXMemberCallExprClass: return VisitCXXMemberCallExpr(cast<CXXMemberCallExpr>(S), asc); @@ -2282,6 +2291,24 @@ CFGBlock* CFGBuilder::VisitCXXCatchStmt(CXXCatchStmt* CS) { return CatchBlock; } +CFGBlock *CFGBuilder::VisitCXXConstructExpr(CXXConstructExpr *C, + AddStmtChoice asc) { + AddStmtChoice::Kind K = asc.asLValue() ? AddStmtChoice::AlwaysAddAsLValue + : AddStmtChoice::AlwaysAdd; + autoCreateBlock(); + AppendStmt(Block, C, AddStmtChoice(K)); + return VisitChildren(C); +} + +CFGBlock *CFGBuilder::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *C, + AddStmtChoice asc) { + AddStmtChoice::Kind K = asc.asLValue() ? AddStmtChoice::AlwaysAddAsLValue + : AddStmtChoice::AlwaysAdd; + autoCreateBlock(); + AppendStmt(Block, C, AddStmtChoice(K)); + return VisitChildren(C); +} + CFGBlock *CFGBuilder::VisitCXXMemberCallExpr(CXXMemberCallExpr *C, AddStmtChoice asc) { AddStmtChoice::Kind K = asc.asLValue() ? AddStmtChoice::AlwaysAddAsLValue @@ -2751,7 +2778,7 @@ static void print_elem(llvm::raw_ostream &OS, StmtPrinterHelper* Helper, OS << ".~" << T->getAsCXXRecordDecl()->getName() << "()"; OS << " (Member object destructor)\n"; } - } +} static void print_block(llvm::raw_ostream& OS, const CFG* cfg, const CFGBlock& B, diff --git a/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp b/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp index 129a0c2616e..8185d25563b 100644 --- a/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp +++ b/clang/test/Analysis/auto-obj-dtors-cfg-output.cpp @@ -155,632 +155,681 @@ void test_catch_copy() { } } -// CHECK: [ B2 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B1 -// CHECK: [ B1 ] -// CHECK: 1: A a; -// CHECK: 2: const A &b = a; -// CHECK: 3: const A &c = A(); -// CHECK: 4: [B1.3].~A() (Implicit destructor) -// CHECK: 5: [B1.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B2 -// CHECK: Successors (1): B0 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B2 (ENTRY) ] +// CHECK: [ B2 (ENTRY) ] // CHECK: Predecessors (0): // CHECK: Successors (1): B1 -// CHECK: [ B1 ] -// CHECK: 1: A a[2]; -// CHECK: 2: A b[0]; -// CHECK: 3: [B1.1].~A() (Implicit destructor) +// CHECK: [ B1 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: const A &b = a; +// CHECK: 4: A() +// CHECK: 5: const A &c = A(); +// CHECK: 6: [B1.5].~A() (Implicit destructor) +// CHECK: 7: [B1.2].~A() (Implicit destructor) // CHECK: Predecessors (1): B2 // CHECK: Successors (1): B0 -// CHECK: [ B0 (EXIT) ] +// CHECK: [ B0 (EXIT) ] // CHECK: Predecessors (1): B1 // CHECK: Successors (0): -// CHECK: [ B2 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B1 -// CHECK: [ B1 ] -// CHECK: 1: A a; -// CHECK: 2: A c; -// CHECK: 3: A d; -// CHECK: 4: [B1.3].~A() (Implicit destructor) -// CHECK: 5: [B1.2].~A() (Implicit destructor) -// CHECK: 6: A b; -// CHECK: 7: [B1.6].~A() (Implicit destructor) -// CHECK: 8: [B1.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B2 -// CHECK: Successors (1): B0 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B4 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B3 -// CHECK: [ B1 ] -// CHECK: 1: A c; -// CHECK: 2: [B1.1].~A() (Implicit destructor) -// CHECK: 3: [B3.2].~A() (Implicit destructor) -// CHECK: 4: [B3.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B3 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: return; -// CHECK: 2: [B3.2].~A() (Implicit destructor) -// CHECK: 3: [B3.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B3 -// CHECK: Successors (1): B0 -// CHECK: [ B3 ] -// CHECK: 1: A a; -// CHECK: 2: A b; -// CHECK: 3: UV -// CHECK: T: if [B3.3] -// CHECK: Predecessors (1): B4 -// CHECK: Successors (2): B2 B1 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (2): B1 B2 -// CHECK: Successors (0): -// CHECK: [ B8 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B7 -// CHECK: [ B1 ] -// CHECK: l1: -// CHECK: 1: A c; -// CHECK: 2: [B1.1].~A() (Implicit destructor) -// CHECK: 3: [B6.1].~A() (Implicit destructor) -// CHECK: 4: [B7.1].~A() (Implicit destructor) -// CHECK: Predecessors (2): B2 B3 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: A b; -// CHECK: 2: [B2.1].~A() (Implicit destructor) -// CHECK: 3: [B6.2].~A() (Implicit destructor) -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B1 -// CHECK: [ B3 ] -// CHECK: 1: [B6.2].~A() (Implicit destructor) -// CHECK: T: goto l1; -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B1 -// CHECK: [ B4 ] -// CHECK: 1: UV -// CHECK: T: if [B4.1] -// CHECK: Predecessors (1): B6 -// CHECK: Successors (2): B3 B2 -// CHECK: [ B5 ] -// CHECK: 1: [B6.2].~A() (Implicit destructor) -// CHECK: 2: [B6.1].~A() (Implicit destructor) -// CHECK: T: goto l0; -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B6 -// CHECK: [ B6 ] -// CHECK: l0: -// CHECK: 1: A b; -// CHECK: 2: A a; -// CHECK: 3: UV -// CHECK: T: if [B6.3] -// CHECK: Predecessors (2): B7 B5 -// CHECK: Successors (2): B5 B4 -// CHECK: [ B7 ] -// CHECK: 1: A a; -// CHECK: Predecessors (1): B8 -// CHECK: Successors (1): B6 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B5 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B4 -// CHECK: [ B1 ] -// CHECK: 1: [B4.3].~A() (Implicit destructor) -// CHECK: 2: [B4.1].~A() (Implicit destructor) -// CHECK: Predecessors (2): B2 B3 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: A c; -// CHECK: 2: [B2.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B1 -// CHECK: [ B3 ] -// CHECK: 1: A c; -// CHECK: 2: [B3.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B1 -// CHECK: [ B4 ] -// CHECK: 1: A a; -// CHECK: 2: a -// CHECK: 3: if ([B4.5]) -// CHECK: [B3.1]else -// CHECK: [B2.1] 4: b.operator int() -// CHECK: 5: [B4.4] -// CHECK: T: if [B4.5] -// CHECK: Predecessors (1): B5 -// CHECK: Successors (2): B3 B2 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B9 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B8 -// CHECK: [ B1 ] -// CHECK: 1: [B8.3].~A() (Implicit destructor) -// CHECK: 2: A e; -// CHECK: 3: [B1.2].~A() (Implicit destructor) -// CHECK: 4: [B8.1].~A() (Implicit destructor) -// CHECK: Predecessors (2): B2 B5 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: A d; -// CHECK: 2: [B2.1].~A() (Implicit destructor) -// CHECK: 3: [B4.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B1 -// CHECK: [ B3 ] -// CHECK: 1: return; -// CHECK: 2: [B4.1].~A() (Implicit destructor) -// CHECK: 3: [B8.3].~A() (Implicit destructor) -// CHECK: 4: [B8.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B0 -// CHECK: [ B4 ] -// CHECK: 1: A c; -// CHECK: 2: UV -// CHECK: T: if [B4.2] -// CHECK: Predecessors (1): B8 -// CHECK: Successors (2): B3 B2 -// CHECK: [ B5 ] -// CHECK: 1: A d; -// CHECK: 2: [B5.1].~A() (Implicit destructor) -// CHECK: 3: [B7.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B7 -// CHECK: Successors (1): B1 -// CHECK: [ B6 ] -// CHECK: 1: return; -// CHECK: 2: [B7.1].~A() (Implicit destructor) -// CHECK: 3: [B8.3].~A() (Implicit destructor) -// CHECK: 4: [B8.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B7 -// CHECK: Successors (1): B0 -// CHECK: [ B7 ] -// CHECK: 1: A c; -// CHECK: 2: UV -// CHECK: T: if [B7.2] -// CHECK: Predecessors (1): B8 -// CHECK: Successors (2): B6 B5 -// CHECK: [ B8 ] -// CHECK: 1: A a; -// CHECK: 2: a -// CHECK: 3: if ([B8.5]) { -// CHECK: [B7.1] if ([B7.2]) -// CHECK: [B6.1][B5.1]} else { -// CHECK: [B4.1] if ([B4.2]) -// CHECK: [B3.1][B2.1]} -// CHECK: 4: b.operator int() -// CHECK: 5: [B8.4] -// CHECK: T: if [B8.5] -// CHECK: Predecessors (1): B9 -// CHECK: Successors (2): B7 B4 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (3): B1 B3 B6 -// CHECK: Successors (0): -// CHECK: [ B6 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B5 -// CHECK: [ B1 ] -// CHECK: 1: [B2.2].~A() (Implicit destructor) -// CHECK: 2: [B5.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B2 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: a -// CHECK: 2: while ([B2.4]) -// CHECK: [B4.1] 3: b.operator int() -// CHECK: 4: [B2.3] -// CHECK: T: while [B2.4] -// CHECK: Predecessors (2): B3 B5 -// CHECK: Successors (2): B4 B1 -// CHECK: [ B3 ] -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B2 -// CHECK: [ B4 ] -// CHECK: 1: A c; -// CHECK: 2: [B4.1].~A() (Implicit destructor) -// CHECK: 3: [B2.2].~A() (Implicit destructor) -// CHECK: Predecessors (1): B2 -// CHECK: Successors (1): B3 -// CHECK: [ B5 ] -// CHECK: 1: A a; -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B2 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B12 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B11 -// CHECK: [ B1 ] -// CHECK: 1: [B2.2].~A() (Implicit destructor) -// CHECK: 2: A e; -// CHECK: 3: [B1.2].~A() (Implicit destructor) -// CHECK: 4: [B11.1].~A() (Implicit destructor) -// CHECK: Predecessors (2): B9 B2 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: a -// CHECK: 2: while ([B2.4]) -// CHECK: { -// CHECK: [B10.1] if ([B10.2]) -// CHECK: break; -// CHECK: if ([B8.1]) -// CHECK: continue; -// CHECK: if ([B6.1]) -// CHECK: [B5.1][B4.1] } -// CHECK: 3: b.operator int() -// CHECK: 4: [B2.3] -// CHECK: T: while [B2.4] -// CHECK: Predecessors (2): B3 B11 -// CHECK: Successors (2): B10 B1 -// CHECK: [ B3 ] -// CHECK: Predecessors (2): B4 B7 -// CHECK: Successors (1): B2 -// CHECK: [ B4 ] -// CHECK: 1: A d; -// CHECK: 2: [B4.1].~A() (Implicit destructor) -// CHECK: 3: [B10.1].~A() (Implicit destructor) -// CHECK: 4: [B2.2].~A() (Implicit destructor) -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B3 -// CHECK: [ B5 ] -// CHECK: 1: return; -// CHECK: 2: [B10.1].~A() (Implicit destructor) -// CHECK: 3: [B2.2].~A() (Implicit destructor) -// CHECK: 4: [B11.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B0 -// CHECK: [ B6 ] -// CHECK: 1: UV -// CHECK: T: if [B6.1] -// CHECK: Predecessors (1): B8 -// CHECK: Successors (2): B5 B4 -// CHECK: [ B7 ] -// CHECK: 1: [B10.1].~A() (Implicit destructor) -// CHECK: 2: [B2.2].~A() (Implicit destructor) -// CHECK: T: continue; -// CHECK: Predecessors (1): B8 -// CHECK: Successors (1): B3 -// CHECK: [ B8 ] -// CHECK: 1: UV -// CHECK: T: if [B8.1] -// CHECK: Predecessors (1): B10 -// CHECK: Successors (2): B7 B6 -// CHECK: [ B9 ] -// CHECK: 1: [B10.1].~A() (Implicit destructor) -// CHECK: T: break; -// CHECK: Predecessors (1): B10 -// CHECK: Successors (1): B1 -// CHECK: [ B10 ] -// CHECK: 1: A c; -// CHECK: 2: UV -// CHECK: T: if [B10.2] -// CHECK: Predecessors (1): B2 -// CHECK: Successors (2): B9 B8 -// CHECK: [ B11 ] -// CHECK: 1: A a; -// CHECK: Predecessors (1): B12 -// CHECK: Successors (1): B2 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (2): B1 B5 -// CHECK: Successors (0): -// CHECK: [ B4 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B2 -// CHECK: [ B1 ] -// CHECK: 1: UV -// CHECK: T: do ... while [B1.1] -// CHECK: Predecessors (1): B2 -// CHECK: Successors (2): B3 B0 -// CHECK: [ B2 ] -// CHECK: 1: A a; -// CHECK: 2: [B2.1].~A() (Implicit destructor) -// CHECK: Predecessors (2): B3 B4 -// CHECK: Successors (1): B1 -// CHECK: [ B3 ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (1): B2 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B12 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B11 -// CHECK: [ B1 ] -// CHECK: 1: A d; -// CHECK: 2: [B1.1].~A() (Implicit destructor) -// CHECK: 3: [B11.1].~A() (Implicit destructor) -// CHECK: Predecessors (2): B8 B2 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: UV -// CHECK: T: do ... while [B2.1] -// CHECK: Predecessors (2): B3 B6 -// CHECK: Successors (2): B10 B1 -// CHECK: [ B3 ] -// CHECK: 1: A c; -// CHECK: 2: [B3.1].~A() (Implicit destructor) -// CHECK: 3: [B9.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B5 -// CHECK: Successors (1): B2 -// CHECK: [ B4 ] -// CHECK: 1: return; -// CHECK: 2: [B9.1].~A() (Implicit destructor) -// CHECK: 3: [B11.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B5 -// CHECK: Successors (1): B0 -// CHECK: [ B5 ] -// CHECK: 1: UV -// CHECK: T: if [B5.1] -// CHECK: Predecessors (1): B7 -// CHECK: Successors (2): B4 B3 -// CHECK: [ B6 ] -// CHECK: 1: [B9.1].~A() (Implicit destructor) -// CHECK: T: continue; -// CHECK: Predecessors (1): B7 -// CHECK: Successors (1): B2 -// CHECK: [ B7 ] -// CHECK: 1: UV -// CHECK: T: if [B7.1] -// CHECK: Predecessors (1): B9 -// CHECK: Successors (2): B6 B5 -// CHECK: [ B8 ] -// CHECK: 1: [B9.1].~A() (Implicit destructor) -// CHECK: T: break; -// CHECK: Predecessors (1): B9 -// CHECK: Successors (1): B1 -// CHECK: [ B9 ] -// CHECK: 1: A b; -// CHECK: 2: UV -// CHECK: T: if [B9.2] -// CHECK: Predecessors (2): B10 B11 -// CHECK: Successors (2): B8 B7 -// CHECK: [ B10 ] -// CHECK: Predecessors (1): B2 -// CHECK: Successors (1): B9 -// CHECK: [ B11 ] -// CHECK: 1: A a; -// CHECK: Predecessors (1): B12 -// CHECK: Successors (1): B9 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (2): B1 B4 -// CHECK: Successors (0): -// CHECK: [ B4 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B2 -// CHECK: [ B1 ] -// CHECK: 1: [B2.3].~A() (Implicit destructor) -// CHECK: 2: [B2.1].~A() (Implicit destructor) -// CHECK: Predecessors (2): B3 B2 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: A a; -// CHECK: 2: a -// CHECK: 3: switch ([B2.4]) -// CHECK: [B3.1] 4: b.operator int() -// CHECK: T: switch [B2.4] -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B1 -// CHECK: [ B3 ] -// CHECK: 1: A c; -// CHECK: 2: [B3.1].~A() (Implicit destructor) -// CHECK: Predecessors (0): -// CHECK: Successors (1): B1 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B9 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B2 -// CHECK: [ B1 ] -// CHECK: 1: [B2.3].~A() (Implicit destructor) -// CHECK: 2: A g; -// CHECK: 3: [B1.2].~A() (Implicit destructor) -// CHECK: 4: [B2.1].~A() (Implicit destructor) -// CHECK: Predecessors (3): B3 B7 B2 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: A a; -// CHECK: 2: a -// CHECK: 3: switch ([B2.4]) { -// CHECK: case 0: -// CHECK: { -// CHECK: [B8.1] if ([B8.2]) -// CHECK: break; -// CHECK: if ([B6.1]) -// CHECK: [B5.1][B4.1] } -// CHECK: case 1: -// CHECK: break; -// CHECK: } -// CHECK: 4: b.operator int() -// CHECK: T: switch [B2.4] -// CHECK: Predecessors (1): B9 -// CHECK: Successors (3): B3 B8 -// CHECK: B1 -// CHECK: [ B3 ] -// CHECK: case 1: -// CHECK: T: break; -// CHECK: Predecessors (2): B2 B4 -// CHECK: Successors (1): B1 -// CHECK: [ B4 ] -// CHECK: 1: A f; -// CHECK: 2: [B4.1].~A() (Implicit destructor) -// CHECK: 3: [B8.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B3 -// CHECK: [ B5 ] -// CHECK: 1: return; -// CHECK: 2: [B8.1].~A() (Implicit destructor) -// CHECK: 3: [B2.3].~A() (Implicit destructor) -// CHECK: 4: [B2.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B0 -// CHECK: [ B6 ] -// CHECK: 1: UV -// CHECK: T: if [B6.1] -// CHECK: Predecessors (1): B8 -// CHECK: Successors (2): B5 B4 -// CHECK: [ B7 ] -// CHECK: 1: [B8.1].~A() (Implicit destructor) -// CHECK: T: break; -// CHECK: Predecessors (1): B8 -// CHECK: Successors (1): B1 -// CHECK: [ B8 ] -// CHECK: case 0: -// CHECK: 1: A c; -// CHECK: 2: UV -// CHECK: T: if [B8.2] -// CHECK: Predecessors (1): B2 -// CHECK: Successors (2): B7 B6 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (2): B1 B5 -// CHECK: Successors (0): -// CHECK: [ B6 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B5 -// CHECK: [ B1 ] -// CHECK: 1: [B2.2].~A() (Implicit destructor) -// CHECK: 2: [B5.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B2 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: a -// CHECK: 2: for (A a; [B2.4];) -// CHECK: [B4.1] 3: b.operator int() -// CHECK: 4: [B2.3] -// CHECK: T: for (...; [B2.4]; ) -// CHECK: Predecessors (2): B3 B5 -// CHECK: Successors (2): B4 B1 -// CHECK: [ B3 ] -// CHECK: 1: [B2.2].~A() (Implicit destructor) -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B2 -// CHECK: [ B4 ] -// CHECK: 1: A c; -// CHECK: 2: [B4.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B2 -// CHECK: Successors (1): B3 -// CHECK: [ B5 ] -// CHECK: 1: A a; -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B2 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B12 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B11 -// CHECK: [ B1 ] -// CHECK: 1: [B2.2].~A() (Implicit destructor) -// CHECK: 2: [B11.2].~A() (Implicit destructor) -// CHECK: 3: A f; -// CHECK: 4: [B1.3].~A() (Implicit destructor) -// CHECK: 5: [B11.1].~A() (Implicit destructor) -// CHECK: Predecessors (2): B9 B2 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: b -// CHECK: 2: for (A b; [B2.4];) { -// CHECK: [B10.1] if ([B10.2]) -// CHECK: break; -// CHECK: if ([B8.1]) -// CHECK: continue; -// CHECK: if ([B6.1]) -// CHECK: [B5.1][B4.1]} -// CHECK: 3: c.operator int() -// CHECK: 4: [B2.3] -// CHECK: T: for (...; [B2.4]; ) -// CHECK: Predecessors (2): B3 B11 -// CHECK: Successors (2): B10 B1 -// CHECK: [ B3 ] -// CHECK: 1: [B2.2].~A() (Implicit destructor) -// CHECK: Predecessors (2): B4 B7 -// CHECK: Successors (1): B2 -// CHECK: [ B4 ] -// CHECK: 1: A e; -// CHECK: 2: [B4.1].~A() (Implicit destructor) -// CHECK: 3: [B10.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B3 -// CHECK: [ B5 ] -// CHECK: 1: return; -// CHECK: 2: [B10.1].~A() (Implicit destructor) -// CHECK: 3: [B2.2].~A() (Implicit destructor) -// CHECK: 4: [B11.2].~A() (Implicit destructor) -// CHECK: 5: [B11.1].~A() (Implicit destructor) -// CHECK: Predecessors (1): B6 -// CHECK: Successors (1): B0 -// CHECK: [ B6 ] -// CHECK: 1: UV -// CHECK: T: if [B6.1] -// CHECK: Predecessors (1): B8 -// CHECK: Successors (2): B5 B4 -// CHECK: [ B7 ] -// CHECK: 1: [B10.1].~A() (Implicit destructor) -// CHECK: T: continue; -// CHECK: Predecessors (1): B8 -// CHECK: Successors (1): B3 -// CHECK: [ B8 ] -// CHECK: 1: UV -// CHECK: T: if [B8.1] -// CHECK: Predecessors (1): B10 -// CHECK: Successors (2): B7 B6 -// CHECK: [ B9 ] -// CHECK: 1: [B10.1].~A() (Implicit destructor) -// CHECK: T: break; -// CHECK: Predecessors (1): B10 -// CHECK: Successors (1): B1 -// CHECK: [ B10 ] -// CHECK: 1: A d; -// CHECK: 2: UV -// CHECK: T: if [B10.2] -// CHECK: Predecessors (1): B2 -// CHECK: Successors (2): B9 B8 -// CHECK: [ B11 ] -// CHECK: 1: A a; -// CHECK: 2: A b; -// CHECK: Predecessors (1): B12 -// CHECK: Successors (1): B2 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (2): B1 B5 -// CHECK: Successors (0): -// CHECK: [ B3 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B0 -// CHECK: [ B1 ] -// CHECK: T: try ... -// CHECK: Predecessors (0): -// CHECK: Successors (2): B2 B0 -// CHECK: [ B2 ] -// CHECK: catch (const A &e): -// CHECK: Predecessors (1): B1 -// CHECK: Successors (1): B0 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (3): B2 B1 B3 -// CHECK: Successors (0): -// CHECK: [ B3 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B0 -// CHECK: [ B1 ] -// CHECK: T: try ... -// CHECK: Predecessors (0): -// CHECK: Successors (2): B2 B0 -// CHECK: [ B2 ] -// CHECK: catch (A e): -// CHECK: 1: .~A() (Implicit destructor) -// CHECK: Predecessors (1): B1 -// CHECK: Successors (1): B0 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (3): B2 B1 B3 -// CHECK: Successors (0): +// CHECK: [ B2 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B1 +// CHECK: [ B1 ] +// CHECK: 1: +// CHECK: 2: A a[2]; +// CHECK: 3: +// CHECK: 4: A b[0]; +// CHECK: 5: [B1.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B2 +// CHECK: Successors (1): B0 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B2 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B1 +// CHECK: [ B1 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: +// CHECK: 4: A c; +// CHECK: 5: +// CHECK: 6: A d; +// CHECK: 7: [B1.6].~A() (Implicit destructor) +// CHECK: 8: [B1.4].~A() (Implicit destructor) +// CHECK: 9: +// CHECK: 10: A b; +// CHECK: 11: [B1.10].~A() (Implicit destructor) +// CHECK: 12: [B1.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B2 +// CHECK: Successors (1): B0 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B4 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B3 +// CHECK: [ B1 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: [B1.2].~A() (Implicit destructor) +// CHECK: 4: [B3.4].~A() (Implicit destructor) +// CHECK: 5: [B3.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B3 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: return; +// CHECK: 2: [B3.4].~A() (Implicit destructor) +// CHECK: 3: [B3.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B3 +// CHECK: Successors (1): B0 +// CHECK: [ B3 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: +// CHECK: 4: A b; +// CHECK: 5: UV +// CHECK: T: if [B3.5] +// CHECK: Predecessors (1): B4 +// CHECK: Successors (2): B2 B1 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (2): B1 B2 +// CHECK: Successors (0): +// CHECK: [ B8 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B7 +// CHECK: [ B1 ] +// CHECK: l1: +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: [B1.2].~A() (Implicit destructor) +// CHECK: 4: [B6.2].~A() (Implicit destructor) +// CHECK: 5: [B7.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B2 B3 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: +// CHECK: 2: A b; +// CHECK: 3: [B2.2].~A() (Implicit destructor) +// CHECK: 4: [B6.4].~A() (Implicit destructor) +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B1 +// CHECK: [ B3 ] +// CHECK: 1: [B6.4].~A() (Implicit destructor) +// CHECK: T: goto l1; +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B1 +// CHECK: [ B4 ] +// CHECK: 1: UV +// CHECK: T: if [B4.1] +// CHECK: Predecessors (1): B6 +// CHECK: Successors (2): B3 B2 +// CHECK: [ B5 ] +// CHECK: 1: [B6.4].~A() (Implicit destructor) +// CHECK: 2: [B6.2].~A() (Implicit destructor) +// CHECK: T: goto l0; +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B6 +// CHECK: [ B6 ] +// CHECK: l0: +// CHECK: 1: +// CHECK: 2: A b; +// CHECK: 3: +// CHECK: 4: A a; +// CHECK: 5: UV +// CHECK: T: if [B6.5] +// CHECK: Predecessors (2): B7 B5 +// CHECK: Successors (2): B5 B4 +// CHECK: [ B7 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: Predecessors (1): B8 +// CHECK: Successors (1): B6 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B5 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B4 +// CHECK: [ B1 ] +// CHECK: 1: [B4.4].~A() (Implicit destructor) +// CHECK: 2: [B4.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B2 B3 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B1 +// CHECK: [ B3 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: [B3.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B1 +// CHECK: [ B4 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: a +// CHECK: 4: if ([B4.6]) +// CHECK:[B3.2]else +// CHECK:[B2.2] 5: b.operator int() +// CHECK: 6: [B4.5] +// CHECK: T: if [B4.6] +// CHECK: Predecessors (1): B5 +// CHECK: Successors (2): B3 B2 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B9 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B8 +// CHECK: [ B1 ] +// CHECK: 1: [B8.4].~A() (Implicit destructor) +// CHECK: 2: +// CHECK: 3: A e; +// CHECK: 4: [B1.3].~A() (Implicit destructor) +// CHECK: 5: [B8.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B2 B5 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: +// CHECK: 2: A d; +// CHECK: 3: [B2.2].~A() (Implicit destructor) +// CHECK: 4: [B4.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B1 +// CHECK: [ B3 ] +// CHECK: 1: return; +// CHECK: 2: [B4.2].~A() (Implicit destructor) +// CHECK: 3: [B8.4].~A() (Implicit destructor) +// CHECK: 4: [B8.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B0 +// CHECK: [ B4 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: UV +// CHECK: T: if [B4.3] +// CHECK: Predecessors (1): B8 +// CHECK: Successors (2): B3 B2 +// CHECK: [ B5 ] +// CHECK: 1: +// CHECK: 2: A d; +// CHECK: 3: [B5.2].~A() (Implicit destructor) +// CHECK: 4: [B7.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B7 +// CHECK: Successors (1): B1 +// CHECK: [ B6 ] +// CHECK: 1: return; +// CHECK: 2: [B7.2].~A() (Implicit destructor) +// CHECK: 3: [B8.4].~A() (Implicit destructor) +// CHECK: 4: [B8.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B7 +// CHECK: Successors (1): B0 +// CHECK: [ B7 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: UV +// CHECK: T: if [B7.3] +// CHECK: Predecessors (1): B8 +// CHECK: Successors (2): B6 B5 +// CHECK: [ B8 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: a +// CHECK: 4: if ([B8.6]) { +// CHECK:[B7.2] if ([B7.3]) +// CHECK:[B6.1][B5.2]} else { +// CHECK:[B4.2] if ([B4.3]) +// CHECK:[B3.1][B2.2]} +// CHECK: 5: b.operator int() +// CHECK: 6: [B8.5] +// CHECK: T: if [B8.6] +// CHECK: Predecessors (1): B9 +// CHECK: Successors (2): B7 B4 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (3): B1 B3 B6 +// CHECK: Successors (0): +// CHECK: [ B6 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B5 +// CHECK: [ B1 ] +// CHECK: 1: [B2.2].~A() (Implicit destructor) +// CHECK: 2: [B5.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B2 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: a +// CHECK: 2: while ([B2.4]) +// CHECK:[B4.2] 3: b.operator int() +// CHECK: 4: [B2.3] +// CHECK: T: while [B2.4] +// CHECK: Predecessors (2): B3 B5 +// CHECK: Successors (2): B4 B1 +// CHECK: [ B3 ] +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B2 +// CHECK: [ B4 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: [B4.2].~A() (Implicit destructor) +// CHECK: 4: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B2 +// CHECK: Successors (1): B3 +// CHECK: [ B5 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B2 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B12 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B11 +// CHECK: [ B1 ] +// CHECK: 1: [B2.2].~A() (Implicit destructor) +// CHECK: 2: +// CHECK: 3: A e; +// CHECK: 4: [B1.3].~A() (Implicit destructor) +// CHECK: 5: [B11.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B9 B2 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: a +// CHECK: 2: while ([B2.4]) +// CHECK: { +// CHECK:[B10.2] if ([B10.3]) +// CHECK: break; +// CHECK: if ([B8.1]) +// CHECK: continue; +// CHECK: if ([B6.1]) +// CHECK:[B5.1][B4.2] } +// CHECK: 3: b.operator int() +// CHECK: 4: [B2.3] +// CHECK: T: while [B2.4] +// CHECK: Predecessors (2): B3 B11 +// CHECK: Successors (2): B10 B1 +// CHECK: [ B3 ] +// CHECK: Predecessors (2): B4 B7 +// CHECK: Successors (1): B2 +// CHECK: [ B4 ] +// CHECK: 1: +// CHECK: 2: A d; +// CHECK: 3: [B4.2].~A() (Implicit destructor) +// CHECK: 4: [B10.2].~A() (Implicit destructor) +// CHECK: 5: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B3 +// CHECK: [ B5 ] +// CHECK: 1: return; +// CHECK: 2: [B10.2].~A() (Implicit destructor) +// CHECK: 3: [B2.2].~A() (Implicit destructor) +// CHECK: 4: [B11.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B0 +// CHECK: [ B6 ] +// CHECK: 1: UV +// CHECK: T: if [B6.1] +// CHECK: Predecessors (1): B8 +// CHECK: Successors (2): B5 B4 +// CHECK: [ B7 ] +// CHECK: 1: [B10.2].~A() (Implicit destructor) +// CHECK: 2: [B2.2].~A() (Implicit destructor) +// CHECK: T: continue; +// CHECK: Predecessors (1): B8 +// CHECK: Successors (1): B3 +// CHECK: [ B8 ] +// CHECK: 1: UV +// CHECK: T: if [B8.1] +// CHECK: Predecessors (1): B10 +// CHECK: Successors (2): B7 B6 +// CHECK: [ B9 ] +// CHECK: 1: [B10.2].~A() (Implicit destructor) +// CHECK: T: break; +// CHECK: Predecessors (1): B10 +// CHECK: Successors (1): B1 +// CHECK: [ B10 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: UV +// CHECK: T: if [B10.3] +// CHECK: Predecessors (1): B2 +// CHECK: Successors (2): B9 B8 +// CHECK: [ B11 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: Predecessors (1): B12 +// CHECK: Successors (1): B2 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (2): B1 B5 +// CHECK: Successors (0): +// CHECK: [ B4 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B2 +// CHECK: [ B1 ] +// CHECK: 1: UV +// CHECK: T: do ... while [B1.1] +// CHECK: Predecessors (1): B2 +// CHECK: Successors (2): B3 B0 +// CHECK: [ B2 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B3 B4 +// CHECK: Successors (1): B1 +// CHECK: [ B3 ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (1): B2 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B12 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B11 +// CHECK: [ B1 ] +// CHECK: 1: +// CHECK: 2: A d; +// CHECK: 3: [B1.2].~A() (Implicit destructor) +// CHECK: 4: [B11.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B8 B2 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: UV +// CHECK: T: do ... while [B2.1] +// CHECK: Predecessors (2): B3 B6 +// CHECK: Successors (2): B10 B1 +// CHECK: [ B3 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: [B3.2].~A() (Implicit destructor) +// CHECK: 4: [B9.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B5 +// CHECK: Successors (1): B2 +// CHECK: [ B4 ] +// CHECK: 1: return; +// CHECK: 2: [B9.2].~A() (Implicit destructor) +// CHECK: 3: [B11.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B5 +// CHECK: Successors (1): B0 +// CHECK: [ B5 ] +// CHECK: 1: UV +// CHECK: T: if [B5.1] +// CHECK: Predecessors (1): B7 +// CHECK: Successors (2): B4 B3 +// CHECK: [ B6 ] +// CHECK: 1: [B9.2].~A() (Implicit destructor) +// CHECK: T: continue; +// CHECK: Predecessors (1): B7 +// CHECK: Successors (1): B2 +// CHECK: [ B7 ] +// CHECK: 1: UV +// CHECK: T: if [B7.1] +// CHECK: Predecessors (1): B9 +// CHECK: Successors (2): B6 B5 +// CHECK: [ B8 ] +// CHECK: 1: [B9.2].~A() (Implicit destructor) +// CHECK: T: break; +// CHECK: Predecessors (1): B9 +// CHECK: Successors (1): B1 +// CHECK: [ B9 ] +// CHECK: 1: +// CHECK: 2: A b; +// CHECK: 3: UV +// CHECK: T: if [B9.3] +// CHECK: Predecessors (2): B10 B11 +// CHECK: Successors (2): B8 B7 +// CHECK: [ B10 ] +// CHECK: Predecessors (1): B2 +// CHECK: Successors (1): B9 +// CHECK: [ B11 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: Predecessors (1): B12 +// CHECK: Successors (1): B9 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (2): B1 B4 +// CHECK: Successors (0): +// CHECK: [ B4 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B2 +// CHECK: [ B1 ] +// CHECK: 1: [B2.4].~A() (Implicit destructor) +// CHECK: 2: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B3 B2 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: a +// CHECK: 4: switch ([B2.5]) +// CHECK:[B3.2] 5: b.operator int() +// CHECK: T: switch [B2.5] +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B1 +// CHECK: [ B3 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: [B3.2].~A() (Implicit destructor) +// CHECK: Predecessors (0): +// CHECK: Successors (1): B1 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B9 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B2 +// CHECK: [ B1 ] +// CHECK: 1: [B2.4].~A() (Implicit destructor) +// CHECK: 2: +// CHECK: 3: A g; +// CHECK: 4: [B1.3].~A() (Implicit destructor) +// CHECK: 5: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (3): B3 B7 B2 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: a +// CHECK: 4: switch ([B2.5]) { +// CHECK: case 0: +// CHECK: { +// CHECK:[B8.2] if ([B8.3]) +// CHECK: break; +// CHECK: if ([B6.1]) +// CHECK:[B5.1][B4.2] } +// CHECK: case 1: +// CHECK: break; +// CHECK:} +// CHECK: 5: b.operator int() +// CHECK: T: switch [B2.5] +// CHECK: Predecessors (1): B9 +// CHECK: Successors (3): B3 B8 +// CHECK: B1 +// CHECK: [ B3 ] +// CHECK: case 1: +// CHECK: T: break; +// CHECK: Predecessors (2): B2 B4 +// CHECK: Successors (1): B1 +// CHECK: [ B4 ] +// CHECK: 1: +// CHECK: 2: A f; +// CHECK: 3: [B4.2].~A() (Implicit destructor) +// CHECK: 4: [B8.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B3 +// CHECK: [ B5 ] +// CHECK: 1: return; +// CHECK: 2: [B8.2].~A() (Implicit destructor) +// CHECK: 3: [B2.4].~A() (Implicit destructor) +// CHECK: 4: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B0 +// CHECK: [ B6 ] +// CHECK: 1: UV +// CHECK: T: if [B6.1] +// CHECK: Predecessors (1): B8 +// CHECK: Successors (2): B5 B4 +// CHECK: [ B7 ] +// CHECK: 1: [B8.2].~A() (Implicit destructor) +// CHECK: T: break; +// CHECK: Predecessors (1): B8 +// CHECK: Successors (1): B1 +// CHECK: [ B8 ] +// CHECK: case 0: +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: UV +// CHECK: T: if [B8.3] +// CHECK: Predecessors (1): B2 +// CHECK: Successors (2): B7 B6 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (2): B1 B5 +// CHECK: Successors (0): +// CHECK: [ B6 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B5 +// CHECK: [ B1 ] +// CHECK: 1: [B2.2].~A() (Implicit destructor) +// CHECK: 2: [B5.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B2 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: a +// CHECK: 2: for (A a; [B2.4];) +// CHECK:[B4.2] 3: b.operator int() +// CHECK: 4: [B2.3] +// CHECK: T: for (...; [B2.4]; ) +// CHECK: Predecessors (2): B3 B5 +// CHECK: Successors (2): B4 B1 +// CHECK: [ B3 ] +// CHECK: 1: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B2 +// CHECK: [ B4 ] +// CHECK: 1: +// CHECK: 2: A c; +// CHECK: 3: [B4.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B2 +// CHECK: Successors (1): B3 +// CHECK: [ B5 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B2 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B12 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B11 +// CHECK: [ B1 ] +// CHECK: 1: [B2.2].~A() (Implicit destructor) +// CHECK: 2: [B11.4].~A() (Implicit destructor) +// CHECK: 3: +// CHECK: 4: A f; +// CHECK: 5: [B1.4].~A() (Implicit destructor) +// CHECK: 6: [B11.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B9 B2 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: b +// CHECK: 2: for (A b; [B2.4];) { +// CHECK:[B10.2] if ([B10.3]) +// CHECK: break; +// CHECK: if ([B8.1]) +// CHECK: continue; +// CHECK: if ([B6.1]) +// CHECK:[B5.1][B4.2]} +// CHECK: 3: c.operator int() +// CHECK: 4: [B2.3] +// CHECK: T: for (...; [B2.4]; ) +// CHECK: Predecessors (2): B3 B11 +// CHECK: Successors (2): B10 B1 +// CHECK: [ B3 ] +// CHECK: 1: [B2.2].~A() (Implicit destructor) +// CHECK: Predecessors (2): B4 B7 +// CHECK: Successors (1): B2 +// CHECK: [ B4 ] +// CHECK: 1: +// CHECK: 2: A e; +// CHECK: 3: [B4.2].~A() (Implicit destructor) +// CHECK: 4: [B10.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B3 +// CHECK: [ B5 ] +// CHECK: 1: return; +// CHECK: 2: [B10.2].~A() (Implicit destructor) +// CHECK: 3: [B2.2].~A() (Implicit destructor) +// CHECK: 4: [B11.4].~A() (Implicit destructor) +// CHECK: 5: [B11.2].~A() (Implicit destructor) +// CHECK: Predecessors (1): B6 +// CHECK: Successors (1): B0 +// CHECK: [ B6 ] +// CHECK: 1: UV +// CHECK: T: if [B6.1] +// CHECK: Predecessors (1): B8 +// CHECK: Successors (2): B5 B4 +// CHECK: [ B7 ] +// CHECK: 1: [B10.2].~A() (Implicit destructor) +// CHECK: T: continue; +// CHECK: Predecessors (1): B8 +// CHECK: Successors (1): B3 +// CHECK: [ B8 ] +// CHECK: 1: UV +// CHECK: T: if [B8.1] +// CHECK: Predecessors (1): B10 +// CHECK: Successors (2): B7 B6 +// CHECK: [ B9 ] +// CHECK: 1: [B10.2].~A() (Implicit destructor) +// CHECK: T: break; +// CHECK: Predecessors (1): B10 +// CHECK: Successors (1): B1 +// CHECK: [ B10 ] +// CHECK: 1: +// CHECK: 2: A d; +// CHECK: 3: UV +// CHECK: T: if [B10.3] +// CHECK: Predecessors (1): B2 +// CHECK: Successors (2): B9 B8 +// CHECK: [ B11 ] +// CHECK: 1: +// CHECK: 2: A a; +// CHECK: 3: +// CHECK: 4: A b; +// CHECK: Predecessors (1): B12 +// CHECK: Successors (1): B2 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (2): B1 B5 +// CHECK: Successors (0): +// CHECK: [ B3 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B0 +// CHECK: [ B1 ] +// CHECK: T: try ... +// CHECK: Predecessors (0): +// CHECK: Successors (2): B2 B0 +// CHECK: [ B2 ] +// CHECK: catch (const A &e): +// CHECK: Predecessors (1): B1 +// CHECK: Successors (1): B0 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (3): B2 B1 B3 +// CHECK: Successors (0): +// CHECK: [ B3 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B0 +// CHECK: [ B1 ] +// CHECK: T: try ... +// CHECK: Predecessors (0): +// CHECK: Successors (2): B2 B0 +// CHECK: [ B2 ] +// CHECK: catch (A e): +// CHECK: 1: .~A() (Implicit destructor) +// CHECK: Predecessors (1): B1 +// CHECK: Successors (1): B0 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (3): B2 B1 B3 +// CHECK: Successors (0): diff --git a/clang/test/Analysis/initializers-cfg-output.cpp b/clang/test/Analysis/initializers-cfg-output.cpp index 0396c47c101..4576dc7a5c4 100644 --- a/clang/test/Analysis/initializers-cfg-output.cpp +++ b/clang/test/Analysis/initializers-cfg-output.cpp @@ -44,46 +44,51 @@ TestControlFlow::TestControlFlow(bool b) int v; } -// CHECK: [ B2 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B1 -// CHECK: [ B1 ] -// CHECK: 1: A() (Base initializer) -// CHECK: 2: C() (Base initializer) -// CHECK: 3: B() (Base initializer) -// CHECK: 4: A() (Base initializer) -// CHECK: 5: i(/*implicit*/int()) (Member initializer) -// CHECK: 6: r(this->i) (Member initializer) -// CHECK: 7: A a; -// CHECK: Predecessors (1): B2 -// CHECK: Successors (1): B0 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): -// CHECK: [ B5 (ENTRY) ] -// CHECK: Predecessors (0): -// CHECK: Successors (1): B4 -// CHECK: [ B1 ] -// CHECK: 1: [B4.2] ? [B2.1] : [B3.1] -// CHECK: 2: y([B1.1]) (Member initializer) -// CHECK: 3: z(this->y) (Member initializer) -// CHECK: 4: int v; -// CHECK: Predecessors (2): B2 B3 -// CHECK: Successors (1): B0 -// CHECK: [ B2 ] -// CHECK: 1: 0 -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B1 -// CHECK: [ B3 ] -// CHECK: 1: 1 -// CHECK: Predecessors (1): B4 -// CHECK: Successors (1): B1 -// CHECK: [ B4 ] -// CHECK: 1: x(0) (Member initializer) -// CHECK: 2: b -// CHECK: T: [B4.2] ? ... : ... -// CHECK: Predecessors (1): B5 -// CHECK: Successors (2): B2 B3 -// CHECK: [ B0 (EXIT) ] -// CHECK: Predecessors (1): B1 -// CHECK: Successors (0): +// CHECK: [ B2 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B1 +// CHECK: [ B1 ] +// CHECK: 1: +// CHECK: 2: A([B1.1]) (Base initializer) +// CHECK: 3: +// CHECK: 4: C([B1.3]) (Base initializer) +// CHECK: 5: +// CHECK: 6: B([B1.5]) (Base initializer) +// CHECK: 7: +// CHECK: 8: A([B1.7]) (Base initializer) +// CHECK: 9: i(/*implicit*/int()) (Member initializer) +// CHECK: 10: r(this->i) (Member initializer) +// CHECK: 11: +// CHECK: 12: A a; +// CHECK: Predecessors (1): B2 +// CHECK: Successors (1): B0 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): +// CHECK: [ B5 (ENTRY) ] +// CHECK: Predecessors (0): +// CHECK: Successors (1): B4 +// CHECK: [ B1 ] +// CHECK: 1: [B4.2] ? [B2.1] : [B3.1] +// CHECK: 2: y([B1.1]) (Member initializer) +// CHECK: 3: z(this->y) (Member initializer) +// CHECK: 4: int v; +// CHECK: Predecessors (2): B2 B3 +// CHECK: Successors (1): B0 +// CHECK: [ B2 ] +// CHECK: 1: 0 +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B1 +// CHECK: [ B3 ] +// CHECK: 1: 1 +// CHECK: Predecessors (1): B4 +// CHECK: Successors (1): B1 +// CHECK: [ B4 ] +// CHECK: 1: x(0) (Member initializer) +// CHECK: 2: b +// CHECK: T: [B4.2] ? ... : ... +// CHECK: Predecessors (1): B5 +// CHECK: Successors (2): B2 B3 +// CHECK: [ B0 (EXIT) ] +// CHECK: Predecessors (1): B1 +// CHECK: Successors (0): diff --git a/clang/test/Analysis/method-call.cpp b/clang/test/Analysis/method-call.cpp index 47f14447d6b..26b4a2fc134 100644 --- a/clang/test/Analysis/method-call.cpp +++ b/clang/test/Analysis/method-call.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-inline-call -analyzer-store region -verify %s +// XFAIL: * struct A { int x; A(int a) { x = a; } |