Changeset View
Changeset View
Standalone View
Standalone View
test/Analysis/scopes-cfg-output.cpp
- This file was added.
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-scopes=true %s > %t 2>&1 | |||||
// RUN: FileCheck --input-file=%t %s | |||||
class A { | |||||
public: | |||||
// CHECK: [B1 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
A() {} | |||||
// CHECK: [B1 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
~A() {} | |||||
// CHECK: [B3 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: 1 | |||||
// CHECK-NEXT: 3: return [B1.2]; | |||||
// CHECK-NEXT: Preds (1): B3 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ReturnStmt) | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B0 (EXIT)] | |||||
operator int() const { return 1; } | |||||
}; | |||||
int getX(); | |||||
extern const bool UV; | |||||
// CHECK: [B2 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A [2]) | |||||
// CHECK-NEXT: 3: A a[2]; | |||||
// CHECK-NEXT: 4: (CXXConstructExpr, class A [0]) | |||||
// CHECK-NEXT: 5: A b[0]; | |||||
// CHECK-NEXT: 6: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 7: [B1.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B2 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
void test_array() { | |||||
A a[2]; | |||||
A b[0]; | |||||
} | |||||
// CHECK: [B2 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: 4: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 5: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 6: A c; | |||||
// CHECK-NEXT: 7: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 8: A d; | |||||
// CHECK-NEXT: 9: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 10: [B1.8].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 11: [B1.6].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 12: (CXXConstructExpr, class A) | |||||
// CHECK: 13: A b; | |||||
// CHECK: 14: CFGScopeEnd(CompoundStmt) | |||||
// CHECK: 15: [B1.13].~A() (Implicit destructor) | |||||
// CHECK: 16: [B1.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B2 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
void test_scope() { | |||||
A a; | |||||
{ A c; | |||||
A d; | |||||
} | |||||
A b; | |||||
} | |||||
// CHECK: [B5 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B4 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A c; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B1.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B4.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 6: [B4.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: return; | |||||
// CHECK-NEXT: 3: [B4.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 4: [B4.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B3 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ReturnStmt) | |||||
// CHECK-NEXT: Preds (1): B2 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: 4: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 5: A b; | |||||
// CHECK-NEXT: 6: UV | |||||
// CHECK-NEXT: 7: [B4.6] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B4.7] | |||||
// CHECK-NEXT: Preds (1): B5 | |||||
// CHECK-NEXT: Succs (2): B2 B1 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (2): B1 B3 | |||||
void test_return() { | |||||
A a; | |||||
A b; | |||||
if (UV) return; | |||||
A c; | |||||
} | |||||
// CHECK: [B7 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B6 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(DeclStmt) | |||||
// CHECK-NEXT: 2: [B6.8].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B6.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (2): B2 B4 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: 1: [B3.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 2: CFGScopeEnd(IfStmt) | |||||
// CHECK-NEXT: Preds (1): B3 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A c; | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: [B5.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 2: CFGScopeEnd(IfStmt) | |||||
// CHECK-NEXT: Preds (1): B5 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A c; | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B4 | |||||
// CHECK: [B6] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: 4: CFGScopeBegin(DeclStmt) | |||||
// CHECK-NEXT: 5: a | |||||
// CHECK-NEXT: 6: [B6.5] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 7: [B6.6] (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 8: A b = a; | |||||
// CHECK-NEXT: 9: b | |||||
// CHECK-NEXT: 10: [B6.9] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 11: [B6.10].operator int | |||||
// CHECK-NEXT: 12: [B6.10] | |||||
// CHECK-NEXT: 13: [B6.12] (ImplicitCastExpr, UserDefinedConversion, int) | |||||
// CHECK-NEXT: 14: [B6.13] (ImplicitCastExpr, IntegralToBoolean, _Bool) | |||||
// CHECK-NEXT: T: if [B6.14] | |||||
// CHECK-NEXT: Preds (1): B7 | |||||
// CHECK-NEXT: Succs (2): B5 B3 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
void test_if_implicit_scope() { | |||||
A a; | |||||
if (A b = a) | |||||
A c; | |||||
else A c; | |||||
} | |||||
// CHECK: [B11 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B10 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(DeclStmt) | |||||
// CHECK-NEXT: 2: [B10.8].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 3: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 4: A e; | |||||
// CHECK-NEXT: 5: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 6: [B1.4].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 7: [B10.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (2): B2 B6 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A d; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B2.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B5.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B5 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: return; | |||||
// CHECK-NEXT: 3: [B5.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 4: [B10.8].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B10.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B5 | |||||
// CHECK-NEXT: Succs (1): B4 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ReturnStmt) | |||||
// CHECK-NEXT: Preds (1): B3 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A c; | |||||
// CHECK-NEXT: 4: UV | |||||
// CHECK-NEXT: 5: [B5.4] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B5.5] | |||||
// CHECK-NEXT: Preds (1): B10 | |||||
// CHECK-NEXT: Succs (2): B3 B2 | |||||
// CHECK: [B6] | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A d; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B6.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B9.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B9 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B7] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: return; | |||||
// CHECK-NEXT: 3: [B9.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 4: [B10.8].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B10.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B9 | |||||
// CHECK-NEXT: Succs (1): B8 | |||||
// CHECK: [B8] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ReturnStmt) | |||||
// CHECK-NEXT: Preds (1): B7 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B9] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A c; | |||||
// CHECK-NEXT: 4: UV | |||||
// CHECK-NEXT: 5: [B9.4] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B9.5] | |||||
// CHECK-NEXT: Preds (1): B10 | |||||
// CHECK-NEXT: Succs (2): B7 B6 | |||||
// CHECK: [B10] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: 4: CFGScopeBegin(DeclStmt) | |||||
// CHECK-NEXT: 5: a | |||||
// CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 7: [B10.6] (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 8: A b = a; | |||||
// CHECK-NEXT: 9: b | |||||
// CHECK-NEXT: 10: [B10.9] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 11: [B10.10].operator int | |||||
// CHECK-NEXT: 12: [B10.10] | |||||
// CHECK-NEXT: 13: [B10.12] (ImplicitCastExpr, UserDefinedConversion, int) | |||||
// CHECK-NEXT: 14: [B10.13] (ImplicitCastExpr, IntegralToBoolean, _Bool) | |||||
// CHECK-NEXT: T: if [B10.14] | |||||
// CHECK-NEXT: Preds (1): B11 | |||||
// CHECK-NEXT: Succs (2): B9 B5 | |||||
// CHECK: [B0 (EXIT)] | |||||
void test_if_jumps() { | |||||
A a; | |||||
if (A b = a) { | |||||
A c; | |||||
if (UV) return; | |||||
A d; | |||||
} else { | |||||
A c; | |||||
if (UV) return; | |||||
A d; | |||||
} | |||||
A e; | |||||
} | |||||
// CHECK: [B6 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B5 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(CXXConstructExpr) | |||||
// CHECK-NEXT: 2: [B4.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B5.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: Preds (1): B3 | |||||
// CHECK-NEXT: Succs (1): B4 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(WhileStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A c; | |||||
// CHECK-NEXT: 4: [B3.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B4.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 6: CFGScopeEnd(WhileStmt) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CXXConstructExpr) | |||||
// CHECK-NEXT: 2: a | |||||
// CHECK-NEXT: 3: [B4.2] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 4: [B4.3] (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 5: A b = a; | |||||
// CHECK-NEXT: 6: b | |||||
// CHECK-NEXT: 7: [B4.6] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 8: [B4.7].operator int | |||||
// CHECK-NEXT: 9: [B4.7] | |||||
// CHECK-NEXT: 10: [B4.9] (ImplicitCastExpr, UserDefinedConversion, int) | |||||
// CHECK-NEXT: 11: [B4.10] (ImplicitCastExpr, IntegralToBoolean, _Bool) | |||||
// CHECK-NEXT: T: while [B4.11] | |||||
// CHECK-NEXT: Preds (2): B2 B5 | |||||
// CHECK-NEXT: Succs (2): B3 B1 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B4 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
void test_while_implicit_scope() { | |||||
A a; | |||||
while (A b = a) | |||||
A c; | |||||
} | |||||
// CHECK: [B15 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B14 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(CXXConstructExpr) | |||||
// CHECK-NEXT: 2: [B13.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 3: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 4: A e; | |||||
// CHECK-NEXT: 5: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 6: [B1.4].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 7: [B14.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (2): B11 B13 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: Preds (2): B3 B8 | |||||
// CHECK-NEXT: Succs (1): B13 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A d; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B3.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 6: [B13.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: return; | |||||
// CHECK-NEXT: 3: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 4: [B13.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B14.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B5 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ReturnStmt) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B6] | |||||
// CHECK-NEXT: 1: UV | |||||
// CHECK-NEXT: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B6.2] | |||||
// CHECK-NEXT: Preds (1): B9 | |||||
// CHECK-NEXT: Succs (2): B4 B3 | |||||
// CHECK: [B7] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 3: [B13.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: T: continue; | |||||
// CHECK-NEXT: Preds (1): B9 | |||||
// CHECK-NEXT: Succs (1): B8 | |||||
// CHECK: [B8] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ContinueStmt) | |||||
// CHECK-NEXT: Preds (1): B7 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B9] | |||||
// CHECK-NEXT: 1: UV | |||||
// CHECK-NEXT: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B9.2] | |||||
// CHECK-NEXT: Preds (1): B12 | |||||
// CHECK-NEXT: Succs (2): B7 B6 | |||||
// CHECK: [B10] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: T: break; | |||||
// CHECK-NEXT: Preds (1): B12 | |||||
// CHECK-NEXT: Succs (1): B11 | |||||
// CHECK: [B11] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(BreakStmt) | |||||
// CHECK-NEXT: Preds (1): B10 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B12] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A c; | |||||
// CHECK-NEXT: 4: UV | |||||
// CHECK-NEXT: 5: [B12.4] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B12.5] | |||||
// CHECK-NEXT: Preds (1): B13 | |||||
// CHECK-NEXT: Succs (2): B10 B9 | |||||
// CHECK: [B13] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CXXConstructExpr) | |||||
// CHECK-NEXT: 2: a | |||||
// CHECK-NEXT: 3: [B13.2] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 4: [B13.3] (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 5: A b = a; | |||||
// CHECK-NEXT: 6: b | |||||
// CHECK-NEXT: 7: [B13.6] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 8: [B13.7].operator int | |||||
// CHECK-NEXT: 9: [B13.7] | |||||
// CHECK-NEXT: 10: [B13.9] (ImplicitCastExpr, UserDefinedConversion, int) | |||||
// CHECK-NEXT: 11: [B13.10] (ImplicitCastExpr, IntegralToBoolean, _Bool) | |||||
// CHECK-NEXT: T: while [B13.11] | |||||
// CHECK-NEXT: Preds (2): B2 B14 | |||||
// CHECK-NEXT: Succs (2): B12 B1 | |||||
// CHECK: [B14] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: Preds (1): B15 | |||||
// CHECK-NEXT: Succs (1): B13 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (2): B1 B5 | |||||
void test_while_jumps() { | |||||
A a; | |||||
while (A b = a) { | |||||
A c; | |||||
if (UV) break; | |||||
if (UV) continue; | |||||
if (UV) return; | |||||
A d; | |||||
} | |||||
A e; | |||||
} | |||||
// CHECK: [B15 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B14 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A d; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B1.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B14.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (2): B11 B2 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: 1: UV | |||||
// CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: do ... while [B2.2] | |||||
// CHECK-NEXT: Preds (2): B3 B8 | |||||
// CHECK-NEXT: Succs (2): B13 B1 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A c; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B3.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: return; | |||||
// CHECK-NEXT: 3: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 4: [B14.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B5 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ReturnStmt) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B6] | |||||
// CHECK-NEXT: 1: UV | |||||
// CHECK-NEXT: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B6.2] | |||||
// CHECK-NEXT: Preds (1): B9 | |||||
// CHECK-NEXT: Succs (2): B4 B3 | |||||
// CHECK: [B7] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: T: continue; | |||||
// CHECK: Preds (1): B9 | |||||
// CHECK-NEXT: Succs (1): B8 | |||||
// CHECK: [B8] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ContinueStmt) | |||||
// CHECK-NEXT: Preds (1): B7 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B9] | |||||
// CHECK-NEXT: 1: UV | |||||
// CHECK-NEXT: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B9.2] | |||||
// CHECK-NEXT: Preds (1): B12 | |||||
// CHECK-NEXT: Succs (2): B7 B6 | |||||
// CHECK: [B10] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: T: break; | |||||
// CHECK: Preds (1): B12 | |||||
// CHECK-NEXT: Succs (1): B11 | |||||
// CHECK: [B11] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(BreakStmt) | |||||
// CHECK-NEXT: Preds (1): B10 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B12] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A b; | |||||
// CHECK-NEXT: 4: UV | |||||
// CHECK-NEXT: 5: [B12.4] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B12.5] | |||||
// CHECK-NEXT: Preds (2): B13 B14 | |||||
// CHECK-NEXT: Succs (2): B10 B9 | |||||
// CHECK: [B13] | |||||
// CHECK-NEXT: Preds (1): B2 | |||||
// CHECK-NEXT: Succs (1): B12 | |||||
// CHECK: [B14] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: Preds (1): B15 | |||||
// CHECK-NEXT: Succs (1): B12 | |||||
// CHECK: [B0 (EXIT) | |||||
void test_do_jumps() { | |||||
A a; | |||||
do { | |||||
A b; | |||||
if (UV) break; | |||||
if (UV) continue; | |||||
if (UV) return; | |||||
A c; | |||||
} while (UV); | |||||
A d; | |||||
} | |||||
// CHECK: [B6 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B5 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(DeclStmt) | |||||
// CHECK-NEXT: 2: [B4.4].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 3: [B5.4].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 4: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: Preds (1): B3 | |||||
// CHECK-NEXT: Succs (1): B4 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(ForStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A c; | |||||
// CHECK-NEXT: 4: [B3.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B4.4].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 6: CFGScopeEnd(ForStmt) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: a | |||||
// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 4: A b = a; | |||||
// CHECK-NEXT: 5: b | |||||
// CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 7: [B4.6].operator int | |||||
// CHECK-NEXT: 8: [B4.6] | |||||
// CHECK-NEXT: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int) | |||||
// CHECK: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) | |||||
// CHECK-NEXT: T: for (...; [B4.10]; ) | |||||
// CHECK-NEXT: Preds (2): B2 B5 | |||||
// CHECK-NEXT: Succs (2): B3 B1 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: CFGScopeBegin(DeclStmt) | |||||
// CHECK-NEXT: 3: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 4: A a; | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B4 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
void test_for_implicit_scope() { | |||||
for (A a; A b = a; ) | |||||
A c; | |||||
} | |||||
// CHECK: [B15 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B14 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(DeclStmt) | |||||
// CHECK-NEXT: 2: [B13.4].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 3: [B14.6].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 4: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 5: A f; | |||||
// CHECK-NEXT: 6: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 7: [B1.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 8: [B14.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (2): B11 B13 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: Preds (2): B3 B8 | |||||
// CHECK-NEXT: Succs (1): B13 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A e; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B3.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 6: [B13.4].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: return; | |||||
// CHECK-NEXT: 3: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 4: [B13.4].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B14.6].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 6: [B14.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B5 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ReturnStmt) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B6] | |||||
// CHECK-NEXT: 1: UV | |||||
// CHECK-NEXT: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B6.2] | |||||
// CHECK-NEXT: Preds (1): B9 | |||||
// CHECK-NEXT: Succs (2): B4 B3 | |||||
// CHECK: [B7] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: T: continue; | |||||
// CHECK: Preds (1): B9 | |||||
// CHECK-NEXT: Succs (1): B8 | |||||
// CHECK: [B8] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(ContinueStmt) | |||||
// CHECK-NEXT: Preds (1): B7 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B9] | |||||
// CHECK-NEXT: 1: UV | |||||
// CHECK-NEXT: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B9.2] | |||||
// CHECK-NEXT: Preds (1): B12 | |||||
// CHECK-NEXT: Succs (2): B7 B6 | |||||
// CHECK: [B10] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: [B12.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: T: break; | |||||
// CHECK: Preds (1): B12 | |||||
// CHECK-NEXT: Succs (1): B11 | |||||
// CHECK: [B11] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(BreakStmt) | |||||
// CHECK-NEXT: Preds (1): B10 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B12] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A d; | |||||
// CHECK-NEXT: 4: UV | |||||
// CHECK-NEXT: 5: [B12.4] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B12.5] | |||||
// CHECK-NEXT: Preds (1): B13 | |||||
// CHECK-NEXT: Succs (2): B10 B9 | |||||
// CHECK: [B13] | |||||
// CHECK-NEXT: 1: b | |||||
// CHECK-NEXT: 2: [B13.1] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 3: [B13.2] (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 4: A c = b; | |||||
// CHECK-NEXT: 5: c | |||||
// CHECK-NEXT: 6: [B13.5] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 7: [B13.6].operator int | |||||
// CHECK-NEXT: 8: [B13.6] | |||||
// CHECK-NEXT: 9: [B13.8] (ImplicitCastExpr, UserDefinedConversion, int) | |||||
// CHECK-NEXT: 10: [B13.9] (ImplicitCastExpr, IntegralToBoolean, _Bool) | |||||
// CHECK-NEXT: T: for (...; [B13.10]; ) | |||||
// CHECK-NEXT: Preds (2): B2 B14 | |||||
// CHECK-NEXT: Succs (2): B12 B1 | |||||
// CHECK: [B14] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: 4: CFGScopeBegin(DeclStmt) | |||||
// CHECK-NEXT: 5: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 6: A b; | |||||
// CHECK-NEXT: Preds (1): B15 | |||||
// CHECK-NEXT: Succs (1): B13 | |||||
// CHECK: [B0 (EXIT)] | |||||
void test_for_jumps() { | |||||
A a; | |||||
for (A b; A c = b; ) { | |||||
A d; | |||||
if (UV) break; | |||||
if (UV) continue; | |||||
if (UV) return; | |||||
A e; | |||||
} | |||||
A f; | |||||
} | |||||
// CHECK: [B10 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B9 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: l1: | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A c; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B1.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B8.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 6: [B9.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (2): B2 B4 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A b; | |||||
// CHECK-NEXT: 3: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 4: [B2.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 5: [B8.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (2): B3 B5 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(IfStmt) | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: [B8.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: T: goto l1; | |||||
// CHECK: Preds (1): B5 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: UV | |||||
// CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B5.2] | |||||
// CHECK-NEXT: Preds (2): B6 B8 | |||||
// CHECK-NEXT: Succs (2): B4 B2 | |||||
// CHECK: [B6] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(IfStmt) | |||||
// CHECK-NEXT: Succs (1): B5 | |||||
// CHECK: [B7] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(IfStmt) | |||||
// CHECK-NEXT: 2: [B8.5].~A() (Implicit destructor) | |||||
// CHECK-NEXT: 3: [B8.2].~A() (Implicit destructor) | |||||
// CHECK-NEXT: T: goto l0; | |||||
// CHECK: Preds (1): B8 | |||||
// CHECK-NEXT: Succs (1): B8 | |||||
// CHECK: [B8] | |||||
// CHECK-NEXT: l0: | |||||
// CHECK-NEXT: 1: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 2: A b; | |||||
// CHECK-NEXT: 3: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 4: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 5: A a; | |||||
// CHECK-NEXT: 6: UV | |||||
// CHECK-NEXT: 7: [B8.6] (ImplicitCastExpr, LValueToRValue, _Bool) | |||||
// CHECK-NEXT: T: if [B8.7] | |||||
// CHECK-NEXT: Preds (2): B9 B7 | |||||
// CHECK-NEXT: Succs (2): B7 B5 | |||||
// CHECK: [B9] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A) | |||||
// CHECK-NEXT: 3: A a; | |||||
// CHECK-NEXT: Preds (1): B10 | |||||
// CHECK-NEXT: Succs (1): B8 | |||||
// CHECK: [B0 (EXIT)] | |||||
void test_goto() { | |||||
A a; | |||||
l0: | |||||
A b; | |||||
{ A a; | |||||
if (UV) goto l0; | |||||
if (UV) goto l1; | |||||
A b; | |||||
} | |||||
l1: | |||||
A c; | |||||
} | |||||
// CHECK: [B8 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B7 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(DeclStmt) | |||||
// CHECK-NEXT: 2: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 3: int unused2; | |||||
// CHECK-NEXT: 4: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 5: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: Preds (2): B5 B6 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: 1: i | |||||
// CHECK-NEXT: 2: ++[B2.1] | |||||
// CHECK-NEXT: Preds (1): B3 | |||||
// CHECK-NEXT: Succs (1): B6 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 3: int unused1; | |||||
// CHECK-NEXT: T: break; | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B5 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(BreakStmt) | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B1 | |||||
// CHECK: [B6] | |||||
// CHECK-NEXT: 1: i | |||||
// CHECK-NEXT: 2: [B6.1] (ImplicitCastExpr, LValueToRValue, int) | |||||
// CHECK-NEXT: 3: 3 | |||||
// CHECK-NEXT: 4: [B6.2] < [B6.3] | |||||
// CHECK-NEXT: T: for (...; [B6.4]; ...) | |||||
// CHECK-NEXT: Preds (2): B2 B7 | |||||
// CHECK-NEXT: Succs (2): B4 B1 | |||||
// CHECK: [B7] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: CFGScopeBegin(DeclStmt) | |||||
// CHECK-NEXT: 3: 0 | |||||
// CHECK-NEXT: 4: int i = 0; | |||||
// CHECK-NEXT: Preds (1): B8 | |||||
// CHECK-NEXT: Succs (1): B6 | |||||
// CHECK: [B0 (EXIT)] | |||||
void test_for_compound_and_break() { | |||||
for (int i = 0; i < 3; ++i) { | |||||
{ | |||||
int unused1; | |||||
break; | |||||
} | |||||
} | |||||
{ | |||||
int unused2; | |||||
} | |||||
} | |||||
// CHECK: [B6 (ENTRY)] | |||||
// CHECK-NEXT: Succs (1): B5 | |||||
// CHECK: [B1] | |||||
// CHECK-NEXT: 1: CFGScopeEnd(CompoundStmt) | |||||
// CHECK-NEXT: 2: [B5.3].~A() (Implicit destructor) | |||||
// CHECK-NEXT: Preds (1): B2 | |||||
// CHECK-NEXT: Succs (1): B0 | |||||
// CHECK: [B2] | |||||
// CHECK-NEXT: 1: __begin | |||||
// CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, class A *) | |||||
// CHECK-NEXT: 3: __end | |||||
// CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, LValueToRValue, class A *) | |||||
// CHECK-NEXT: 5: [B2.2] != [B2.4] | |||||
// CHECK-NEXT: T: for (auto &i : [B5.4]) { | |||||
// CHECK: [B4.11]; | |||||
// CHECK-NEXT:} | |||||
// CHECK-NEXT: Preds (2): B3 B5 | |||||
// CHECK-NEXT: Succs (2): B4 B1 | |||||
// CHECK: [B3] | |||||
// CHECK-NEXT: 1: __begin | |||||
// CHECK-NEXT: 2: ++[B3.1] | |||||
// CHECK-NEXT: Preds (1): B4 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B4] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CXXForRangeStmt) | |||||
// CHECK-NEXT: 2: __begin | |||||
// CHECK-NEXT: 3: [B4.2] (ImplicitCastExpr, LValueToRValue, class A *) | |||||
// CHECK-NEXT: 4: *[B4.3] | |||||
// CHECK-NEXT: 5: auto &i = *__begin; | |||||
// CHECK-NEXT: 6: operator= | |||||
// CHECK-NEXT: 7: [B4.6] (ImplicitCastExpr, FunctionToPointerDecay, class A &(*)(const class A &) throw()) | |||||
// CHECK-NEXT: 8: i | |||||
// CHECK-NEXT: 9: b | |||||
// CHECK-NEXT: 10: [B4.9] (ImplicitCastExpr, NoOp, const class A) | |||||
// CHECK-NEXT: 11: [B4.8] = [B4.10] (OperatorCall) | |||||
// CHECK-NEXT: 12: CFGScopeEnd(CXXForRangeStmt) | |||||
// CHECK-NEXT: Preds (1): B2 | |||||
// CHECK-NEXT: Succs (1): B3 | |||||
// CHECK: [B5] | |||||
// CHECK-NEXT: 1: CFGScopeBegin(CompoundStmt) | |||||
// CHECK-NEXT: 2: (CXXConstructExpr, class A [10]) | |||||
// CHECK-NEXT: 3: A a[10]; | |||||
// CHECK-NEXT: 4: a | |||||
// CHECK-NEXT: 5: auto &&__range = a; | |||||
// CHECK-NEXT: 6: __range | |||||
// CHECK-NEXT: 7: [B5.6] (ImplicitCastExpr, ArrayToPointerDecay, class A *) | |||||
// CHECK-NEXT: 8: 10L | |||||
// CHECK-NEXT: 9: [B5.7] + [B5.8] | |||||
// CHECK-NEXT: 10: auto __end = __range + 10L; | |||||
// CHECK-NEXT: 11: __range | |||||
// CHECK-NEXT: 12: [B5.11] (ImplicitCastExpr, ArrayToPointerDecay, class A *) | |||||
// CHECK-NEXT: 13: auto __begin = __range; | |||||
// CHECK-NEXT: Preds (1): B6 | |||||
// CHECK-NEXT: Succs (1): B2 | |||||
// CHECK: [B0 (EXIT)] | |||||
// CHECK-NEXT: Preds (1): B1 | |||||
void test_range_for(A &b) { | |||||
A a[10]; | |||||
for (auto &i : a) | |||||
i = b; | |||||
} |