tomasz-kaminski-sonarsource updated this revision to Diff 542779. tomasz-kaminski-sonarsource added a comment.
Added generic FIXME comment for covering test cases for types with trivial destructor. This affects nearly all tests cases from file, so some tought needs to be put on how to apporach it. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D155694/new/ https://reviews.llvm.org/D155694 Files: clang/test/Analysis/lifetime-cfg-output.cpp
Index: clang/test/Analysis/lifetime-cfg-output.cpp =================================================================== --- clang/test/Analysis/lifetime-cfg-output.cpp +++ clang/test/Analysis/lifetime-cfg-output.cpp @@ -1,6 +1,11 @@ -// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-lifetime=true,cfg-temporary-dtors=false,cfg-rich-constructors=false -analyzer-config cfg-implicit-dtors=false %s > %t 2>&1 +// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=debug.DumpCFG -analyzer-config cfg-lifetime=true %s > %t 2>&1 // RUN: FileCheck --input-file=%t %s +// FIXME Most of the cases in this file test only with the objects of type `A`, +// that has non-trivial destructor. As the behavior for such types is different +// from ones with trivial destructor - later ends they lifetime last, we +// should extended the test cases. + extern bool UV; class A { public: @@ -58,19 +63,21 @@ // CHECK: [B2 (ENTRY)] // CHECK-NEXT: Succs (1): B1 // CHECK: [B1] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: 3: a // CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, NoOp, const A) // CHECK-NEXT: 5: const A &b = a; -// CHECK-NEXT: 6: A() (CXXConstructExpr, A) +// CHECK-NEXT: 6: A() (CXXConstructExpr, [B1.9], A) // CHECK-NEXT: 7: [B1.6] (BindTemporary) // CHECK-NEXT: 8: [B1.7] (ImplicitCastExpr, NoOp, const A) // CHECK-NEXT: 9: [B1.8] // CHECK-NEXT: 10: const A &c = A(); -// CHECK-NEXT: 11: [B1.10] (Lifetime ends) -// CHECK-NEXT: 12: [B1.2] (Lifetime ends) -// CHECK-NEXT: 13: [B1.5] (Lifetime ends) +// CHECK-NEXT: 11: [B1.10].~A() (Implicit destructor) +// CHECK-NEXT: 12: [B1.10] (Lifetime ends) +// CHECK-NEXT: 13: [B1.2].~A() (Implicit destructor) +// CHECK-NEXT: 14: [B1.2] (Lifetime ends) +// CHECK-NEXT: 15: [B1.5] (Lifetime ends) // CHECK-NEXT: Preds (1): B2 // CHECK-NEXT: Succs (1): B0 // CHECK: [B0 (EXIT)] @@ -84,14 +91,15 @@ // CHECK: [B2 (ENTRY)] // CHECK-NEXT: Succs (1): B1 // CHECK: [B1] -// CHECK-NEXT: 1: (CXXConstructExpr, A[2]) +// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A[2]) // CHECK-NEXT: 2: A a[2]; -// CHECK-NEXT: 3: (CXXConstructExpr, A[0]) +// CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A[0]) // CHECK-NEXT: 4: A b[0]; +// CHECK-NEXT: 5: [B1.2].~A[2]() (Implicit destructor) // lifetime of a ends when its destructors are run -// CHECK-NEXT: 5: [B1.2] (Lifetime ends) +// CHECK-NEXT: 6: [B1.2] (Lifetime ends) // lifetime of b ends when its storage duration ends -// CHECK-NEXT: 6: [B1.4] (Lifetime ends) +// CHECK-NEXT: 7: [B1.4] (Lifetime ends) // CHECK-NEXT: Preds (1): B2 // CHECK-NEXT: Succs (1): B0 // CHECK: [B0 (EXIT)] @@ -104,18 +112,22 @@ // CHECK: [B2 (ENTRY)] // CHECK-NEXT: Succs (1): B1 // CHECK: [B1] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A) // CHECK-NEXT: 2: A a; -// CHECK-NEXT: 3: (CXXConstructExpr, A) +// CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A) // CHECK-NEXT: 4: A c; -// CHECK-NEXT: 5: (CXXConstructExpr, A) +// CHECK-NEXT: 5: (CXXConstructExpr, [B1.6], A) // CHECK-NEXT: 6: A d; -// CHECK-NEXT: 7: [B1.6] (Lifetime ends) -// CHECK-NEXT: 8: [B1.4] (Lifetime ends) -// CHECK-NEXT: 9: (CXXConstructExpr, A) -// CHECK-NEXT: 10: A b; -// CHECK-NEXT: 11: [B1.10] (Lifetime ends) -// CHECK-NEXT: 12: [B1.2] (Lifetime ends) +// CHECK-NEXT: 7: [B1.6].~A() (Implicit destructor) +// CHECK-NEXT: 8: [B1.6] (Lifetime ends) +// CHECK-NEXT: 9: [B1.4].~A() (Implicit destructor) +// CHECK-NEXT: 10: [B1.4] (Lifetime ends) +// CHECK-NEXT: 11: (CXXConstructExpr, [B1.12], A) +// CHECK-NEXT: 12: A b; +// CHECK-NEXT: 13: [B1.12].~A() (Implicit destructor) +// CHECK-NEXT: 14: [B1.12] (Lifetime ends) +// CHECK-NEXT: 15: [B1.2].~A() (Implicit destructor) +// CHECK-NEXT: 16: [B1.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B2 // CHECK-NEXT: Succs (1): B0 // CHECK: [B0 (EXIT)] @@ -132,30 +144,34 @@ // CHECK: [B4 (ENTRY)] // CHECK-NEXT: Succs (1): B3 // CHECK: [B1] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A) // CHECK-NEXT: 2: A c; -// CHECK-NEXT: 3: [B1.2] (Lifetime ends) -// CHECK-NEXT: 4: [B3.4] (Lifetime ends) -// CHECK-NEXT: 5: [B3.2] (Lifetime ends) +// CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B1.2] (Lifetime ends) +// CHECK-NEXT: 5: [B3.4].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B3.4] (Lifetime ends) +// CHECK-NEXT: 7: [B3.2].~A() (Implicit destructor) +// CHECK-NEXT: 8: [B3.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B3 // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] // CHECK-NEXT: 1: return; -// CHECK-NEXT: 2: [B3.4] (Lifetime ends) -// CHECK-NEXT: 3: [B3.2] (Lifetime ends) +// CHECK-NEXT: 2: [B3.4].~A() (Implicit destructor) +// CHECK-NEXT: 3: [B3.4] (Lifetime ends) +// CHECK-NEXT: 4: [B3.2].~A() (Implicit destructor) +// CHECK-NEXT: 5: [B3.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B3 // CHECK-NEXT: Succs (1): B0 // CHECK: [B3] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) // CHECK-NEXT: 2: A a; -// CHECK-NEXT: 3: (CXXConstructExpr, A) +// CHECK-NEXT: 3: (CXXConstructExpr, [B3.4], A) // CHECK-NEXT: 4: A b; // CHECK-NEXT: 5: UV // CHECK-NEXT: 6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool) // CHECK-NEXT: T: if [B3.6] // CHECK-NEXT: Preds (1): B4 // CHECK-NEXT: Succs (2): B2 B1 - // CHECK: [B0 (EXIT)] // CHECK-NEXT: Preds (2): B1 B2 void test_return() { @@ -169,28 +185,32 @@ // CHECK: [B5 (ENTRY)] // CHECK-NEXT: Succs (1): B4 // CHECK: [B1] -// CHECK-NEXT: 1: [B4.6] (Lifetime ends) -// CHECK-NEXT: 2: [B4.2] (Lifetime ends) +// CHECK-NEXT: 1: [B4.6].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B4.6] (Lifetime ends) +// CHECK-NEXT: 3: [B4.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B4.2] (Lifetime ends) // CHECK-NEXT: Preds (2): B2 B3 // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B2.2], A) // CHECK-NEXT: 2: A c; -// CHECK-NEXT: 3: [B2.2] (Lifetime ends) +// CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B2.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B4 // CHECK-NEXT: Succs (1): B1 // CHECK: [B3] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) // CHECK-NEXT: 2: A c; -// CHECK-NEXT: 3: [B3.2] (Lifetime ends) +// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B3.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B4 // CHECK-NEXT: Succs (1): B1 // CHECK: [B4] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B4.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: 3: a // CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, NoOp, const A) -// CHECK-NEXT: 5: [B4.4] (CXXConstructExpr, A) +// CHECK-NEXT: 5: [B4.4] (CXXConstructExpr, [B4.6], A) // CHECK-NEXT: 6: A b = a; // CHECK-NEXT: 7: b // CHECK-NEXT: 8: [B4.7] (ImplicitCastExpr, NoOp, const class A) @@ -214,29 +234,37 @@ // CHECK: [B9 (ENTRY)] // CHECK-NEXT: Succs (1): B8 // CHECK: [B1] -// CHECK-NEXT: 1: [B8.6] (Lifetime ends) -// CHECK-NEXT: 2: (CXXConstructExpr, A) -// CHECK-NEXT: 3: A e; -// CHECK-NEXT: 4: [B1.3] (Lifetime ends) -// CHECK-NEXT: 5: [B8.2] (Lifetime ends) +// CHECK-NEXT: 1: [B8.6].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B8.6] (Lifetime ends) +// CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A) +// CHECK-NEXT: 4: A e; +// CHECK-NEXT: 5: [B1.4].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B1.4] (Lifetime ends) +// CHECK-NEXT: 7: [B8.2].~A() (Implicit destructor) +// CHECK-NEXT: 8: [B8.2] (Lifetime ends) // CHECK-NEXT: Preds (2): B2 B5 // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B2.2], A) // CHECK-NEXT: 2: A d; -// CHECK-NEXT: 3: [B2.2] (Lifetime ends) -// CHECK-NEXT: 4: [B4.2] (Lifetime ends) +// CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B2.2] (Lifetime ends) +// CHECK-NEXT: 5: [B4.2].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B4.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B4 // CHECK-NEXT: Succs (1): B1 // CHECK: [B3] // CHECK-NEXT: 1: return; -// CHECK-NEXT: 2: [B4.2] (Lifetime ends) -// CHECK-NEXT: 3: [B8.6] (Lifetime ends) -// CHECK-NEXT: 4: [B8.2] (Lifetime ends) +// CHECK-NEXT: 2: [B4.2].~A() (Implicit destructor) +// CHECK-NEXT: 3: [B4.2] (Lifetime ends) +// CHECK-NEXT: 4: [B8.6].~A() (Implicit destructor) +// CHECK-NEXT: 5: [B8.6] (Lifetime ends) +// CHECK-NEXT: 6: [B8.2].~A() (Implicit destructor) +// CHECK-NEXT: 7: [B8.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B4 // CHECK-NEXT: Succs (1): B0 // CHECK: [B4] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B4.2], A) // CHECK-NEXT: 2: A c; // CHECK-NEXT: 3: UV // CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool) @@ -244,21 +272,26 @@ // CHECK-NEXT: Preds (1): B8 // CHECK-NEXT: Succs (2): B3 B2 // CHECK: [B5] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B5.2], A) // CHECK-NEXT: 2: A d; -// CHECK-NEXT: 3: [B5.2] (Lifetime ends) -// CHECK-NEXT: 4: [B7.2] (Lifetime ends) +// CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B5.2] (Lifetime ends) +// CHECK-NEXT: 5: [B7.2].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B7.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (1): B1 // CHECK: [B6] // CHECK-NEXT: 1: return; -// CHECK-NEXT: 2: [B7.2] (Lifetime ends) -// CHECK-NEXT: 3: [B8.6] (Lifetime ends) -// CHECK-NEXT: 4: [B8.2] (Lifetime ends) +// CHECK-NEXT: 2: [B7.2].~A() (Implicit destructor) +// CHECK-NEXT: 3: [B7.2] (Lifetime ends) +// CHECK-NEXT: 4: [B8.6].~A() (Implicit destructor) +// CHECK-NEXT: 5: [B8.6] (Lifetime ends) +// CHECK-NEXT: 6: [B8.2].~A() (Implicit destructor) +// CHECK-NEXT: 7: [B8.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (1): B0 // CHECK: [B7] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B7.2], A) // CHECK-NEXT: 2: A c; // CHECK-NEXT: 3: UV // CHECK-NEXT: 4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool) @@ -266,11 +299,11 @@ // CHECK-NEXT: Preds (1): B8 // CHECK-NEXT: Succs (2): B6 B5 // CHECK: [B8] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B8.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: 3: a // CHECK-NEXT: 4: [B8.3] (ImplicitCastExpr, NoOp, const A) -// CHECK-NEXT: 5: [B8.4] (CXXConstructExpr, A) +// CHECK-NEXT: 5: [B8.4] (CXXConstructExpr, [B8.6], A) // CHECK-NEXT: 6: A b = a; // CHECK-NEXT: 7: b // CHECK-NEXT: 8: [B8.7] (ImplicitCastExpr, NoOp, const class A) @@ -302,24 +335,28 @@ // CHECK: [B6 (ENTRY)] // CHECK-NEXT: Succs (1): B5 // CHECK: [B1] -// CHECK-NEXT: 1: [B4.4] (Lifetime ends) -// CHECK-NEXT: 2: [B5.2] (Lifetime ends) +// CHECK-NEXT: 1: [B4.4].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B4.4] (Lifetime ends) +// CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B5.2] (Lifetime ends) // 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: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) // CHECK-NEXT: 2: A c; -// CHECK-NEXT: 3: [B3.2] (Lifetime ends) -// CHECK-NEXT: 4: [B4.4] (Lifetime ends) +// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B3.2] (Lifetime ends) +// CHECK-NEXT: 5: [B4.4].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B4.4] (Lifetime ends) // CHECK-NEXT: Preds (1): B4 // CHECK-NEXT: Succs (1): B2 // CHECK: [B4] // CHECK-NEXT: 1: a // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const A) -// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, A) +// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, [B4.4], A) // CHECK-NEXT: 4: A b = a; // CHECK-NEXT: 5: b // CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A) @@ -331,7 +368,7 @@ // CHECK-NEXT: Preds (2): B2 B5 // CHECK-NEXT: Succs (2): B3 B1 // CHECK: [B5] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B5.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: Preds (1): B6 // CHECK-NEXT: Succs (1): B4 @@ -346,29 +383,38 @@ // CHECK: [B12 (ENTRY)] // CHECK-NEXT: Succs (1): B11 // CHECK: [B1] -// CHECK-NEXT: 1: [B10.4] (Lifetime ends) -// CHECK-NEXT: 2: (CXXConstructExpr, A) -// CHECK-NEXT: 3: A e; -// CHECK-NEXT: 4: [B1.3] (Lifetime ends) -// CHECK-NEXT: 5: [B11.2] (Lifetime ends) +// CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B10.4] (Lifetime ends) +// CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A) +// CHECK-NEXT: 4: A e; +// CHECK-NEXT: 5: [B1.4].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B1.4] (Lifetime ends) +// CHECK-NEXT: 7: [B11.2].~A() (Implicit destructor) +// CHECK-NEXT: 8: [B11.2] (Lifetime ends) // CHECK-NEXT: Preds (2): B8 B10 // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] // CHECK-NEXT: Preds (2): B3 B6 // CHECK-NEXT: Succs (1): B10 // CHECK: [B3] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) // CHECK-NEXT: 2: A d; -// CHECK-NEXT: 3: [B3.2] (Lifetime ends) -// CHECK-NEXT: 4: [B9.2] (Lifetime ends) -// CHECK-NEXT: 5: [B10.4] (Lifetime ends) +// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B3.2] (Lifetime ends) +// CHECK-NEXT: 5: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B9.2] (Lifetime ends) +// CHECK-NEXT: 7: [B10.4].~A() (Implicit destructor) +// CHECK-NEXT: 8: [B10.4] (Lifetime ends) // CHECK-NEXT: Preds (1): B5 // CHECK-NEXT: Succs (1): B2 // CHECK: [B4] // CHECK-NEXT: 1: return; -// CHECK-NEXT: 2: [B9.2] (Lifetime ends) -// CHECK-NEXT: 3: [B10.4] (Lifetime ends) -// CHECK-NEXT: 4: [B11.2] (Lifetime ends) +// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 3: [B9.2] (Lifetime ends) +// CHECK-NEXT: 4: [B10.4].~A() (Implicit destructor) +// CHECK-NEXT: 5: [B10.4] (Lifetime ends) +// CHECK-NEXT: 6: [B11.2].~A() (Implicit destructor) +// CHECK-NEXT: 7: [B11.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B5 // CHECK-NEXT: Succs (1): B0 // CHECK: [B5] @@ -378,8 +424,10 @@ // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (2): B4 B3 // CHECK: [B6] -// CHECK-NEXT: 1: [B9.2] (Lifetime ends) -// CHECK-NEXT: 2: [B10.4] (Lifetime ends) +// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B9.2] (Lifetime ends) +// CHECK-NEXT: 3: [B10.4].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B10.4] (Lifetime ends) // CHECK-NEXT: T: continue; // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (1): B2 @@ -390,12 +438,13 @@ // CHECK-NEXT: Preds (1): B9 // CHECK-NEXT: Succs (2): B6 B5 // CHECK: [B8] -// CHECK-NEXT: 1: [B9.2] (Lifetime ends) +// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B9.2] (Lifetime ends) // CHECK-NEXT: T: break; // CHECK-NEXT: Preds (1): B9 // CHECK-NEXT: Succs (1): B1 // CHECK: [B9] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B9.2], A) // CHECK-NEXT: 2: A c; // CHECK-NEXT: 3: UV // CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) @@ -405,7 +454,7 @@ // CHECK: [B10] // CHECK-NEXT: 1: a // CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, NoOp, const A) -// CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, A) +// CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, [B10.4], A) // CHECK-NEXT: 4: A b = a; // CHECK-NEXT: 5: b // CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A) @@ -417,7 +466,7 @@ // CHECK-NEXT: Preds (2): B2 B11 // CHECK-NEXT: Succs (2): B9 B1 // CHECK: [B11] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B11.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: Preds (1): B12 // CHECK-NEXT: Succs (1): B10 @@ -441,10 +490,12 @@ // CHECK: [B12 (ENTRY)] // CHECK-NEXT: Succs (1): B11 // CHECK: [B1] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A) // CHECK-NEXT: 2: A d; -// CHECK-NEXT: 3: [B1.2] (Lifetime ends) -// CHECK-NEXT: 4: [B11.2] (Lifetime ends) +// CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B1.2] (Lifetime ends) +// CHECK-NEXT: 5: [B11.2].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B11.2] (Lifetime ends) // CHECK-NEXT: Preds (2): B8 B2 // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] @@ -454,16 +505,20 @@ // CHECK-NEXT: Preds (2): B3 B6 // CHECK-NEXT: Succs (2): B10 B1 // CHECK: [B3] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) // CHECK-NEXT: 2: A c; -// CHECK-NEXT: 3: [B3.2] (Lifetime ends) -// CHECK-NEXT: 4: [B9.2] (Lifetime ends) +// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B3.2] (Lifetime ends) +// CHECK-NEXT: 5: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B9.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B5 // CHECK-NEXT: Succs (1): B2 // CHECK: [B4] // CHECK-NEXT: 1: return; -// CHECK-NEXT: 2: [B9.2] (Lifetime ends) -// CHECK-NEXT: 3: [B11.2] (Lifetime ends) +// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 3: [B9.2] (Lifetime ends) +// CHECK-NEXT: 4: [B11.2].~A() (Implicit destructor) +// CHECK-NEXT: 5: [B11.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B5 // CHECK-NEXT: Succs (1): B0 // CHECK: [B5] @@ -473,7 +528,8 @@ // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (2): B4 B3 // CHECK: [B6] -// CHECK-NEXT: 1: [B9.2] (Lifetime ends) +// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B9.2] (Lifetime ends) // CHECK-NEXT: T: continue; // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (1): B2 @@ -484,12 +540,13 @@ // CHECK-NEXT: Preds (1): B9 // CHECK-NEXT: Succs (2): B6 B5 // CHECK: [B8] -// CHECK-NEXT: 1: [B9.2] (Lifetime ends) +// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B9.2] (Lifetime ends) // CHECK-NEXT: T: break; // CHECK-NEXT: Preds (1): B9 // CHECK-NEXT: Succs (1): B1 // CHECK: [B9] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B9.2], A) // CHECK-NEXT: 2: A b; // CHECK-NEXT: 3: UV // CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) @@ -500,7 +557,7 @@ // CHECK-NEXT: Preds (1): B2 // CHECK-NEXT: Succs (1): B9 // CHECK: [B11] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B11.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: Preds (1): B12 // CHECK-NEXT: Succs (1): B9 @@ -524,26 +581,30 @@ // CHECK: [B6 (ENTRY)] // CHECK-NEXT: Succs (1): B5 // CHECK: [B1] -// CHECK-NEXT: 1: [B4.4] (Lifetime ends) -// CHECK-NEXT: 2: [B5.2] (Lifetime ends) +// CHECK-NEXT: 1: [B4.4].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B4.4] (Lifetime ends) +// CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B5.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B4 // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] // CHECK-NEXT: 1: b // CHECK-NEXT: 2: [B2.1].p -// CHECK-NEXT: 3: [B4.4] (Lifetime ends) +// CHECK-NEXT: 3: [B4.4].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B4.4] (Lifetime ends) // CHECK-NEXT: Preds (1): B3 // CHECK-NEXT: Succs (1): B4 // CHECK: [B3] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) // CHECK-NEXT: 2: A c; -// CHECK-NEXT: 3: [B3.2] (Lifetime ends) +// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B3.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B4 // CHECK-NEXT: Succs (1): B2 // CHECK: [B4] // CHECK-NEXT: 1: a // CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const A) -// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, A) +// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, [B4.4], A) // CHECK-NEXT: 4: A b = a; // CHECK-NEXT: 5: b // CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A) @@ -555,7 +616,7 @@ // CHECK-NEXT: Preds (2): B2 B5 // CHECK-NEXT: Succs (2): B3 B1 // CHECK: [B5] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B5.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: Preds (1): B6 // CHECK-NEXT: Succs (1): B4 @@ -569,31 +630,42 @@ // CHECK: [B12 (ENTRY)] // CHECK-NEXT: Succs (1): B11 // CHECK: [B1] -// CHECK-NEXT: 1: [B10.4] (Lifetime ends) -// CHECK-NEXT: 2: [B11.4] (Lifetime ends) -// CHECK-NEXT: 3: (CXXConstructExpr, A) -// CHECK-NEXT: 4: A f; -// CHECK-NEXT: 5: [B1.4] (Lifetime ends) -// CHECK-NEXT: 6: [B11.2] (Lifetime ends) +// CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B10.4] (Lifetime ends) +// CHECK-NEXT: 3: [B11.4].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B11.4] (Lifetime ends) +// CHECK-NEXT: 5: (CXXConstructExpr, [B1.6], A) +// CHECK-NEXT: 6: A f; +// CHECK-NEXT: 7: [B1.6].~A() (Implicit destructor) +// CHECK-NEXT: 8: [B1.6] (Lifetime ends) +// CHECK-NEXT: 9: [B11.2].~A() (Implicit destructor) +// CHECK-NEXT: 10: [B11.2] (Lifetime ends) // CHECK-NEXT: Preds (2): B8 B10 // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] -// CHECK-NEXT: 1: [B10.4] (Lifetime ends) +// CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B10.4] (Lifetime ends) // CHECK-NEXT: Preds (2): B3 B6 // CHECK-NEXT: Succs (1): B10 // CHECK: [B3] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A) // CHECK-NEXT: 2: A e; -// CHECK-NEXT: 3: [B3.2] (Lifetime ends) -// CHECK-NEXT: 4: [B9.2] (Lifetime ends) +// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B3.2] (Lifetime ends) +// CHECK-NEXT: 5: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 6: [B9.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B5 // CHECK-NEXT: Succs (1): B2 // CHECK: [B4] // CHECK-NEXT: 1: return; -// CHECK-NEXT: 2: [B9.2] (Lifetime ends) -// CHECK-NEXT: 3: [B10.4] (Lifetime ends) -// CHECK-NEXT: 4: [B11.4] (Lifetime ends) -// CHECK-NEXT: 5: [B11.2] (Lifetime ends) +// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 3: [B9.2] (Lifetime ends) +// CHECK-NEXT: 4: [B10.4].~A() (Implicit destructor) +// CHECK-NEXT: 5: [B10.4] (Lifetime ends) +// CHECK-NEXT: 6: [B11.4].~A() (Implicit destructor) +// CHECK-NEXT: 7: [B11.4] (Lifetime ends) +// CHECK-NEXT: 8: [B11.2].~A() (Implicit destructor) +// CHECK-NEXT: 9: [B11.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B5 // CHECK-NEXT: Succs (1): B0 // CHECK: [B5] @@ -603,7 +675,8 @@ // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (2): B4 B3 // CHECK: [B6] -// CHECK-NEXT: 1: [B9.2] (Lifetime ends) +// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B9.2] (Lifetime ends) // CHECK-NEXT: T: continue; // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (1): B2 @@ -614,12 +687,13 @@ // CHECK-NEXT: Preds (1): B9 // CHECK-NEXT: Succs (2): B6 B5 // CHECK: [B8] -// CHECK-NEXT: 1: [B9.2] (Lifetime ends) +// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B9.2] (Lifetime ends) // CHECK-NEXT: T: break; // CHECK-NEXT: Preds (1): B9 // CHECK-NEXT: Succs (1): B1 // CHECK: [B9] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B9.2], A) // CHECK-NEXT: 2: A d; // CHECK-NEXT: 3: UV // CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool) @@ -629,7 +703,7 @@ // CHECK: [B10] // CHECK-NEXT: 1: b // CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, NoOp, const A) -// CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, A) +// CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, [B10.4], A) // CHECK-NEXT: 4: A c = b; // CHECK-NEXT: 5: c // CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A) @@ -641,9 +715,9 @@ // CHECK-NEXT: Preds (2): B2 B11 // CHECK-NEXT: Succs (2): B9 B1 // CHECK: [B11] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B11.2], A) // CHECK-NEXT: 2: A a; -// CHECK-NEXT: 3: (CXXConstructExpr, A) +// CHECK-NEXT: 3: (CXXConstructExpr, [B11.4], A) // CHECK-NEXT: 4: A b; // CHECK-NEXT: Preds (1): B12 // CHECK-NEXT: Succs (1): B10 @@ -667,13 +741,16 @@ // CHECK: [B9 (ENTRY)] // CHECK-NEXT: Succs (1): B8 // CHECK: [B1] -// CHECK-NEXT: 1: [B7.4] (Lifetime ends) -// CHECK-NEXT: 2: [B8.2] (Lifetime ends) +// CHECK-NEXT: 1: [B7.4].~A() (Implicit destructor) +// CHECK-NEXT: 2: [B7.4] (Lifetime ends) +// CHECK-NEXT: 3: [B8.2].~A() (Implicit destructor) +// CHECK-NEXT: 4: [B8.2] (Lifetime ends) // CHECK-NEXT: Preds (1): B7 // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] // CHECK-NEXT: 1: [B5.4] ? [B3.3] : [B4.2] -// CHECK-NEXT: 2: [B7.4] (Lifetime ends) +// CHECK-NEXT: 2: [B7.4].~A() (Implicit destructor) +// CHECK-NEXT: 3: [B7.4] (Lifetime ends) // CHECK-NEXT: Preds (2): B3 B4 // CHECK-NEXT: Succs (1): B7 // CHECK: [B3] @@ -703,7 +780,7 @@ // CHECK: [B7] // CHECK-NEXT: 1: a // CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, NoOp, const A) -// CHECK-NEXT: 3: [B7.2] (CXXConstructExpr, A) +// CHECK-NEXT: 3: [B7.2] (CXXConstructExpr, [B7.4], A) // CHECK-NEXT: 4: A b = a; // CHECK-NEXT: 5: b // CHECK-NEXT: 6: [B7.5] (ImplicitCastExpr, NoOp, const class A) @@ -715,7 +792,7 @@ // CHECK-NEXT: Preds (2): B2 B8 // CHECK-NEXT: Succs (2): B6 B1 // CHECK: [B8] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B8.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: Preds (1): B9 // CHECK-NEXT: Succs (1): B7 @@ -727,7 +804,7 @@ // CHECK: [B2 (ENTRY)] // CHECK-NEXT: Succs (1): B1 // CHECK: [B1] -// CHECK-NEXT: 1: (CXXConstructExpr, A) +// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A) // CHECK-NEXT: 2: A a; // CHECK-NEXT: 3: int n; // CHECK-NEXT: 4: n @@ -735,8 +812,9 @@ // CHECK-NEXT: 6: a // CHECK-NEXT: 7: [B1.6].p // CHECK-NEXT: 8: [B1.7] = [B1.5] -// CHECK-NEXT: 9: [B1.2] (Lifetime ends) -// CHECK-NEXT: 10: [B1.3] (Lifetime ends) +// CHECK-NEXT: 9: [B1.2].~A() (Implicit destructor) +// CHECK-NEXT: 10: [B1.2] (Lifetime ends) +// CHECK-NEXT: 11: [B1.3] (Lifetime ends) // CHECK-NEXT: Preds (1): B2 // CHECK-NEXT: Succs (1): B0 // CHECK: [B0 (EXIT)] @@ -819,15 +897,17 @@ // CHECK: [B1] // CHECK-NEXT: 1: i // CHECK-NEXT: 2: [B1.1]++ -// CHECK-NEXT: 3: [B2.4] (Lifetime ends) -// CHECK-NEXT: 4: [B2.2] (Lifetime ends) -// CHECK-NEXT: 5: [B3.1] (Lifetime ends) +// CHECK-NEXT: 3: [B2.4].~B() (Implicit destructor) +// CHECK-NEXT: 4: [B2.4] (Lifetime ends) +// CHECK-NEXT: 5: [B2.2].~B() (Implicit destructor) +// CHECK-NEXT: 6: [B2.2] (Lifetime ends) +// CHECK-NEXT: 7: [B3.1] (Lifetime ends) // CHECK-NEXT: Succs (1): B0 // CHECK: [B2] // CHECK-NEXT: label: -// CHECK-NEXT: 1: (CXXConstructExpr, B) +// CHECK-NEXT: 1: (CXXConstructExpr, [B2.2], B) // CHECK-NEXT: 2: B b1; -// CHECK-NEXT: 3: (CXXConstructExpr, B) +// CHECK-NEXT: 3: (CXXConstructExpr, [B2.4], B) // CHECK-NEXT: 4: B b2; // CHECK-NEXT: Preds (2): B3 B4 // CHECK-NEXT: Succs (1): B4 @@ -836,8 +916,10 @@ // CHECK-NEXT: Preds (1): B5 // CHECK-NEXT: Succs (1): B2 // CHECK: [B4] -// CHECK-NEXT: 1: [B2.4] (Lifetime ends) -// CHECK-NEXT: 2: [B2.2] (Lifetime ends) +// CHECK-NEXT: 1: [B2.4].~B() (Implicit destructor) +// CHECK-NEXT: 2: [B2.4] (Lifetime ends) +// CHECK-NEXT: 3: [B2.2].~B() (Implicit destructor) +// CHECK-NEXT: 4: [B2.2] (Lifetime ends) // CHECK-NEXT: T: goto label; // CHECK-NEXT: Preds (1): B2 // CHECK-NEXT: Succs (1): B2
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits