brintos

brintos / llvm-project-archived public Read only

0
0
Text · 31.3 KiB · 36b36ed Raw
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