966 lines · cpp
1// RUN: %clang_analyze_cc1 -fcxx-exceptions -fexceptions -analyzer-checker=debug.DumpCFG -analyzer-config cfg-lifetime=true %s > %t 2>&12// RUN: FileCheck --input-file=%t %s3 4// FIXME Most of the cases in this file test only with the objects of type `A`,5// that has a non-trivial destructor. The types with a trivial destructor6// ends their lifetime when the underlying memory is released, i.e. they7// are destroyed last, after all objects with non-trivial destructors.8// Consequently, they are handled differently in code, and we should make 9// sure that test cover also trivially destructible types.10 11extern bool UV;12class A {13public:14 // CHECK: [B2 (ENTRY)]15 // CHECK-NEXT: Succs (1): B116 // CHECK: [B1]17 // CHECK-NEXT: 1: true18 // CHECK-NEXT: 2: UV19 // CHECK-NEXT: 3: [B1.2] = [B1.1]20 // CHECK-NEXT: Preds (1): B221 // CHECK-NEXT: Succs (1): B022 // CHECK: [B0 (EXIT)]23 // CHECK-NEXT: Preds (1): B124 A() {25 UV = true;26 }27 // CHECK: [B3 (ENTRY)]28 // CHECK-NEXT: Succs (1): B229 // CHECK: [B1]30 // CHECK-NEXT: 1: 031 // CHECK-NEXT: 2: this32 // CHECK-NEXT: 3: [B1.2]->p33 // CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, LValueToRValue, int *)34 // CHECK-NEXT: 5: *[B1.4]35 // CHECK-NEXT: 6: [B1.5] = [B1.1]36 // CHECK-NEXT: Preds (1): B237 // CHECK-NEXT: Succs (1): B038 // CHECK: [B2]39 // CHECK-NEXT: 1: this40 // CHECK-NEXT: 2: [B2.1]->p41 // CHECK-NEXT: 3: [B2.2] (ImplicitCastExpr, LValueToRValue, int *)42 // CHECK-NEXT: 4: [B2.3] (ImplicitCastExpr, PointerToBoolean, _Bool)43 // CHECK-NEXT: T: if [B2.4]44 // CHECK-NEXT: Preds (1): B345 // CHECK-NEXT: Succs (2): B1 B046 // CHECK: [B0 (EXIT)]47 // CHECK-NEXT: Preds (2): B1 B248 ~A() {49 if (p)50 *p = 0;51 }52 // CHECK: [B2 (ENTRY)]53 // CHECK-NEXT: Succs (1): B154 // CHECK: [B1]55 // CHECK-NEXT: 1: 156 // CHECK-NEXT: 2: return [B1.1];57 // CHECK-NEXT: Preds (1): B258 // CHECK-NEXT: Succs (1): B059 // CHECK: [B0 (EXIT)]60 // CHECK-NEXT: Preds (1): B161 operator int() const { return 1; }62 int *p;63};64 65// CHECK: [B2 (ENTRY)]66// CHECK-NEXT: Succs (1): B167// CHECK: [B1]68// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A)69// CHECK-NEXT: 2: A a;70// CHECK-NEXT: 3: a71// CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, NoOp, const A)72// CHECK-NEXT: 5: const A &b = a;73// CHECK-NEXT: 6: A() (CXXConstructExpr, [B1.9], A)74// CHECK-NEXT: 7: [B1.6] (BindTemporary)75// CHECK-NEXT: 8: [B1.7] (ImplicitCastExpr, NoOp, const A)76// CHECK-NEXT: 9: [B1.8]77// CHECK-NEXT: 10: const A &c = A();78// CHECK-NEXT: 11: [B1.10].~A() (Implicit destructor)79// CHECK-NEXT: 12: [B1.10] (Lifetime ends)80// CHECK-NEXT: 13: [B1.2].~A() (Implicit destructor)81// CHECK-NEXT: 14: [B1.2] (Lifetime ends)82// CHECK-NEXT: 15: [B1.5] (Lifetime ends)83// CHECK-NEXT: Preds (1): B284// CHECK-NEXT: Succs (1): B085// CHECK: [B0 (EXIT)]86// CHECK-NEXT: Preds (1): B187void test_const_ref() {88 A a;89 const A &b = a;90 const A &c = A();91}92 93// CHECK: [B2 (ENTRY)]94// CHECK-NEXT: Succs (1): B195// CHECK: [B1]96// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A[2])97// CHECK-NEXT: 2: A a[2];98// CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A[0])99// CHECK-NEXT: 4: A b[0];100// CHECK-NEXT: 5: [B1.2].~A[2]() (Implicit destructor)101// lifetime of a ends when its destructors are run102// CHECK-NEXT: 6: [B1.2] (Lifetime ends)103// lifetime of b ends when its storage duration ends104// CHECK-NEXT: 7: [B1.4] (Lifetime ends)105// CHECK-NEXT: Preds (1): B2106// CHECK-NEXT: Succs (1): B0107// CHECK: [B0 (EXIT)]108// CHECK-NEXT: Preds (1): B1109void test_array() {110 A a[2];111 A b[0];112}113 114// CHECK: [B2 (ENTRY)]115// CHECK-NEXT: Succs (1): B1116// CHECK: [B1]117// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A)118// CHECK-NEXT: 2: A a;119// CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A)120// CHECK-NEXT: 4: A c;121// CHECK-NEXT: 5: (CXXConstructExpr, [B1.6], A)122// CHECK-NEXT: 6: A d;123// CHECK-NEXT: 7: [B1.6].~A() (Implicit destructor)124// CHECK-NEXT: 8: [B1.6] (Lifetime ends)125// CHECK-NEXT: 9: [B1.4].~A() (Implicit destructor)126// CHECK-NEXT: 10: [B1.4] (Lifetime ends)127// CHECK-NEXT: 11: (CXXConstructExpr, [B1.12], A)128// CHECK-NEXT: 12: A b;129// CHECK-NEXT: 13: [B1.12].~A() (Implicit destructor)130// CHECK-NEXT: 14: [B1.12] (Lifetime ends)131// CHECK-NEXT: 15: [B1.2].~A() (Implicit destructor)132// CHECK-NEXT: 16: [B1.2] (Lifetime ends)133// CHECK-NEXT: Preds (1): B2134// CHECK-NEXT: Succs (1): B0135// CHECK: [B0 (EXIT)]136// CHECK-NEXT: Preds (1): B1137void test_scope() {138 A a;139 {140 A c;141 A d;142 }143 A b;144}145 146// CHECK: [B4 (ENTRY)]147// CHECK-NEXT: Succs (1): B3148// CHECK: [B1]149// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A)150// CHECK-NEXT: 2: A c;151// CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor)152// CHECK-NEXT: 4: [B1.2] (Lifetime ends)153// CHECK-NEXT: 5: [B3.4].~A() (Implicit destructor)154// CHECK-NEXT: 6: [B3.4] (Lifetime ends)155// CHECK-NEXT: 7: [B3.2].~A() (Implicit destructor)156// CHECK-NEXT: 8: [B3.2] (Lifetime ends)157// CHECK-NEXT: Preds (1): B3158// CHECK-NEXT: Succs (1): B0159// CHECK: [B2]160// CHECK-NEXT: 1: return;161// CHECK-NEXT: 2: [B3.4].~A() (Implicit destructor)162// CHECK-NEXT: 3: [B3.4] (Lifetime ends)163// CHECK-NEXT: 4: [B3.2].~A() (Implicit destructor)164// CHECK-NEXT: 5: [B3.2] (Lifetime ends)165// CHECK-NEXT: Preds (1): B3166// CHECK-NEXT: Succs (1): B0167// CHECK: [B3]168// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A)169// CHECK-NEXT: 2: A a;170// CHECK-NEXT: 3: (CXXConstructExpr, [B3.4], A)171// CHECK-NEXT: 4: A b;172// CHECK-NEXT: 5: UV173// CHECK-NEXT: 6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool)174// CHECK-NEXT: T: if [B3.6]175// CHECK-NEXT: Preds (1): B4176// CHECK-NEXT: Succs (2): B2 B1177// CHECK: [B0 (EXIT)]178// CHECK-NEXT: Preds (2): B1 B2179void test_return() {180 A a;181 A b;182 if (UV)183 return;184 A c;185}186 187// CHECK: [B5 (ENTRY)]188// CHECK-NEXT: Succs (1): B4189// CHECK: [B1]190// CHECK-NEXT: 1: [B4.6].~A() (Implicit destructor)191// CHECK-NEXT: 2: [B4.6] (Lifetime ends)192// CHECK-NEXT: 3: [B4.2].~A() (Implicit destructor)193// CHECK-NEXT: 4: [B4.2] (Lifetime ends)194// CHECK-NEXT: Preds (2): B2 B3195// CHECK-NEXT: Succs (1): B0196// CHECK: [B2]197// CHECK-NEXT: 1: (CXXConstructExpr, [B2.2], A)198// CHECK-NEXT: 2: A c;199// CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor)200// CHECK-NEXT: 4: [B2.2] (Lifetime ends)201// CHECK-NEXT: Preds (1): B4202// CHECK-NEXT: Succs (1): B1203// CHECK: [B3]204// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A)205// CHECK-NEXT: 2: A c;206// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)207// CHECK-NEXT: 4: [B3.2] (Lifetime ends)208// CHECK-NEXT: Preds (1): B4209// CHECK-NEXT: Succs (1): B1210// CHECK: [B4]211// CHECK-NEXT: 1: (CXXConstructExpr, [B4.2], A)212// CHECK-NEXT: 2: A a;213// CHECK-NEXT: 3: a214// CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, NoOp, const A)215// CHECK-NEXT: 5: [B4.4] (CXXConstructExpr, [B4.6], A)216// CHECK-NEXT: 6: A b = a;217// CHECK-NEXT: 7: b218// CHECK-NEXT: 8: [B4.7] (ImplicitCastExpr, NoOp, const class A)219// CHECK-NEXT: 9: [B4.8].operator int220// CHECK-NEXT: 10: [B4.8]221// CHECK-NEXT: 11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int)222// CHECK-NEXT: 12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)223// CHECK-NEXT: T: if [B4.12]224// CHECK-NEXT: Preds (1): B5225// CHECK-NEXT: Succs (2): B3 B2226// CHECK: [B0 (EXIT)]227// CHECK-NEXT: Preds (1): B1228void test_if_implicit_scope() {229 A a;230 if (A b = a)231 A c;232 else233 A c;234}235 236// CHECK: [B9 (ENTRY)]237// CHECK-NEXT: Succs (1): B8238// CHECK: [B1]239// CHECK-NEXT: 1: [B8.6].~A() (Implicit destructor)240// CHECK-NEXT: 2: [B8.6] (Lifetime ends)241// CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A)242// CHECK-NEXT: 4: A e;243// CHECK-NEXT: 5: [B1.4].~A() (Implicit destructor)244// CHECK-NEXT: 6: [B1.4] (Lifetime ends)245// CHECK-NEXT: 7: [B8.2].~A() (Implicit destructor)246// CHECK-NEXT: 8: [B8.2] (Lifetime ends)247// CHECK-NEXT: Preds (2): B2 B5248// CHECK-NEXT: Succs (1): B0249// CHECK: [B2]250// CHECK-NEXT: 1: (CXXConstructExpr, [B2.2], A)251// CHECK-NEXT: 2: A d;252// CHECK-NEXT: 3: [B2.2].~A() (Implicit destructor)253// CHECK-NEXT: 4: [B2.2] (Lifetime ends)254// CHECK-NEXT: 5: [B4.2].~A() (Implicit destructor)255// CHECK-NEXT: 6: [B4.2] (Lifetime ends)256// CHECK-NEXT: Preds (1): B4257// CHECK-NEXT: Succs (1): B1258// CHECK: [B3]259// CHECK-NEXT: 1: return;260// CHECK-NEXT: 2: [B4.2].~A() (Implicit destructor)261// CHECK-NEXT: 3: [B4.2] (Lifetime ends)262// CHECK-NEXT: 4: [B8.6].~A() (Implicit destructor)263// CHECK-NEXT: 5: [B8.6] (Lifetime ends)264// CHECK-NEXT: 6: [B8.2].~A() (Implicit destructor)265// CHECK-NEXT: 7: [B8.2] (Lifetime ends)266// CHECK-NEXT: Preds (1): B4267// CHECK-NEXT: Succs (1): B0268// CHECK: [B4]269// CHECK-NEXT: 1: (CXXConstructExpr, [B4.2], A)270// CHECK-NEXT: 2: A c;271// CHECK-NEXT: 3: UV272// CHECK-NEXT: 4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool)273// CHECK-NEXT: T: if [B4.4]274// CHECK-NEXT: Preds (1): B8275// CHECK-NEXT: Succs (2): B3 B2276// CHECK: [B5]277// CHECK-NEXT: 1: (CXXConstructExpr, [B5.2], A)278// CHECK-NEXT: 2: A d;279// CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor)280// CHECK-NEXT: 4: [B5.2] (Lifetime ends)281// CHECK-NEXT: 5: [B7.2].~A() (Implicit destructor)282// CHECK-NEXT: 6: [B7.2] (Lifetime ends)283// CHECK-NEXT: Preds (1): B7284// CHECK-NEXT: Succs (1): B1285// CHECK: [B6]286// CHECK-NEXT: 1: return;287// CHECK-NEXT: 2: [B7.2].~A() (Implicit destructor)288// CHECK-NEXT: 3: [B7.2] (Lifetime ends)289// CHECK-NEXT: 4: [B8.6].~A() (Implicit destructor)290// CHECK-NEXT: 5: [B8.6] (Lifetime ends)291// CHECK-NEXT: 6: [B8.2].~A() (Implicit destructor)292// CHECK-NEXT: 7: [B8.2] (Lifetime ends)293// CHECK-NEXT: Preds (1): B7294// CHECK-NEXT: Succs (1): B0295// CHECK: [B7]296// CHECK-NEXT: 1: (CXXConstructExpr, [B7.2], A)297// CHECK-NEXT: 2: A c;298// CHECK-NEXT: 3: UV299// CHECK-NEXT: 4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool)300// CHECK-NEXT: T: if [B7.4]301// CHECK-NEXT: Preds (1): B8302// CHECK-NEXT: Succs (2): B6 B5303// CHECK: [B8]304// CHECK-NEXT: 1: (CXXConstructExpr, [B8.2], A)305// CHECK-NEXT: 2: A a;306// CHECK-NEXT: 3: a307// CHECK-NEXT: 4: [B8.3] (ImplicitCastExpr, NoOp, const A)308// CHECK-NEXT: 5: [B8.4] (CXXConstructExpr, [B8.6], A)309// CHECK-NEXT: 6: A b = a;310// CHECK-NEXT: 7: b311// CHECK-NEXT: 8: [B8.7] (ImplicitCastExpr, NoOp, const class A)312// CHECK-NEXT: 9: [B8.8].operator int313// CHECK-NEXT: 10: [B8.8]314// CHECK-NEXT: 11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int)315// CHECK-NEXT: 12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)316// CHECK-NEXT: T: if [B8.12]317// CHECK-NEXT: Preds (1): B9318// CHECK-NEXT: Succs (2): B7 B4319// CHECK: [B0 (EXIT)]320// CHECK-NEXT: Preds (3): B1 B3 B6321void test_if_jumps() {322 A a;323 if (A b = a) {324 A c;325 if (UV)326 return;327 A d;328 } else {329 A c;330 if (UV)331 return;332 A d;333 }334 A e;335}336 337// CHECK: [B6 (ENTRY)]338// CHECK-NEXT: Succs (1): B5339// CHECK: [B1]340// CHECK-NEXT: 1: [B4.4].~A() (Implicit destructor)341// CHECK-NEXT: 2: [B4.4] (Lifetime ends)342// CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor)343// CHECK-NEXT: 4: [B5.2] (Lifetime ends)344// CHECK-NEXT: Preds (1): B4345// CHECK-NEXT: Succs (1): B0346// CHECK: [B2]347// CHECK-NEXT: Preds (1): B3348// CHECK-NEXT: Succs (1): B4349// CHECK: [B3]350// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A)351// CHECK-NEXT: 2: A c;352// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)353// CHECK-NEXT: 4: [B3.2] (Lifetime ends)354// CHECK-NEXT: 5: [B4.4].~A() (Implicit destructor)355// CHECK-NEXT: 6: [B4.4] (Lifetime ends)356// CHECK-NEXT: Preds (1): B4357// CHECK-NEXT: Succs (1): B2358// CHECK: [B4]359// CHECK-NEXT: 1: a360// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const A)361// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, [B4.4], A)362// CHECK-NEXT: 4: A b = a;363// CHECK-NEXT: 5: b364// CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A)365// CHECK-NEXT: 7: [B4.6].operator int366// CHECK-NEXT: 8: [B4.6]367// CHECK-NEXT: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)368// CHECK-NEXT: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)369// CHECK-NEXT: T: while [B4.10]370// CHECK-NEXT: Preds (2): B2 B5371// CHECK-NEXT: Succs (2): B3 B1372// CHECK: [B5]373// CHECK-NEXT: 1: (CXXConstructExpr, [B5.2], A)374// CHECK-NEXT: 2: A a;375// CHECK-NEXT: Preds (1): B6376// CHECK-NEXT: Succs (1): B4377// CHECK: [B0 (EXIT)]378// CHECK-NEXT: Preds (1): B1379void test_while_implicit_scope() {380 A a;381 while (A b = a)382 A c;383}384 385// CHECK: [B12 (ENTRY)]386// CHECK-NEXT: Succs (1): B11387// CHECK: [B1]388// CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor)389// CHECK-NEXT: 2: [B10.4] (Lifetime ends)390// CHECK-NEXT: 3: (CXXConstructExpr, [B1.4], A)391// CHECK-NEXT: 4: A e;392// CHECK-NEXT: 5: [B1.4].~A() (Implicit destructor)393// CHECK-NEXT: 6: [B1.4] (Lifetime ends)394// CHECK-NEXT: 7: [B11.2].~A() (Implicit destructor)395// CHECK-NEXT: 8: [B11.2] (Lifetime ends)396// CHECK-NEXT: Preds (2): B8 B10397// CHECK-NEXT: Succs (1): B0398// CHECK: [B2]399// CHECK-NEXT: Preds (2): B3 B6400// CHECK-NEXT: Succs (1): B10401// CHECK: [B3]402// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A)403// CHECK-NEXT: 2: A d;404// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)405// CHECK-NEXT: 4: [B3.2] (Lifetime ends)406// CHECK-NEXT: 5: [B9.2].~A() (Implicit destructor)407// CHECK-NEXT: 6: [B9.2] (Lifetime ends)408// CHECK-NEXT: 7: [B10.4].~A() (Implicit destructor)409// CHECK-NEXT: 8: [B10.4] (Lifetime ends)410// CHECK-NEXT: Preds (1): B5411// CHECK-NEXT: Succs (1): B2412// CHECK: [B4]413// CHECK-NEXT: 1: return;414// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor)415// CHECK-NEXT: 3: [B9.2] (Lifetime ends)416// CHECK-NEXT: 4: [B10.4].~A() (Implicit destructor)417// CHECK-NEXT: 5: [B10.4] (Lifetime ends)418// CHECK-NEXT: 6: [B11.2].~A() (Implicit destructor)419// CHECK-NEXT: 7: [B11.2] (Lifetime ends)420// CHECK-NEXT: Preds (1): B5421// CHECK-NEXT: Succs (1): B0422// CHECK: [B5]423// CHECK-NEXT: 1: UV424// CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)425// CHECK-NEXT: T: if [B5.2]426// CHECK-NEXT: Preds (1): B7427// CHECK-NEXT: Succs (2): B4 B3428// CHECK: [B6]429// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)430// CHECK-NEXT: 2: [B9.2] (Lifetime ends)431// CHECK-NEXT: 3: [B10.4].~A() (Implicit destructor)432// CHECK-NEXT: 4: [B10.4] (Lifetime ends)433// CHECK-NEXT: T: continue;434// CHECK-NEXT: Preds (1): B7435// CHECK-NEXT: Succs (1): B2436// CHECK: [B7]437// CHECK-NEXT: 1: UV438// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)439// CHECK-NEXT: T: if [B7.2]440// CHECK-NEXT: Preds (1): B9441// CHECK-NEXT: Succs (2): B6 B5442// CHECK: [B8]443// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)444// CHECK-NEXT: 2: [B9.2] (Lifetime ends)445// CHECK-NEXT: T: break;446// CHECK-NEXT: Preds (1): B9447// CHECK-NEXT: Succs (1): B1448// CHECK: [B9]449// CHECK-NEXT: 1: (CXXConstructExpr, [B9.2], A)450// CHECK-NEXT: 2: A c;451// CHECK-NEXT: 3: UV452// CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)453// CHECK-NEXT: T: if [B9.4]454// CHECK-NEXT: Preds (1): B10455// CHECK-NEXT: Succs (2): B8 B7456// CHECK: [B10]457// CHECK-NEXT: 1: a458// CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, NoOp, const A)459// CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, [B10.4], A)460// CHECK-NEXT: 4: A b = a;461// CHECK-NEXT: 5: b462// CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A)463// CHECK-NEXT: 7: [B10.6].operator int464// CHECK-NEXT: 8: [B10.6]465// CHECK-NEXT: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)466// CHECK-NEXT: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)467// CHECK-NEXT: T: while [B10.10]468// CHECK-NEXT: Preds (2): B2 B11469// CHECK-NEXT: Succs (2): B9 B1470// CHECK: [B11]471// CHECK-NEXT: 1: (CXXConstructExpr, [B11.2], A)472// CHECK-NEXT: 2: A a;473// CHECK-NEXT: Preds (1): B12474// CHECK-NEXT: Succs (1): B10475// CHECK: [B0 (EXIT)]476// CHECK-NEXT: Preds (2): B1 B4477void test_while_jumps() {478 A a;479 while (A b = a) {480 A c;481 if (UV)482 break;483 if (UV)484 continue;485 if (UV)486 return;487 A d;488 }489 A e;490}491 492// CHECK: [B12 (ENTRY)]493// CHECK-NEXT: Succs (1): B11494// CHECK: [B1]495// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A)496// CHECK-NEXT: 2: A d;497// CHECK-NEXT: 3: [B1.2].~A() (Implicit destructor)498// CHECK-NEXT: 4: [B1.2] (Lifetime ends)499// CHECK-NEXT: 5: [B11.2].~A() (Implicit destructor)500// CHECK-NEXT: 6: [B11.2] (Lifetime ends)501// CHECK-NEXT: Preds (2): B8 B2502// CHECK-NEXT: Succs (1): B0503// CHECK: [B2]504// CHECK-NEXT: 1: UV505// CHECK-NEXT: 2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)506// CHECK-NEXT: T: do ... while [B2.2]507// CHECK-NEXT: Preds (2): B3 B6508// CHECK-NEXT: Succs (2): B10 B1509// CHECK: [B3]510// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A)511// CHECK-NEXT: 2: A c;512// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)513// CHECK-NEXT: 4: [B3.2] (Lifetime ends)514// CHECK-NEXT: 5: [B9.2].~A() (Implicit destructor)515// CHECK-NEXT: 6: [B9.2] (Lifetime ends)516// CHECK-NEXT: Preds (1): B5517// CHECK-NEXT: Succs (1): B2518// CHECK: [B4]519// CHECK-NEXT: 1: return;520// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor)521// CHECK-NEXT: 3: [B9.2] (Lifetime ends)522// CHECK-NEXT: 4: [B11.2].~A() (Implicit destructor)523// CHECK-NEXT: 5: [B11.2] (Lifetime ends)524// CHECK-NEXT: Preds (1): B5525// CHECK-NEXT: Succs (1): B0526// CHECK: [B5]527// CHECK-NEXT: 1: UV528// CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)529// CHECK-NEXT: T: if [B5.2]530// CHECK-NEXT: Preds (1): B7531// CHECK-NEXT: Succs (2): B4 B3532// CHECK: [B6]533// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)534// CHECK-NEXT: 2: [B9.2] (Lifetime ends)535// CHECK-NEXT: T: continue;536// CHECK-NEXT: Preds (1): B7537// CHECK-NEXT: Succs (1): B2538// CHECK: [B7]539// CHECK-NEXT: 1: UV540// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)541// CHECK-NEXT: T: if [B7.2]542// CHECK-NEXT: Preds (1): B9543// CHECK-NEXT: Succs (2): B6 B5544// CHECK: [B8]545// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)546// CHECK-NEXT: 2: [B9.2] (Lifetime ends)547// CHECK-NEXT: T: break;548// CHECK-NEXT: Preds (1): B9549// CHECK-NEXT: Succs (1): B1550// CHECK: [B9]551// CHECK-NEXT: 1: (CXXConstructExpr, [B9.2], A)552// CHECK-NEXT: 2: A b;553// CHECK-NEXT: 3: UV554// CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)555// CHECK-NEXT: T: if [B9.4]556// CHECK-NEXT: Preds (2): B10 B11557// CHECK-NEXT: Succs (2): B8 B7558// CHECK: [B10]559// CHECK-NEXT: Preds (1): B2560// CHECK-NEXT: Succs (1): B9561// CHECK: [B11]562// CHECK-NEXT: 1: (CXXConstructExpr, [B11.2], A)563// CHECK-NEXT: 2: A a;564// CHECK-NEXT: Preds (1): B12565// CHECK-NEXT: Succs (1): B9566// CHECK: [B0 (EXIT)]567// CHECK-NEXT: Preds (2): B1 B4568void test_do_jumps() {569 A a;570 do {571 A b;572 if (UV)573 break;574 if (UV)575 continue;576 if (UV)577 return;578 A c;579 } while (UV);580 A d;581}582 583// CHECK: [B6 (ENTRY)]584// CHECK-NEXT: Succs (1): B5585// CHECK: [B1]586// CHECK-NEXT: 1: [B4.4].~A() (Implicit destructor)587// CHECK-NEXT: 2: [B4.4] (Lifetime ends)588// CHECK-NEXT: 3: [B5.2].~A() (Implicit destructor)589// CHECK-NEXT: 4: [B5.2] (Lifetime ends)590// CHECK-NEXT: Preds (1): B4591// CHECK-NEXT: Succs (1): B0592// CHECK: [B2]593// CHECK-NEXT: 1: b594// CHECK-NEXT: 2: [B2.1].p595// CHECK-NEXT: 3: [B4.4].~A() (Implicit destructor)596// CHECK-NEXT: 4: [B4.4] (Lifetime ends)597// CHECK-NEXT: Preds (1): B3598// CHECK-NEXT: Succs (1): B4599// CHECK: [B3]600// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A)601// CHECK-NEXT: 2: A c;602// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)603// CHECK-NEXT: 4: [B3.2] (Lifetime ends)604// CHECK-NEXT: Preds (1): B4605// CHECK-NEXT: Succs (1): B2606// CHECK: [B4]607// CHECK-NEXT: 1: a608// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NoOp, const A)609// CHECK-NEXT: 3: [B4.2] (CXXConstructExpr, [B4.4], A)610// CHECK-NEXT: 4: A b = a;611// CHECK-NEXT: 5: b612// CHECK-NEXT: 6: [B4.5] (ImplicitCastExpr, NoOp, const class A)613// CHECK-NEXT: 7: [B4.6].operator int614// CHECK-NEXT: 8: [B4.6]615// CHECK-NEXT: 9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)616// CHECK-NEXT: 10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)617// CHECK-NEXT: T: for (...; [B4.10]; ...)618// CHECK-NEXT: Preds (2): B2 B5619// CHECK-NEXT: Succs (2): B3 B1620// CHECK: [B5]621// CHECK-NEXT: 1: (CXXConstructExpr, [B5.2], A)622// CHECK-NEXT: 2: A a;623// CHECK-NEXT: Preds (1): B6624// CHECK-NEXT: Succs (1): B4625// CHECK: [B0 (EXIT)]626// CHECK-NEXT: Preds (1): B1627void test_for_implicit_scope() {628 for (A a; A b = a; b.p)629 A c;630}631 632// CHECK: [B12 (ENTRY)]633// CHECK-NEXT: Succs (1): B11634// CHECK: [B1]635// CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor)636// CHECK-NEXT: 2: [B10.4] (Lifetime ends)637// CHECK-NEXT: 3: [B11.4].~A() (Implicit destructor)638// CHECK-NEXT: 4: [B11.4] (Lifetime ends)639// CHECK-NEXT: 5: (CXXConstructExpr, [B1.6], A)640// CHECK-NEXT: 6: A f;641// CHECK-NEXT: 7: [B1.6].~A() (Implicit destructor)642// CHECK-NEXT: 8: [B1.6] (Lifetime ends)643// CHECK-NEXT: 9: [B11.2].~A() (Implicit destructor)644// CHECK-NEXT: 10: [B11.2] (Lifetime ends)645// CHECK-NEXT: Preds (2): B8 B10646// CHECK-NEXT: Succs (1): B0647// CHECK: [B2]648// CHECK-NEXT: 1: [B10.4].~A() (Implicit destructor)649// CHECK-NEXT: 2: [B10.4] (Lifetime ends)650// CHECK-NEXT: Preds (2): B3 B6651// CHECK-NEXT: Succs (1): B10652// CHECK: [B3]653// CHECK-NEXT: 1: (CXXConstructExpr, [B3.2], A)654// CHECK-NEXT: 2: A e;655// CHECK-NEXT: 3: [B3.2].~A() (Implicit destructor)656// CHECK-NEXT: 4: [B3.2] (Lifetime ends)657// CHECK-NEXT: 5: [B9.2].~A() (Implicit destructor)658// CHECK-NEXT: 6: [B9.2] (Lifetime ends)659// CHECK-NEXT: Preds (1): B5660// CHECK-NEXT: Succs (1): B2661// CHECK: [B4]662// CHECK-NEXT: 1: return;663// CHECK-NEXT: 2: [B9.2].~A() (Implicit destructor)664// CHECK-NEXT: 3: [B9.2] (Lifetime ends)665// CHECK-NEXT: 4: [B10.4].~A() (Implicit destructor)666// CHECK-NEXT: 5: [B10.4] (Lifetime ends)667// CHECK-NEXT: 6: [B11.4].~A() (Implicit destructor)668// CHECK-NEXT: 7: [B11.4] (Lifetime ends)669// CHECK-NEXT: 8: [B11.2].~A() (Implicit destructor)670// CHECK-NEXT: 9: [B11.2] (Lifetime ends)671// CHECK-NEXT: Preds (1): B5672// CHECK-NEXT: Succs (1): B0673// CHECK: [B5]674// CHECK-NEXT: 1: UV675// CHECK-NEXT: 2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)676// CHECK-NEXT: T: if [B5.2]677// CHECK-NEXT: Preds (1): B7678// CHECK-NEXT: Succs (2): B4 B3679// CHECK: [B6]680// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)681// CHECK-NEXT: 2: [B9.2] (Lifetime ends)682// CHECK-NEXT: T: continue;683// CHECK-NEXT: Preds (1): B7684// CHECK-NEXT: Succs (1): B2685// CHECK: [B7]686// CHECK-NEXT: 1: UV687// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)688// CHECK-NEXT: T: if [B7.2]689// CHECK-NEXT: Preds (1): B9690// CHECK-NEXT: Succs (2): B6 B5691// CHECK: [B8]692// CHECK-NEXT: 1: [B9.2].~A() (Implicit destructor)693// CHECK-NEXT: 2: [B9.2] (Lifetime ends)694// CHECK-NEXT: T: break;695// CHECK-NEXT: Preds (1): B9696// CHECK-NEXT: Succs (1): B1697// CHECK: [B9]698// CHECK-NEXT: 1: (CXXConstructExpr, [B9.2], A)699// CHECK-NEXT: 2: A d;700// CHECK-NEXT: 3: UV701// CHECK-NEXT: 4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)702// CHECK-NEXT: T: if [B9.4]703// CHECK-NEXT: Preds (1): B10704// CHECK-NEXT: Succs (2): B8 B7705// CHECK: [B10]706// CHECK-NEXT: 1: b707// CHECK-NEXT: 2: [B10.1] (ImplicitCastExpr, NoOp, const A)708// CHECK-NEXT: 3: [B10.2] (CXXConstructExpr, [B10.4], A)709// CHECK-NEXT: 4: A c = b;710// CHECK-NEXT: 5: c711// CHECK-NEXT: 6: [B10.5] (ImplicitCastExpr, NoOp, const class A)712// CHECK-NEXT: 7: [B10.6].operator int713// CHECK-NEXT: 8: [B10.6]714// CHECK-NEXT: 9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)715// CHECK-NEXT: 10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)716// CHECK-NEXT: T: for (...; [B10.10]; )717// CHECK-NEXT: Preds (2): B2 B11718// CHECK-NEXT: Succs (2): B9 B1719// CHECK: [B11]720// CHECK-NEXT: 1: (CXXConstructExpr, [B11.2], A)721// CHECK-NEXT: 2: A a;722// CHECK-NEXT: 3: (CXXConstructExpr, [B11.4], A)723// CHECK-NEXT: 4: A b;724// CHECK-NEXT: Preds (1): B12725// CHECK-NEXT: Succs (1): B10726// CHECK: [B0 (EXIT)]727// CHECK-NEXT: Preds (2): B1 B4728void test_for_jumps() {729 A a;730 for (A b; A c = b; ) {731 A d;732 if (UV)733 break;734 if (UV)735 continue;736 if (UV)737 return;738 A e;739 }740 A f;741}742 743// CHECK: [B9 (ENTRY)]744// CHECK-NEXT: Succs (1): B8745// CHECK: [B1]746// CHECK-NEXT: 1: [B7.4].~A() (Implicit destructor)747// CHECK-NEXT: 2: [B7.4] (Lifetime ends)748// CHECK-NEXT: 3: [B8.2].~A() (Implicit destructor)749// CHECK-NEXT: 4: [B8.2] (Lifetime ends)750// CHECK-NEXT: Preds (1): B7751// CHECK-NEXT: Succs (1): B0752// CHECK: [B2]753// CHECK-NEXT: 1: [B5.4] ? [B3.3] : [B4.2]754// CHECK-NEXT: 2: [B7.4].~A() (Implicit destructor)755// CHECK-NEXT: 3: [B7.4] (Lifetime ends)756// CHECK-NEXT: Preds (2): B3 B4757// CHECK-NEXT: Succs (1): B7758// CHECK: [B3]759// CHECK-NEXT: 1: b760// CHECK-NEXT: 2: [B3.1].p761// CHECK-NEXT: 3: [B3.2]++762// CHECK-NEXT: Preds (1): B5763// CHECK-NEXT: Succs (1): B2764// CHECK: [B4]765// CHECK-NEXT: 1: 0766// CHECK-NEXT: 2: [B4.1] (ImplicitCastExpr, NullToPointer, int *)767// CHECK-NEXT: Preds (1): B5768// CHECK-NEXT: Succs (1): B2769// CHECK: [B5]770// CHECK-NEXT: 1: b771// CHECK-NEXT: 2: [B5.1].p772// CHECK-NEXT: 3: [B5.2] (ImplicitCastExpr, LValueToRValue, int *)773// CHECK-NEXT: 4: [B5.3] (ImplicitCastExpr, PointerToBoolean, _Bool)774// CHECK-NEXT: T: [B5.4] ? ... : ...775// CHECK-NEXT: Preds (1): B6776// CHECK-NEXT: Succs (2): B3 B4777// CHECK: [B6]778// CHECK-NEXT: 1: 0779// CHECK-NEXT: 2: (void)[B6.1] (CStyleCastExpr, ToVoid, void)780// CHECK-NEXT: Preds (1): B7781// CHECK-NEXT: Succs (1): B5782// CHECK: [B7]783// CHECK-NEXT: 1: a784// CHECK-NEXT: 2: [B7.1] (ImplicitCastExpr, NoOp, const A)785// CHECK-NEXT: 3: [B7.2] (CXXConstructExpr, [B7.4], A)786// CHECK-NEXT: 4: A b = a;787// CHECK-NEXT: 5: b788// CHECK-NEXT: 6: [B7.5] (ImplicitCastExpr, NoOp, const class A)789// CHECK-NEXT: 7: [B7.6].operator int790// CHECK-NEXT: 8: [B7.6]791// CHECK-NEXT: 9: [B7.8] (ImplicitCastExpr, UserDefinedConversion, int)792// CHECK-NEXT: 10: [B7.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)793// CHECK-NEXT: T: for (...; [B7.10]; ...)794// CHECK-NEXT: Preds (2): B2 B8795// CHECK-NEXT: Succs (2): B6 B1796// CHECK: [B8]797// CHECK-NEXT: 1: (CXXConstructExpr, [B8.2], A)798// CHECK-NEXT: 2: A a;799// CHECK-NEXT: Preds (1): B9800// CHECK-NEXT: Succs (1): B7801void test_for_inc_conditional() {802 for (A a; A b = a; b.p ? b.p++ : 0)803 (void)0;804}805 806// CHECK: [B2 (ENTRY)]807// CHECK-NEXT: Succs (1): B1808// CHECK: [B1]809// CHECK-NEXT: 1: (CXXConstructExpr, [B1.2], A)810// CHECK-NEXT: 2: A a;811// CHECK-NEXT: 3: int n;812// CHECK-NEXT: 4: n813// CHECK-NEXT: 5: &[B1.4]814// CHECK-NEXT: 6: a815// CHECK-NEXT: 7: [B1.6].p816// CHECK-NEXT: 8: [B1.7] = [B1.5]817// CHECK-NEXT: 9: [B1.2].~A() (Implicit destructor)818// CHECK-NEXT: 10: [B1.2] (Lifetime ends)819// CHECK-NEXT: 11: [B1.3] (Lifetime ends)820// CHECK-NEXT: Preds (1): B2821// CHECK-NEXT: Succs (1): B0822// CHECK: [B0 (EXIT)]823// CHECK-NEXT: Preds (1): B1824void test_trivial_vs_non_trivial_order() {825 A a;826 int n;827 a.p = &n;828}829 830// CHECK: [B4 (ENTRY)]831// CHECK-NEXT: Succs (1): B3832// CHECK: [B1]833// CHECK-NEXT: a:834// CHECK-NEXT: 1: 1835// CHECK-NEXT: 2: i836// CHECK-NEXT: 3: [B1.2] = [B1.1]837// CHECK-NEXT: 4: [B2.1] (Lifetime ends)838// CHECK-NEXT: Preds (2): B2 B3839// CHECK-NEXT: Succs (1): B0840// CHECK: [B2]841// CHECK-NEXT: 1: int i;842// CHECK-NEXT: Succs (1): B1843// CHECK: [B3]844// CHECK-NEXT: T: goto a;845// CHECK-NEXT: Preds (1): B4846// CHECK-NEXT: Succs (1): B1847// CHECK: [B0 (EXIT)]848// CHECK-NEXT: Preds (1): B1849void goto_past_declaration() {850 goto a;851 int i;852a:853 i = 1;854}855 856// CHECK: [B4 (ENTRY)]857// CHECK-NEXT: Succs (1): B3858// CHECK: [B1]859// CHECK-NEXT: a:860// CHECK-NEXT: 1: 1861// CHECK-NEXT: 2: k862// CHECK-NEXT: 3: [B1.2] = [B1.1]863// CHECK-NEXT: 4: [B2.4] (Lifetime ends)864// CHECK-NEXT: Preds (2): B2 B3865// CHECK-NEXT: Succs (1): B0866// CHECK: [B2]867// CHECK-NEXT: 1: int j;868// CHECK-NEXT: 2: [B2.1] (Lifetime ends)869// CHECK-NEXT: 3: [B3.1] (Lifetime ends)870// CHECK-NEXT: 4: int k;871// CHECK-NEXT: Succs (1): B1872// CHECK: [B3]873// CHECK-NEXT: 1: int i;874// CHECK-NEXT: 2: [B3.1] (Lifetime ends)875// CHECK-NEXT: T: goto a;876// CHECK-NEXT: Preds (1): B4877// CHECK-NEXT: Succs (1): B1878// CHECK: [B0 (EXIT)]879// CHECK-NEXT: Preds (1): B1880void goto_past_declaration2() {881 {882 int i;883 goto a;884 int j;885 }886 {887 int k;888 a:889 k = 1;890 }891}892 893struct B {894 ~B();895};896 897// CHECK: [B5 (ENTRY)]898// CHECK-NEXT: Succs (1): B3899// CHECK: [B1]900// CHECK-NEXT: 1: i901// CHECK-NEXT: 2: [B1.1]++902// CHECK-NEXT: 3: [B2.4].~B() (Implicit destructor)903// CHECK-NEXT: 4: [B2.4] (Lifetime ends)904// CHECK-NEXT: 5: [B2.2].~B() (Implicit destructor)905// CHECK-NEXT: 6: [B2.2] (Lifetime ends)906// CHECK-NEXT: 7: [B3.1] (Lifetime ends)907// CHECK-NEXT: Succs (1): B0908// CHECK: [B2]909// CHECK-NEXT: label:910// CHECK-NEXT: 1: (CXXConstructExpr, [B2.2], B)911// CHECK-NEXT: 2: B b1;912// CHECK-NEXT: 3: (CXXConstructExpr, [B2.4], B)913// CHECK-NEXT: 4: B b2;914// CHECK-NEXT: Preds (2): B3 B4915// CHECK-NEXT: Succs (1): B4916// CHECK: [B3]917// CHECK-NEXT: 1: int i;918// CHECK-NEXT: Preds (1): B5919// CHECK-NEXT: Succs (1): B2920// CHECK: [B4]921// CHECK-NEXT: 1: [B2.4].~B() (Implicit destructor)922// CHECK-NEXT: 2: [B2.4] (Lifetime ends)923// CHECK-NEXT: 3: [B2.2].~B() (Implicit destructor)924// CHECK-NEXT: 4: [B2.2] (Lifetime ends)925// CHECK-NEXT: T: goto label;926// CHECK-NEXT: Preds (1): B2927// CHECK-NEXT: Succs (1): B2928// CHECK: [B0 (EXIT)]929// CHECK-NEXT: Preds (1): B1930int backpatched_goto() {931 int i;932label:933 B b1;934 B b2;935 goto label;936 i++;937}938 939// CHECK: [B2 (ENTRY)]940// CHECK-NEXT: Succs (1): B1941// CHECK: [B1]942// CHECK-NEXT: 1: a943// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)944// CHECK-NEXT: 3: b945// CHECK-NEXT: 4: [B1.3] (ImplicitCastExpr, LValueToRValue, int)946// CHECK-NEXT: 5: [B1.2] + [B1.4]947// CHECK-NEXT: 6: c948// CHECK-NEXT: 7: [B1.6] (ImplicitCastExpr, LValueToRValue, int)949// CHECK-NEXT: 8: [B1.5] + [B1.7]950// CHECK-NEXT: 9: int res = a + b + c;951// CHECK-NEXT: 10: res952// CHECK-NEXT: 11: [B1.10] (ImplicitCastExpr, LValueToRValue, int)953// CHECK-NEXT: 12: return [B1.11];954// CHECK-NEXT: 13: [B1.9] (Lifetime ends)955// CHECK-NEXT: 14: [Parm: c] (Lifetime ends)956// CHECK-NEXT: 15: [Parm: b] (Lifetime ends)957// CHECK-NEXT: 16: [Parm: a] (Lifetime ends)958// CHECK-NEXT: Preds (1): B2959// CHECK-NEXT: Succs (1): B0960// CHECK: [B0 (EXIT)]961// CHECK-NEXT: Preds (1): B1962int test_param_scope_end_order(int a, int b, int c) {963 int res = a + b + c;964 return res; 965}966