brintos

brintos / llvm-project-archived public Read only

0
0
Text · 47.4 KiB · 96b9a55 Raw
1337 lines · cpp
1// RUN: %clang_analyze_cc1 -std=c++98 -fcxx-exceptions -fexceptions -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=false %s > %t 2>&12// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,CXX98,WARNINGS %s3// RUN: %clang_analyze_cc1 -std=c++98 -fcxx-exceptions -fexceptions -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=true %s > %t 2>&14// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,CXX98,ANALYZER,CXX98-ANALYZER %s5// RUN: %clang_analyze_cc1 -std=c++11 -fcxx-exceptions -fexceptions -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=false %s > %t 2>&16// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,CXX11,WARNINGS,CXX11-WARNINGS %s7// RUN: %clang_analyze_cc1 -std=c++11 -fcxx-exceptions -fexceptions -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=true %s > %t 2>&18// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,CXX11,ANALYZER,CXX11-ANALYZER %s9 10// This file tests how we construct two different flavors of the Clang CFG -11// the CFG used by the Sema analysis-based warnings and the CFG used by the12// static analyzer. The difference in the behavior is checked via FileCheck13// prefixes (WARNINGS and ANALYZER respectively). When introducing new analyzer14// flags, no new run lines should be added - just these flags would go to the15// respective line depending on where is it turned on and where is it turned16// off. Feel free to add tests that test only one of the CFG flavors if you're17// not sure how the other flavor is supposed to work in your case.18 19class A {20public:21  int x;22 23// CHECK:      [B1 (ENTRY)]24// CHECK-NEXT:   Succs (1): B025// CHECK:      [B0 (EXIT)]26// CHECK-NEXT:   Preds (1): B127  A() {}28 29// CHECK:      [B1 (ENTRY)]30// CHECK-NEXT:   Succs (1): B031// CHECK:      [B0 (EXIT)]32// CHECK-NEXT:   Preds (1): B133  ~A() {}34 35// CHECK:      [B2 (ENTRY)]36// CHECK-NEXT:   Succs (1): B137// CHECK:      [B1]38// CHECK-NEXT:   1: 139// CHECK-NEXT:   2: return [B1.1];40// CHECK-NEXT:   Preds (1): B241// CHECK-NEXT:   Succs (1): B042// CHECK:      [B0 (EXIT)]43// CHECK-NEXT:   Preds (1): B144  operator int() const { return 1; }45};46 47extern const bool UV;48 49// CHECK:      [B2 (ENTRY)]50// CHECK-NEXT:   Succs (1): B151// CHECK:      [B1]52// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)53// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B1.2], A)54// CHECK-NEXT:   2: A a;55// CHECK-NEXT:   3: a56// CHECK-NEXT:   4: [B1.3] (ImplicitCastExpr, NoOp, const A)57// CHECK-NEXT:   5: const A &b = a;58// WARNINGS-NEXT:   6: A() (CXXConstructExpr, A)59// ANALYZER-NEXT:   6: A() (CXXConstructExpr, [B1.9], A)60// CHECK-NEXT:   7: [B1.6] (BindTemporary)61// CHECK-NEXT:   8: [B1.7] (ImplicitCastExpr, NoOp, const A)62// CHECK-NEXT:   9: [B1.8]63// CHECK:       10: const A &c = A();64// CHECK:       11: [B1.10].~A() (Implicit destructor)65// CHECK:       12: [B1.2].~A() (Implicit destructor)66// CHECK-NEXT:   Preds (1): B267// CHECK-NEXT:   Succs (1): B068// CHECK:      [B0 (EXIT)]69// CHECK-NEXT:   Preds (1): B170void test_const_ref() {71  A a;72  const A& b = a;73  const A& c = A();74}75 76// CHECK:      [B2 (ENTRY)]77// CHECK-NEXT:   Succs (1): B178// CHECK:      [B1]79// WARNINGS-NEXT:   1: A() (CXXConstructExpr, A)80// CXX98-ANALYZER-NEXT:   1: A() (CXXConstructExpr, [B1.2], A)81// CXX11-ANALYZER-NEXT:   1: A() (CXXConstructExpr, [B1.3], A)82// CHECK-NEXT:   2: [B1.1] (BindTemporary)83// CXX98-NEXT:   3: [B1.2].x84// CXX98-NEXT:   4: [B1.3]85// CXX98-NEXT:   5: const int &x = A().x;86// CXX98-NEXT:   6: [B1.5].~A() (Implicit destructor)87// CXX11-NEXT:   3: [B1.2]88// CXX11-NEXT:   4: [B1.3].x89// CXX11-NEXT:   5: [B1.4] (ImplicitCastExpr, NoOp, const int)90// CXX11-NEXT:   6: const int &x = A().x;91// CXX11-NEXT:   7: [B1.6].~A() (Implicit destructor)92// CHECK-NEXT:   Preds (1): B293// CHECK-NEXT:   Succs (1): B094// CHECK:      [B0 (EXIT)]95// CHECK-NEXT:   Preds (1): B196void test_const_ref_to_field() {97  const int &x = A().x;98}99 100// CHECK:        [B2 (ENTRY)]101// CHECK-NEXT:     Succs (1): B1102// CHECK:        [B1]103// WARNINGS-NEXT:     1: A() (CXXConstructExpr, A)104// CXX98-ANALYZER-NEXT:     1: A() (CXXConstructExpr, [B1.2], A)105// CXX11-ANALYZER-NEXT:     1: A() (CXXConstructExpr, [B1.3], A)106// CHECK-NEXT:     2: [B1.1] (BindTemporary)107// CXX98-NEXT:     3: A::x108// CXX98-NEXT:     4: &[B1.3]109// CXX98-NEXT:     5: [B1.2] .* [B1.4]110// CXX98-NEXT:     6: [B1.5]111// CXX98-NEXT:     7: const int &x = A() .* &A::x;112// CXX98-NEXT:     8: [B1.7].~A() (Implicit destructor)113// CXX11-NEXT:     3: [B1.2]114// CXX11-NEXT:     4: A::x115// CXX11-NEXT:     5: &[B1.4]116// CXX11-NEXT:     6: [B1.3] .* [B1.5]117// CXX11-NEXT:     7: [B1.6] (ImplicitCastExpr, NoOp, const int)118// CXX11-NEXT:     8: const int &x = A() .* &A::x;119// CXX11-NEXT:     9: [B1.8].~A() (Implicit destructor)120// CHECK-NEXT:     Preds (1): B2121// CHECK-NEXT:     Succs (1): B0122// CHECK:        [B0 (EXIT)]123// CHECK-NEXT:     Preds (1): B1124void test_pointer_to_member() {125  const int &x = A().*&A::x;126}127 128// FIXME: There should be automatic destructors at the end of scope.129// CHECK:        [B2 (ENTRY)]130// CHECK-NEXT:     Succs (1): B1131// CHECK:        [B1]132// WARNINGS-NEXT:     1: A() (CXXConstructExpr, A)133// ANALYZER-NEXT:     1: A() (CXXConstructExpr, [B1.4], A)134// CHECK-NEXT:     2: [B1.1] (BindTemporary)135// CHECK-NEXT:     3: [B1.2] (ImplicitCastExpr, NoOp, const A)136// CHECK-NEXT:     4: [B1.3]137// CHECK-NEXT:     5: {[B1.4]}138// CHECK-NEXT:     6: B b = {A()};139// WARNINGS-NEXT:     7: A() (CXXConstructExpr, A)140// ANALYZER-NEXT:     7: A() (CXXConstructExpr, [B1.10], A)141// CHECK-NEXT:     8: [B1.7] (BindTemporary)142// CHECK-NEXT:     9: [B1.8] (ImplicitCastExpr, NoOp, const A)143// CHECK-NEXT:    10: [B1.9]144// CHECK-NEXT:    11: {[B1.10]}145// WARNINGS-NEXT:    12: A() (CXXConstructExpr, A)146// ANALYZER-NEXT:    12: A() (CXXConstructExpr, [B1.15], A)147// CHECK-NEXT:    13: [B1.12] (BindTemporary)148// CHECK-NEXT:    14: [B1.13] (ImplicitCastExpr, NoOp, const A)149// CHECK-NEXT:    15: [B1.14]150// CHECK-NEXT:    16: {[B1.15]}151// CHECK-NEXT:    17: {[B1.10], [B1.15]}152// CHECK-NEXT:    18: B bb[2] = {A(), A()};153// CHECK-NEXT:     Preds (1): B2154// CHECK-NEXT:     Succs (1): B0155// CHECK:        [B0 (EXIT)]156// CHECK-NEXT:     Preds (1): B1157void test_aggregate_lifetime_extension() {158  struct B {159    const A &x;160  };161 162  B b = {A()};163  B bb[2] = {A(), A()};164}165 166// In C++98 such class 'C' will not be an aggregate.167#if __cplusplus >= 201103L168// FIXME: There should be automatic destructors at the end of the scope.169// CXX11:        [B2 (ENTRY)]170// CXX11-NEXT:     Succs (1): B1171// CXX11:        [B1]172// CXX11-WARNINGS-NEXT:     1: A() (CXXConstructExpr, A)173// CXX11-ANALYZER-NEXT:     1: A() (CXXConstructExpr, [B1.2], [B1.4], A)174// CXX11-NEXT:     2: [B1.1] (BindTemporary)175// CXX11-NEXT:     3: [B1.2] (ImplicitCastExpr, NoOp, const A)176// CXX11-NEXT:     4: [B1.3]177// CXX11-NEXT:     5: [B1.4] (CXXConstructExpr, const A)178// CXX11-WARNINGS-NEXT:     6: A() (CXXConstructExpr, A)179// CXX11-ANALYZER-NEXT:     6: A() (CXXConstructExpr, [B1.7], [B1.9], A)180// CXX11-NEXT:     7: [B1.6] (BindTemporary)181// CXX11-NEXT:     8: [B1.7] (ImplicitCastExpr, NoOp, const A)182// CXX11-NEXT:     9: [B1.8]183// CXX11-NEXT:    10: [B1.9] (CXXConstructExpr, const A)184// FIXME: Why does it look as if the initializer list consumes uncopied objects?185// CXX11-NEXT:    11: {[B1.2], [B1.7]}186// CXX11-NEXT:    12: [B1.11] (BindTemporary)187// CXX11-NEXT:    13: [B1.12]188// CXX11-NEXT:    14: {[B1.13]}189// Double curly braces trigger regexps, escape as per FileCheck manual.190// CXX11-NEXT:    15: C c = {{[{][{]}}A(), A(){{[}][}]}};191// CXX11-NEXT:    16: ~A() (Temporary object destructor)192// CXX11-NEXT:    17: ~A() (Temporary object destructor)193// CXX11-WARNINGS-NEXT:    18: A() (CXXConstructExpr, A)194// CXX11-ANALYZER-NEXT:    18: A() (CXXConstructExpr, [B1.19], [B1.21], A)195// CXX11-NEXT:    19: [B1.18] (BindTemporary)196// CXX11-NEXT:    20: [B1.19] (ImplicitCastExpr, NoOp, const A)197// CXX11-NEXT:    21: [B1.20]198// CXX11-NEXT:    22: [B1.21] (CXXConstructExpr, const A)199// CXX11-WARNINGS-NEXT:    23: A() (CXXConstructExpr, A)200// CXX11-ANALYZER-NEXT:    23: A() (CXXConstructExpr, [B1.24], [B1.26], A)201// CXX11-NEXT:    24: [B1.23] (BindTemporary)202// CXX11-NEXT:    25: [B1.24] (ImplicitCastExpr, NoOp, const A)203// CXX11-NEXT:    26: [B1.25]204// CXX11-NEXT:    27: [B1.26] (CXXConstructExpr, const A)205// FIXME: Why does it look as if the initializer list consumes uncopied objects?206// CXX11-NEXT:    28: {[B1.19], [B1.24]}207// CXX11-NEXT:    29: [B1.28] (BindTemporary)208// CXX11-NEXT:    30: [B1.29]209// CXX11-NEXT:    31: {[B1.30]}210// CXX11-WARNINGS-NEXT:    32: A() (CXXConstructExpr, A)211// CXX11-ANALYZER-NEXT:    32: A() (CXXConstructExpr, [B1.33], [B1.35], A)212// CXX11-NEXT:    33: [B1.32] (BindTemporary)213// CXX11-NEXT:    34: [B1.33] (ImplicitCastExpr, NoOp, const A)214// CXX11-NEXT:    35: [B1.34]215// CXX11-NEXT:    36: [B1.35] (CXXConstructExpr, const A)216// CXX11-WARNINGS-NEXT:    37: A() (CXXConstructExpr, A)217// CXX11-ANALYZER-NEXT:    37: A() (CXXConstructExpr, [B1.38], [B1.40], A)218// CXX11-NEXT:    38: [B1.37] (BindTemporary)219// CXX11-NEXT:    39: [B1.38] (ImplicitCastExpr, NoOp, const A)220// CXX11-NEXT:    40: [B1.39]221// CXX11-NEXT:    41: [B1.40] (CXXConstructExpr, const A)222// FIXME: Why does it look as if the initializer list consumes uncopied objects?223// CXX11-NEXT:    42: {[B1.33], [B1.38]}224// CXX11-NEXT:    43: [B1.42] (BindTemporary)225// CXX11-NEXT:    44: [B1.43]226// CXX11-NEXT:    45: {[B1.44]}227// Double curly braces trigger regexps, escape as per FileCheck manual.228// CXX11-NEXT:    46: {{[{][{]}}[B1.30]}, {[B1.44]{{[}][}]}}229// Double curly braces trigger regexps, escape as per FileCheck manual.230// CXX11-NEXT:    47: C cc[2] = {{[{][{][{]}}A(), A(){{[}][}]}}, {{[{][{]}}A(), A(){{[}][}][}]}};231// CXX11-NEXT:    48: ~A() (Temporary object destructor)232// CXX11-NEXT:    49: ~A() (Temporary object destructor)233// CXX11-NEXT:    50: ~A() (Temporary object destructor)234// CXX11-NEXT:    51: ~A() (Temporary object destructor)235// CXX11-NEXT:     Preds (1): B2236// CXX11-NEXT:     Succs (1): B0237// CXX11:        [B0 (EXIT)]238// CXX11-NEXT:     Preds (1): B1239void test_aggregate_array_lifetime_extension() {240  struct C {241    const A (&z)[2];242  };243 244  // Until C++17 there are elidable copies here, so there should be 9 temporary245  // destructors of A()s. There are no destructors of 'c' and 'cc' because this246  // aggregate has no destructor. Instead, arrays are lifetime-extended,247  // and copies of A()s within them need to be destroyed via automatic248  // destructors.249  C c = {{A(), A()}};250  C cc[2] = {{{A(), A()}}, {{A(), A()}}};251}252#endif253 254// CHECK:        [B2 (ENTRY)]255// CHECK-NEXT:     Succs (1): B1256// CHECK:        [B1]257// WARNINGS-NEXT:     1: A() (CXXConstructExpr, A)258// ANALYZER-NEXT:     1: A() (CXXConstructExpr, [B1.2], [B1.4], A)259// CHECK-NEXT:     2: [B1.1] (BindTemporary)260// CHECK-NEXT:     3: [B1.2] (ImplicitCastExpr, NoOp, const A)261// CHECK-NEXT:     4: [B1.3]262// CHECK-NEXT:     5: [B1.4] (CXXConstructExpr, A)263// WARNINGS-NEXT:     6: A() (CXXConstructExpr, A)264// ANALYZER-NEXT:     6: A() (CXXConstructExpr, [B1.7], [B1.9], A)265// CHECK-NEXT:     7: [B1.6] (BindTemporary)266// CHECK-NEXT:     8: [B1.7] (ImplicitCastExpr, NoOp, const A)267// CHECK-NEXT:     9: [B1.8]268// CHECK-NEXT:    10: [B1.9] (CXXConstructExpr, A)269// WARNINGS-NEXT:    11: A() (CXXConstructExpr, A)270// ANALYZER-NEXT:    11: A() (CXXConstructExpr, [B1.12], [B1.14], A)271// CHECK-NEXT:    12: [B1.11] (BindTemporary)272// CHECK-NEXT:    13: [B1.12] (ImplicitCastExpr, NoOp, const A)273// CHECK-NEXT:    14: [B1.13]274// CHECK-NEXT:    15: [B1.14] (CXXConstructExpr, A)275// FIXME: Why does it look as if the initializer list consumes uncopied objects?276// CHECK-NEXT:    16: {[B1.7], [B1.12]}277// FIXME: Why does it look as if the initializer list consumes uncopied objects?278// CHECK-NEXT:    17: {[B1.2], {[B1.7], [B1.12]}}279// CHECK-NEXT:    18: D d = {A(), {A(), A()}};280// CHECK-NEXT:    19: ~A() (Temporary object destructor)281// CHECK-NEXT:    20: ~A() (Temporary object destructor)282// CHECK-NEXT:    21: ~A() (Temporary object destructor)283// WARNINGS-NEXT:    22: A() (CXXConstructExpr, A)284// ANALYZER-NEXT:    22: A() (CXXConstructExpr, [B1.23], [B1.25], A)285// CHECK-NEXT:    23: [B1.22] (BindTemporary)286// CHECK-NEXT:    24: [B1.23] (ImplicitCastExpr, NoOp, const A)287// CHECK-NEXT:    25: [B1.24]288// CHECK-NEXT:    26: [B1.25] (CXXConstructExpr, A)289// WARNINGS-NEXT:    27: A() (CXXConstructExpr, A)290// ANALYZER-NEXT:    27: A() (CXXConstructExpr, [B1.28], [B1.30], A)291// CHECK-NEXT:    28: [B1.27] (BindTemporary)292// CHECK-NEXT:    29: [B1.28] (ImplicitCastExpr, NoOp, const A)293// CHECK-NEXT:    30: [B1.29]294// CHECK-NEXT:    31: [B1.30] (CXXConstructExpr, A)295// WARNINGS-NEXT:    32: A() (CXXConstructExpr, A)296// ANALYZER-NEXT:    32: A() (CXXConstructExpr, [B1.33], [B1.35], A)297// CHECK-NEXT:    33: [B1.32] (BindTemporary)298// CHECK-NEXT:    34: [B1.33] (ImplicitCastExpr, NoOp, const A)299// CHECK-NEXT:    35: [B1.34]300// CHECK-NEXT:    36: [B1.35] (CXXConstructExpr, A)301// FIXME: Why does it look as if the initializer list consumes uncopied objects?302// CHECK-NEXT:    37: {[B1.28], [B1.33]}303// FIXME: Why does it look as if the initializer list consumes uncopied objects?304// CHECK-NEXT:    38: {[B1.23], {[B1.28], [B1.33]}}305// WARNINGS-NEXT:    39: A() (CXXConstructExpr, A)306// ANALYZER-NEXT:    39: A() (CXXConstructExpr, [B1.40], [B1.42], A)307// CHECK-NEXT:    40: [B1.39] (BindTemporary)308// CHECK-NEXT:    41: [B1.40] (ImplicitCastExpr, NoOp, const A)309// CHECK-NEXT:    42: [B1.41]310// CHECK-NEXT:    43: [B1.42] (CXXConstructExpr, A)311// WARNINGS-NEXT:    44: A() (CXXConstructExpr, A)312// ANALYZER-NEXT:    44: A() (CXXConstructExpr, [B1.45], [B1.47], A)313// CHECK-NEXT:    45: [B1.44] (BindTemporary)314// CHECK-NEXT:    46: [B1.45] (ImplicitCastExpr, NoOp, const A)315// CHECK-NEXT:    47: [B1.46]316// CHECK-NEXT:    48: [B1.47] (CXXConstructExpr, A)317// WARNINGS-NEXT:    49: A() (CXXConstructExpr, A)318// ANALYZER-NEXT:    49: A() (CXXConstructExpr, [B1.50], [B1.52], A)319// CHECK-NEXT:    50: [B1.49] (BindTemporary)320// CHECK-NEXT:    51: [B1.50] (ImplicitCastExpr, NoOp, const A)321// CHECK-NEXT:    52: [B1.51]322// CHECK-NEXT:    53: [B1.52] (CXXConstructExpr, A)323// FIXME: Why does it look as if the initializer list consumes uncopied objects?324// CHECK-NEXT:    54: {[B1.45], [B1.50]}325// FIXME: Why does it look as if the initializer list consumes uncopied objects?326// CHECK-NEXT:    55: {[B1.40], {[B1.45], [B1.50]}}327// Double curly braces trigger regexps, escape as per FileCheck manual.328// CHECK-NEXT:    56: {{[{][{]}}[B1.23], {[B1.28], [B1.33]{{[}][}]}}, {[B1.40], {[B1.45], [B1.50]{{[}][}][}]}}329// Double curly braces trigger regexps, escape as per FileCheck manual.330// CHECK-NEXT:    57: D dd[2] = {{[{][{]}}A(), {A(), A(){{[}][}]}}, {A(), {A(), A(){{[}][}][}]}};331// CHECK-NEXT:    58: ~A() (Temporary object destructor)332// CHECK-NEXT:    59: ~A() (Temporary object destructor)333// CHECK-NEXT:    60: ~A() (Temporary object destructor)334// CHECK-NEXT:    61: ~A() (Temporary object destructor)335// CHECK-NEXT:    62: ~A() (Temporary object destructor)336// CHECK-NEXT:    63: ~A() (Temporary object destructor)337// CHECK-NEXT:    64: [B1.57].~D[2]() (Implicit destructor)338// CHECK-NEXT:    65: [B1.18].~D() (Implicit destructor)339// CHECK-NEXT:     Preds (1): B2340// CHECK-NEXT:     Succs (1): B0341// CHECK:        [B0 (EXIT)]342// CHECK-NEXT:     Preds (1): B1343void test_aggregate_with_nontrivial_own_destructor() {344  struct D {345    A y;346    A w[2];347  };348 349  // Until C++17 there are elidable copies here, so there should be 9 temporary350  // destructors of A()s. Destructors of 'd' and 'dd' should implicitly351  // take care of the copies, so there should not be automatic destructors352  // for copies of A()s.353  D d = {A(), {A(), A()}};354  D dd[2] = {{A(), {A(), A()}}, {A(), {A(), A()}}};355}356 357// CHECK:      [B2 (ENTRY)]358// CHECK-NEXT:   Succs (1): B1359// CHECK:      [B1]360// WARNINGS-NEXT:   1:  (CXXConstructExpr, A[2])361// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B1.2], A[2])362// CHECK-NEXT:   2: A a[2];363// WARNINGS-NEXT:   3:  (CXXConstructExpr, A[0])364// ANALYZER-NEXT:   3:  (CXXConstructExpr, [B1.4], A[0])365// CHECK-NEXT:   4: A b[0];366// CHECK-NEXT:   5: [B1.2].~A[2]() (Implicit destructor)367// CHECK-NEXT:   Preds (1): B2368// CHECK-NEXT:   Succs (1): B0369// CHECK:      [B0 (EXIT)]370// CHECK-NEXT:   Preds (1): B1371void test_array() {372  A a[2];373  A b[0];374}375 376// CHECK:      [B2 (ENTRY)]377// CHECK-NEXT:   Succs (1): B1378// CHECK:      [B1]379// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)380// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B1.2], A)381// CHECK-NEXT:   2: A a;382// WARNINGS-NEXT:   3:  (CXXConstructExpr, A)383// ANALYZER-NEXT:   3:  (CXXConstructExpr, [B1.4], A)384// CHECK-NEXT:   4: A c;385// WARNINGS-NEXT:   5:  (CXXConstructExpr, A)386// ANALYZER-NEXT:   5:  (CXXConstructExpr, [B1.6], A)387// CHECK-NEXT:   6: A d;388// CHECK-NEXT:   7: [B1.6].~A() (Implicit destructor)389// CHECK-NEXT:   8: [B1.4].~A() (Implicit destructor)390// WARNINGS-NEXT:   9:  (CXXConstructExpr, A)391// ANALYZER-NEXT:   9:  (CXXConstructExpr, [B1.10], A)392// CHECK:       10: A b;393// CHECK:       11: [B1.10].~A() (Implicit destructor)394// CHECK:       12: [B1.2].~A() (Implicit destructor)395// CHECK-NEXT:   Preds (1): B2396// CHECK-NEXT:   Succs (1): B0397// CHECK:      [B0 (EXIT)]398// CHECK-NEXT:   Preds (1): B1399void test_scope() {400  A a;401  { A c;402    A d;403  }404  A b;405}406 407// CHECK:      [B4 (ENTRY)]408// CHECK-NEXT:   Succs (1): B3409// CHECK:      [B1]410// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)411// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B1.2], A)412// CHECK-NEXT:   2: A c;413// CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)414// CHECK-NEXT:   4: [B3.4].~A() (Implicit destructor)415// CHECK-NEXT:   5: [B3.2].~A() (Implicit destructor)416// CHECK-NEXT:   Preds (1): B3417// CHECK-NEXT:   Succs (1): B0418// CHECK:      [B2]419// CHECK-NEXT:   1: return;420// CHECK-NEXT:   2: [B3.4].~A() (Implicit destructor)421// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)422// CHECK-NEXT:   Preds (1): B3423// CHECK-NEXT:   Succs (1): B0424// CHECK:      [B3]425// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)426// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B3.2], A)427// CHECK-NEXT:   2: A a;428// WARNINGS-NEXT:   3:  (CXXConstructExpr, A)429// ANALYZER-NEXT:   3:  (CXXConstructExpr, [B3.4], A)430// CHECK-NEXT:   4: A b;431// CHECK-NEXT:   5: UV432// CHECK-NEXT:   6: [B3.5] (ImplicitCastExpr, LValueToRValue, _Bool)433// CHECK-NEXT:   T: if [B3.6]434// CHECK-NEXT:   Preds (1): B4435// CHECK-NEXT:   Succs (2): B2 B1436// CHECK:      [B0 (EXIT)]437// CHECK-NEXT:   Preds (2): B1 B2438void test_return() {439  A a;440  A b;441  if (UV) return;442  A c;443}444 445// CHECK:      [B9 (ENTRY)]446// CHECK-NEXT:   Succs (1): B7447// CHECK:      [B1]448// CHECK:       l1:449// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)450// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B1.2], A)451// CHECK-NEXT:   2: A c;452// CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)453// CHECK-NEXT:   4: [B6.2].~A() (Implicit destructor)454// CHECK-NEXT:   5: [B7.2].~A() (Implicit destructor)455// CHECK-NEXT:   Preds (2): B2 B3456// CHECK-NEXT:   Succs (1): B0457// CHECK:      [B2]458// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)459// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B2.2], A)460// CHECK-NEXT:   2: A b;461// CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)462// CHECK-NEXT:   4: [B6.4].~A() (Implicit destructor)463// CHECK-NEXT:   Preds (1): B4464// CHECK-NEXT:   Succs (1): B1465// CHECK:      [B3]466// CHECK-NEXT:   1: [B6.4].~A() (Implicit destructor)467// CHECK-NEXT:   T: goto l1;468// CHECK:        Preds (1): B4469// CHECK-NEXT:   Succs (1): B1470// CHECK:      [B4]471// CHECK-NEXT:   1: UV472// CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, LValueToRValue, _Bool)473// CHECK-NEXT:   T: if [B4.2]474// CHECK-NEXT:   Preds (1): B6475// CHECK-NEXT:   Succs (2): B3 B2476// CHECK:      [B5]477// CHECK:        Preds (1): B6478// CHECK-NEXT:   Succs (1): B8479// CHECK:      [B6]480// CHECK:       l0:481// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)482// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B6.2], A)483// CHECK-NEXT:   2: A b;484// WARNINGS-NEXT:   3:  (CXXConstructExpr, A)485// ANALYZER-NEXT:   3:  (CXXConstructExpr, [B6.4], A)486// CHECK-NEXT:   4: A a;487// CHECK-NEXT:   5: UV488// CHECK-NEXT:   6: [B6.5] (ImplicitCastExpr, LValueToRValue, _Bool)489// CHECK-NEXT:   T: if [B6.6]490// CHECK-NEXT:   Preds (2): B7 B8491// CHECK-NEXT:   Succs (2): B5 B4492// CHECK:      [B7]493// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)494// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B7.2], A)495// CHECK-NEXT:   2: A a;496// CHECK-NEXT:   Preds (1): B9497// CHECK-NEXT:   Succs (1): B6498// CHECK:      [B8]499// CHECK-NEXT:   1: [B6.4].~A() (Implicit destructor)500// CHECK-NEXT:   2: [B6.2].~A() (Implicit destructor)501// CHECK-NEXT:   T: goto l0;502// CHECK-NEXT:   Preds (1): B5503// CHECK-NEXT:   Succs (1): B6504// CHECK:      [B0 (EXIT)]505// CHECK-NEXT:   Preds (1): B1506void test_goto() {507  A a;508l0:509  A b;510  { A a;511    if (UV) goto l0;512    if (UV) goto l1;513    A b;514  }515l1:516  A c;517}518 519// CHECK:      [B5 (ENTRY)]520// CHECK-NEXT:   Succs (1): B4521// CHECK:      [B1]522// CHECK-NEXT:   1: [B4.6].~A() (Implicit destructor)523// CHECK-NEXT:   2: [B4.2].~A() (Implicit destructor)524// CHECK-NEXT:   Preds (2): B2 B3525// CHECK-NEXT:   Succs (1): B0526// CHECK:      [B2]527// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)528// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B2.2], A)529// CHECK-NEXT:   2: A c;530// CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)531// CHECK-NEXT:   Preds (1): B4532// CHECK-NEXT:   Succs (1): B1533// CHECK:      [B3]534// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)535// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B3.2], A)536// CHECK-NEXT:   2: A c;537// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)538// CHECK-NEXT:   Preds (1): B4539// CHECK-NEXT:   Succs (1): B1540// CHECK:      [B4]541// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)542// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B4.2], A)543// CHECK-NEXT:   2: A a;544// CHECK-NEXT:   3: a545// CHECK-NEXT:   4: [B4.3] (ImplicitCastExpr, NoOp, const A)546// WARNINGS-NEXT:   5: [B4.4] (CXXConstructExpr, A)547// ANALYZER-NEXT:   5: [B4.4] (CXXConstructExpr, [B4.6], A)548// CHECK-NEXT:   6: A b = a;549// CHECK-NEXT:   7: b550// CHECK-NEXT:   8: [B4.7] (ImplicitCastExpr, NoOp, const class A)551// CHECK-NEXT:   9: [B4.8].operator int552// CHECK:       10: [B4.8]553// CHECK:       11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, int)554// CHECK:       12: [B4.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)555// CHECK-NEXT:   T: if [B4.12]556// CHECK-NEXT:   Preds (1): B5557// CHECK-NEXT:   Succs (2): B3 B2558// CHECK:      [B0 (EXIT)]559// CHECK-NEXT:   Preds (1): B1560void test_if_implicit_scope() {561  A a;562  if (A b = a)563    A c;564  else A c;565}566 567// CHECK:      [B9 (ENTRY)]568// CHECK-NEXT:   Succs (1): B8569// CHECK:      [B1]570// CHECK-NEXT:   1: [B8.6].~A() (Implicit destructor)571// WARNINGS-NEXT:   2:  (CXXConstructExpr, A)572// ANALYZER-NEXT:   2:  (CXXConstructExpr, [B1.3], A)573// CHECK-NEXT:   3: A e;574// CHECK-NEXT:   4: [B1.3].~A() (Implicit destructor)575// CHECK-NEXT:   5: [B8.2].~A() (Implicit destructor)576// CHECK-NEXT:   Preds (2): B2 B5577// CHECK-NEXT:   Succs (1): B0578// CHECK:      [B2]579// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)580// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B2.2], A)581// CHECK-NEXT:   2: A d;582// CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)583// CHECK-NEXT:   4: [B4.2].~A() (Implicit destructor)584// CHECK-NEXT:   Preds (1): B4585// CHECK-NEXT:   Succs (1): B1586// CHECK:      [B3]587// CHECK-NEXT:   1: return;588// CHECK-NEXT:   2: [B4.2].~A() (Implicit destructor)589// CHECK-NEXT:   3: [B8.6].~A() (Implicit destructor)590// CHECK-NEXT:   4: [B8.2].~A() (Implicit destructor)591// CHECK-NEXT:   Preds (1): B4592// CHECK-NEXT:   Succs (1): B0593// CHECK:      [B4]594// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)595// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B4.2], A)596// CHECK-NEXT:   2: A c;597// CHECK-NEXT:   3: UV598// CHECK-NEXT:   4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool)599// CHECK-NEXT:   T: if [B4.4]600// CHECK-NEXT:   Preds (1): B8601// CHECK-NEXT:   Succs (2): B3 B2602// CHECK:      [B5]603// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)604// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B5.2], A)605// CHECK-NEXT:   2: A d;606// CHECK-NEXT:   3: [B5.2].~A() (Implicit destructor)607// CHECK-NEXT:   4: [B7.2].~A() (Implicit destructor)608// CHECK-NEXT:   Preds (1): B7609// CHECK-NEXT:   Succs (1): B1610// CHECK:      [B6]611// CHECK-NEXT:   1: return;612// CHECK-NEXT:   2: [B7.2].~A() (Implicit destructor)613// CHECK-NEXT:   3: [B8.6].~A() (Implicit destructor)614// CHECK-NEXT:   4: [B8.2].~A() (Implicit destructor)615// CHECK-NEXT:   Preds (1): B7616// CHECK-NEXT:   Succs (1): B0617// CHECK:      [B7]618// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)619// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B7.2], A)620// CHECK-NEXT:   2: A c;621// CHECK-NEXT:   3: UV622// CHECK-NEXT:   4: [B7.3] (ImplicitCastExpr, LValueToRValue, _Bool)623// CHECK-NEXT:   T: if [B7.4]624// CHECK-NEXT:   Preds (1): B8625// CHECK-NEXT:   Succs (2): B6 B5626// CHECK:      [B8]627// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)628// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B8.2], A)629// CHECK-NEXT:   2: A a;630// CHECK-NEXT:   3: a631// CHECK-NEXT:   4: [B8.3] (ImplicitCastExpr, NoOp, const A)632// WARNINGS-NEXT:   5: [B8.4] (CXXConstructExpr, A)633// ANALYZER-NEXT:   5: [B8.4] (CXXConstructExpr, [B8.6], A)634// CHECK-NEXT:   6: A b = a;635// CHECK-NEXT:   7: b636// CHECK-NEXT:   8: [B8.7] (ImplicitCastExpr, NoOp, const class A)637// CHECK-NEXT:   9: [B8.8].operator int638// CHECK:       10: [B8.8]639// CHECK:       11: [B8.10] (ImplicitCastExpr, UserDefinedConversion, int)640// CHECK:       12: [B8.11] (ImplicitCastExpr, IntegralToBoolean, _Bool)641// CHECK-NEXT:   T: if [B8.12]642// CHECK-NEXT:   Preds (1): B9643// CHECK-NEXT:   Succs (2): B7 B4644// CHECK:      [B0 (EXIT)]645// CHECK-NEXT:   Preds (3): B1 B3 B6646void test_if_jumps() {647  A a;648  if (A b = a) {649    A c;650    if (UV) return;651    A d;652  } else {653    A c;654    if (UV) return;655    A d;656  }657  A e;658}659 660// CHECK:      [B6 (ENTRY)]661// CHECK-NEXT:   Succs (1): B5662// CHECK:      [B1]663// CHECK-NEXT:   1: [B4.4].~A() (Implicit destructor)664// CHECK-NEXT:   2: [B5.2].~A() (Implicit destructor)665// CHECK-NEXT:   Preds (1): B4666// CHECK-NEXT:   Succs (1): B0667// CHECK:      [B2]668// CHECK-NEXT:   Preds (1): B3669// CHECK-NEXT:   Succs (1): B4670// CHECK:      [B3]671// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)672// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B3.2], A)673// CHECK-NEXT:   2: A c;674// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)675// CHECK-NEXT:   4: [B4.4].~A() (Implicit destructor)676// CHECK-NEXT:   Preds (1): B4677// CHECK-NEXT:   Succs (1): B2678// CHECK:      [B4]679// CHECK-NEXT:   1: a680// CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, NoOp, const A)681// WARNINGS-NEXT:   3: [B4.2] (CXXConstructExpr, A)682// ANALYZER-NEXT:   3: [B4.2] (CXXConstructExpr, [B4.4], A)683// CHECK-NEXT:   4: A b = a;684// CHECK-NEXT:   5: b685// CHECK-NEXT:   6: [B4.5] (ImplicitCastExpr, NoOp, const class A)686// CHECK-NEXT:   7: [B4.6].operator int687// CHECK-NEXT:   8: [B4.6]688// CHECK-NEXT:   9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)689// CHECK:       10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)690// CHECK-NEXT:   T: while [B4.10]691// CHECK-NEXT:   Preds (2): B2 B5692// CHECK-NEXT:   Succs (2): B3 B1693// CHECK:      [B5]694// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)695// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B5.2], A)696// CHECK-NEXT:   2: A a;697// CHECK-NEXT:   Preds (1): B6698// CHECK-NEXT:   Succs (1): B4699// CHECK:      [B0 (EXIT)]700// CHECK-NEXT:   Preds (1): B1701void test_while_implicit_scope() {702  A a;703  while (A b = a)704    A c;705}706 707// CHECK:      [B12 (ENTRY)]708// CHECK-NEXT:   Succs (1): B11709// CHECK:      [B1]710// CHECK-NEXT:   1: [B10.4].~A() (Implicit destructor)711// WARNINGS-NEXT:   2:  (CXXConstructExpr, A)712// ANALYZER-NEXT:   2:  (CXXConstructExpr, [B1.3], A)713// CHECK-NEXT:   3: A e;714// CHECK-NEXT:   4: [B1.3].~A() (Implicit destructor)715// CHECK-NEXT:   5: [B11.2].~A() (Implicit destructor)716// CHECK-NEXT:   Preds (2): B8 B10717// CHECK-NEXT:   Succs (1): B0718// CHECK:      [B2]719// CHECK-NEXT:   Preds (2): B3 B6720// CHECK-NEXT:   Succs (1): B10721// CHECK:      [B3]722// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)723// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B3.2], A)724// CHECK-NEXT:   2: A d;725// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)726// CHECK-NEXT:   4: [B9.2].~A() (Implicit destructor)727// CHECK-NEXT:   5: [B10.4].~A() (Implicit destructor)728// CHECK-NEXT:   Preds (1): B5729// CHECK-NEXT:   Succs (1): B2730// CHECK:      [B4]731// CHECK-NEXT:   1: return;732// CHECK-NEXT:   2: [B9.2].~A() (Implicit destructor)733// CHECK-NEXT:   3: [B10.4].~A() (Implicit destructor)734// CHECK-NEXT:   4: [B11.2].~A() (Implicit destructor)735// CHECK-NEXT:   Preds (1): B5736// CHECK-NEXT:   Succs (1): B0737// CHECK:      [B5]738// CHECK-NEXT:   1: UV739// CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)740// CHECK-NEXT:   T: if [B5.2]741// CHECK-NEXT:   Preds (1): B7742// CHECK-NEXT:   Succs (2): B4 B3743// CHECK:      [B6]744// CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)745// CHECK-NEXT:   2: [B10.4].~A() (Implicit destructor)746// CHECK-NEXT:   T: continue;747// CHECK:        Preds (1): B7748// CHECK-NEXT:   Succs (1): B2749// CHECK:      [B7]750// CHECK-NEXT:   1: UV751// CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)752// CHECK-NEXT:   T: if [B7.2]753// CHECK-NEXT:   Preds (1): B9754// CHECK-NEXT:   Succs (2): B6 B5755// CHECK:      [B8]756// CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)757// CHECK-NEXT:   T: break;758// CHECK:        Preds (1): B9759// CHECK-NEXT:   Succs (1): B1760// CHECK:      [B9]761// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)762// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B9.2], A)763// CHECK-NEXT:   2: A c;764// CHECK-NEXT:   3: UV765// CHECK-NEXT:   4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)766// CHECK-NEXT:   T: if [B9.4]767// CHECK-NEXT:   Preds (1): B10768// CHECK-NEXT:   Succs (2): B8 B7769// CHECK:      [B10]770// CHECK-NEXT:   1: a771// CHECK-NEXT:   2: [B10.1] (ImplicitCastExpr, NoOp, const A)772// WARNINGS-NEXT:   3: [B10.2] (CXXConstructExpr, A)773// ANALYZER-NEXT:   3: [B10.2] (CXXConstructExpr, [B10.4], A)774// CHECK-NEXT:   4: A b = a;775// CHECK-NEXT:   5: b776// CHECK-NEXT:   6: [B10.5] (ImplicitCastExpr, NoOp, const class A)777// CHECK-NEXT:   7: [B10.6].operator int778// CHECK-NEXT:   8: [B10.6]779// CHECK-NEXT:   9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)780// CHECK:       10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)781// CHECK-NEXT:   T: while [B10.10]782// CHECK-NEXT:   Preds (2): B2 B11783// CHECK-NEXT:   Succs (2): B9 B1784// CHECK:      [B11]785// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)786// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B11.2], A)787// CHECK-NEXT:   2: A a;788// CHECK-NEXT:   Preds (1): B12789// CHECK-NEXT:   Succs (1): B10790// CHECK:      [B0 (EXIT)]791// CHECK-NEXT:   Preds (2): B1 B4792void test_while_jumps() {793  A a;794  while (A b = a) {795    A c;796    if (UV) break;797    if (UV) continue;798    if (UV) return;799    A d;800  }801  A e;802}803 804// CHECK:      [B4 (ENTRY)]805// CHECK-NEXT:   Succs (1): B2806// CHECK:      [B1]807// CHECK-NEXT:   1: UV808// CHECK-NEXT:   2: [B1.1] (ImplicitCastExpr, LValueToRValue, _Bool)809// CHECK-NEXT:   T: do ... while [B1.2]810// CHECK-NEXT:   Preds (1): B2811// CHECK-NEXT:   Succs (2): B3 B0812// CHECK:      [B2]813// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)814// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B2.2], A)815// CHECK-NEXT:   2: A a;816// CHECK-NEXT:   3: [B2.2].~A() (Implicit destructor)817// CHECK-NEXT:   Preds (2): B3 B4818// CHECK-NEXT:   Succs (1): B1819// CHECK:      [B3]820// CHECK-NEXT:   Preds (1): B1821// CHECK-NEXT:   Succs (1): B2822// CHECK:      [B0 (EXIT)]823// CHECK-NEXT:   Preds (1): B1824void test_do_implicit_scope() {825  do A a;826  while (UV);827}828 829// CHECK:      [B12 (ENTRY)]830// CHECK-NEXT:   Succs (1): B11831// CHECK:      [B1]832// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)833// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B1.2], A)834// CHECK-NEXT:   2: A d;835// CHECK-NEXT:   3: [B1.2].~A() (Implicit destructor)836// CHECK-NEXT:   4: [B11.2].~A() (Implicit destructor)837// CHECK-NEXT:   Preds (2): B8 B2838// CHECK-NEXT:   Succs (1): B0839// CHECK:      [B2]840// CHECK-NEXT:   1: UV841// CHECK-NEXT:   2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)842// CHECK-NEXT:   T: do ... while [B2.2]843// CHECK-NEXT:   Preds (2): B3 B6844// CHECK-NEXT:   Succs (2): B10 B1845// CHECK:      [B3]846// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)847// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B3.2], A)848// CHECK-NEXT:   2: A c;849// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)850// CHECK-NEXT:   4: [B9.2].~A() (Implicit destructor)851// CHECK-NEXT:   Preds (1): B5852// CHECK-NEXT:   Succs (1): B2853// CHECK:      [B4]854// CHECK-NEXT:   1: return;855// CHECK-NEXT:   2: [B9.2].~A() (Implicit destructor)856// CHECK-NEXT:   3: [B11.2].~A() (Implicit destructor)857// CHECK-NEXT:   Preds (1): B5858// CHECK-NEXT:   Succs (1): B0859// CHECK:      [B5]860// CHECK-NEXT:   1: UV861// CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)862// CHECK-NEXT:   T: if [B5.2]863// CHECK-NEXT:   Preds (1): B7864// CHECK-NEXT:   Succs (2): B4 B3865// CHECK:      [B6]866// CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)867// CHECK-NEXT:   T: continue;868// CHECK:        Preds (1): B7869// CHECK-NEXT:   Succs (1): B2870// CHECK:      [B7]871// CHECK-NEXT:   1: UV872// CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)873// CHECK-NEXT:   T: if [B7.2]874// CHECK-NEXT:   Preds (1): B9875// CHECK-NEXT:   Succs (2): B6 B5876// CHECK:      [B8]877// CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)878// CHECK-NEXT:   T: break;879// CHECK:        Preds (1): B9880// CHECK-NEXT:   Succs (1): B1881// CHECK:      [B9]882// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)883// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B9.2], A)884// CHECK-NEXT:   2: A b;885// CHECK-NEXT:   3: UV886// CHECK-NEXT:   4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)887// CHECK-NEXT:   T: if [B9.4]888// CHECK-NEXT:   Preds (2): B10 B11889// CHECK-NEXT:   Succs (2): B8 B7890// CHECK:      [B10]891// CHECK-NEXT:   Preds (1): B2892// CHECK-NEXT:   Succs (1): B9893// CHECK:      [B11]894// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)895// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B11.2], A)896// CHECK-NEXT:   2: A a;897// CHECK-NEXT:   Preds (1): B12898// CHECK-NEXT:   Succs (1): B9899// CHECK:      [B0 (EXIT)]900// CHECK-NEXT:   Preds (2): B1 B4901void test_do_jumps() {902  A a;903  do {904    A b;905    if (UV) break;906    if (UV) continue;907    if (UV) return;908    A c;909  } while (UV);910  A d;911}912 913// CHECK:      [B4 (ENTRY)]914// CHECK-NEXT:   Succs (1): B2915// CHECK:      [B1]916// CHECK-NEXT:   1: [B2.6].~A() (Implicit destructor)917// CHECK-NEXT:   2: [B2.2].~A() (Implicit destructor)918// CHECK-NEXT:   Preds (2): B3 B2919// CHECK-NEXT:   Succs (1): B0920// CHECK:      [B2]921// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)922// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B2.2], A)923// CHECK-NEXT:   2: A a;924// CHECK-NEXT:   3: a925// CHECK-NEXT:   4: [B2.3] (ImplicitCastExpr, NoOp, const A)926// CHECK-NEXT:   5: [B2.4] (CXXConstructExpr, A)927// CHECK-NEXT:   6: A b = a;928// CHECK-NEXT:   7: b929// CHECK-NEXT:   8: [B2.7] (ImplicitCastExpr, NoOp, const class A)930// CHECK-NEXT:   9: [B2.8].operator int931// CHECK:       10: [B2.8]932// CHECK:       11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)933// CHECK-NEXT:   T: switch [B2.11]934// CHECK-NEXT:   Preds (1): B4935// CHECK-NEXT:   Succs (1): B1936// CHECK:      [B3]937// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)938// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B3.2], A)939// CHECK-NEXT:   2: A c;940// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)941// CHECK-NEXT:   Succs (1): B1942// CHECK:      [B0 (EXIT)]943// CHECK-NEXT:   Preds (1): B1944void test_switch_implicit_scope() {945  A a;946  switch (A b = a)947    A c;948}949 950// CHECK:      [B9 (ENTRY)]951// CHECK-NEXT:   Succs (1): B2952// CHECK:      [B1]953// CHECK-NEXT:   1: [B2.6].~A() (Implicit destructor)954// WARNINGS-NEXT:   2:  (CXXConstructExpr, A)955// ANALYZER-NEXT:   2:  (CXXConstructExpr, [B1.3], A)956// CHECK-NEXT:   3: A g;957// CHECK-NEXT:   4: [B1.3].~A() (Implicit destructor)958// CHECK-NEXT:   5: [B2.2].~A() (Implicit destructor)959// CHECK-NEXT:   Preds (3): B3 B7 B2960// CHECK-NEXT:   Succs (1): B0961// CHECK:      [B2]962// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)963// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B2.2], A)964// CHECK-NEXT:   2: A a;965// CHECK-NEXT:   3: a966// CHECK-NEXT:   4: [B2.3] (ImplicitCastExpr, NoOp, const A)967// CHECK-NEXT:   5: [B2.4] (CXXConstructExpr, A)968// CHECK-NEXT:   6: A b = a;969// CHECK-NEXT:   7: b970// CHECK-NEXT:   8: [B2.7] (ImplicitCastExpr, NoOp, const class A)971// CHECK-NEXT:   9: [B2.8].operator int972// CHECK:       10: [B2.8]973// CHECK:       11: [B2.10] (ImplicitCastExpr, UserDefinedConversion, int)974// CHECK-NEXT:   T: switch [B2.11]975// CHECK-NEXT:   Preds (1): B9976// CHECK-NEXT:   Succs (3): B3 B8 B1977// CHECK:      [B3]978// CHECK:       case 1:979// CHECK-NEXT:   T: break;980// CHECK:        Preds (2): B2 B4981// CHECK-NEXT:   Succs (1): B1982// CHECK:      [B4]983// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)984// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B4.2], A)985// CHECK-NEXT:   2: A f;986// CHECK-NEXT:   3: [B4.2].~A() (Implicit destructor)987// CHECK-NEXT:   4: [B8.2].~A() (Implicit destructor)988// CHECK-NEXT:   Preds (1): B6989// CHECK-NEXT:   Succs (1): B3990// CHECK:      [B5]991// CHECK-NEXT:   1: return;992// CHECK-NEXT:   2: [B8.2].~A() (Implicit destructor)993// CHECK-NEXT:   3: [B2.6].~A() (Implicit destructor)994// CHECK-NEXT:   4: [B2.2].~A() (Implicit destructor)995// CHECK-NEXT:   Preds (1): B6996// CHECK-NEXT:   Succs (1): B0997// CHECK:      [B6]998// CHECK-NEXT:   1: UV999// CHECK-NEXT:   2: [B6.1] (ImplicitCastExpr, LValueToRValue, _Bool)1000// CHECK-NEXT:   T: if [B6.2]1001// CHECK-NEXT:   Preds (1): B81002// CHECK-NEXT:   Succs (2): B5 B41003// CHECK:      [B7]1004// CHECK-NEXT:   1: [B8.2].~A() (Implicit destructor)1005// CHECK-NEXT:   T: break;1006// CHECK:        Preds (1): B81007// CHECK-NEXT:   Succs (1): B11008// CHECK:      [B8]1009// CHECK:       case 0:1010// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)1011// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B8.2], A)1012// CHECK-NEXT:   2: A c;1013// CHECK-NEXT:   3: UV1014// CHECK-NEXT:   4: [B8.3] (ImplicitCastExpr, LValueToRValue, _Bool)1015// CHECK-NEXT:   T: if [B8.4]1016// CHECK-NEXT:   Preds (1): B21017// CHECK-NEXT:   Succs (2): B7 B61018// CHECK:      [B0 (EXIT)]1019// CHECK-NEXT:   Preds (2): B1 B51020void test_switch_jumps() {1021  A a;1022  switch (A b = a) {1023  case 0: {1024    A c;1025    if (UV) break;1026    if (UV) return;1027    A f;1028  }1029  case 1:1030    break;1031  }1032  A g;1033}1034 1035// CHECK:      [B6 (ENTRY)]1036// CHECK-NEXT:   Succs (1): B51037// CHECK:      [B1]1038// CHECK-NEXT:   1: [B4.4].~A() (Implicit destructor)1039// CHECK-NEXT:   2: [B5.2].~A() (Implicit destructor)1040// CHECK-NEXT:   Preds (1): B41041// CHECK-NEXT:   Succs (1): B01042// CHECK:      [B2]1043// CHECK-NEXT:   1: b1044// CHECK-NEXT:   2: [B2.1].x1045// CHECK-NEXT:   3: ++[B2.2]1046// CHECK-NEXT:   4: [B4.4].~A() (Implicit destructor)1047// CHECK-NEXT:   Preds (1): B31048// CHECK-NEXT:   Succs (1): B41049// CHECK:      [B3]1050// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)1051// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B3.2], A)1052// CHECK-NEXT:   2: A c;1053// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)1054// CHECK-NEXT:   Preds (1): B41055// CHECK-NEXT:   Succs (1): B21056// CHECK:      [B4]1057// CHECK-NEXT:   1: a1058// CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, NoOp, const A)1059// WARNINGS-NEXT:   3: [B4.2] (CXXConstructExpr, A)1060// ANALYZER-NEXT:   3: [B4.2] (CXXConstructExpr, [B4.4], A)1061// CHECK-NEXT:   4: A b = a;1062// CHECK-NEXT:   5: b1063// CHECK-NEXT:   6: [B4.5] (ImplicitCastExpr, NoOp, const class A)1064// CHECK-NEXT:   7: [B4.6].operator int1065// CHECK-NEXT:   8: [B4.6]1066// CHECK-NEXT:   9: [B4.8] (ImplicitCastExpr, UserDefinedConversion, int)1067// CHECK:       10: [B4.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)1068// CHECK-NEXT:   T: for (...; [B4.10]; ...)1069// CHECK-NEXT:   Preds (2): B2 B51070// CHECK-NEXT:   Succs (2): B3 B11071// CHECK:      [B5]1072// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)1073// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B5.2], A)1074// CHECK-NEXT:   2: A a;1075// CHECK-NEXT:   Preds (1): B61076// CHECK-NEXT:   Succs (1): B41077// CHECK:      [B0 (EXIT)]1078// CHECK-NEXT:   Preds (1): B11079void test_for_implicit_scope() {1080  for (A a; A b = a; ++b.x)1081    A c;1082}1083 1084// CHECK-LABEL: void test_for_range_implicit_scope()1085// CHECK:      [B5 (ENTRY)]1086// CHECK-NEXT:   Succs (1): B41087// CHECK:      [B1]1088// CHECK-NEXT:   1: __begin11089// CHECK-NEXT:   2: [B1.1] (ImplicitCastExpr, LValueToRValue, int *)1090// CHECK-NEXT:   3: __end11091// CHECK-NEXT:   4: [B1.3] (ImplicitCastExpr, LValueToRValue, int *)1092// CHECK-NEXT:   5: [B1.2] != [B1.4]1093// CHECK-NEXT:   T: for (int n : [B4.2])1094// CHECK-NEXT:[B3.7]1095// CHECK-NEXT:   Preds (2): B2 B41096// CHECK-NEXT:   Succs (2): B3 B01097// CHECK:      [B2]1098// CHECK-NEXT:   1: __begin11099// CHECK-NEXT:   2: ++[B2.1]1100// CHECK-NEXT:   Preds (1): B31101// CHECK-NEXT:   Succs (1): B11102// CHECK:      [B3]1103// CHECK-NEXT:   1: __begin11104// CHECK-NEXT:   2: [B3.1] (ImplicitCastExpr, LValueToRValue, int *)1105// CHECK-NEXT:   3: *[B3.2]1106// CHECK-NEXT:   4: [B3.3] (ImplicitCastExpr, LValueToRValue, int)1107// CHECK-NEXT:   5: int n1108// WARNINGS-NEXT:   6:  (CXXConstructExpr, A)1109// ANALYZER-NEXT:   6:  (CXXConstructExpr, [B3.7], A)1110// CHECK-NEXT:   7: A c;1111// CHECK-NEXT:   8: [B3.7].~A() (Implicit destructor)1112// CHECK-NEXT:   Preds (1): B11113// CHECK-NEXT:   Succs (1): B21114// CHECK:      [B4]1115// CHECK-NEXT:   1: int nums[4];1116// CHECK-NEXT:   2: nums1117// CHECK-NEXT:   3: auto &&__range1 = nums;1118// CHECK-NEXT:   4: __range11119// CHECK-NEXT:   5: [B4.4] (ImplicitCastExpr, ArrayToPointerDecay, int *)1120// CHECK-NEXT:   6: 4{{L*}}1121// CHECK-NEXT:   7: [B4.5] + [B4.6]1122// CHECK-NEXT:   8: auto __end1 = __range1 + 4{{L*}};1123// CHECK-NEXT:   9: __range11124// CHECK-NEXT:  10: [B4.9] (ImplicitCastExpr, ArrayToPointerDecay, int *)1125// CHECK-NEXT:  11: auto __begin1 = __range1;1126// CHECK-NEXT:   Preds (1): B51127// CHECK-NEXT:   Succs (1): B11128// CHECK:      [B0 (EXIT)]1129// CHECK-NEXT:   Preds (1): B11130void test_for_range_implicit_scope() {1131  int nums[4];1132  for (int n : nums)1133    A c;1134}1135 1136 1137// CHECK:      [B12 (ENTRY)]1138// CHECK-NEXT:   Succs (1): B111139// CHECK:      [B1]1140// CHECK-NEXT:   1: [B10.4].~A() (Implicit destructor)1141// CHECK-NEXT:   2: [B11.4].~A() (Implicit destructor)1142// WARNINGS-NEXT:   3:  (CXXConstructExpr, A)1143// ANALYZER-NEXT:   3:  (CXXConstructExpr, [B1.4], A)1144// CHECK-NEXT:   4: A f;1145// CHECK-NEXT:   5: [B1.4].~A() (Implicit destructor)1146// CHECK-NEXT:   6: [B11.2].~A() (Implicit destructor)1147// CHECK-NEXT:   Preds (2): B8 B101148// CHECK-NEXT:   Succs (1): B01149// CHECK:      [B2]1150// CHECK-NEXT:   1: [B10.4].~A() (Implicit destructor)1151// CHECK-NEXT:   Preds (2): B3 B61152// CHECK-NEXT:   Succs (1): B101153// CHECK:      [B3]1154// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)1155// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B3.2], A)1156// CHECK-NEXT:   2: A e;1157// CHECK-NEXT:   3: [B3.2].~A() (Implicit destructor)1158// CHECK-NEXT:   4: [B9.2].~A() (Implicit destructor)1159// CHECK-NEXT:   Preds (1): B51160// CHECK-NEXT:   Succs (1): B21161// CHECK:      [B4]1162// CHECK-NEXT:   1: return;1163// CHECK-NEXT:   2: [B9.2].~A() (Implicit destructor)1164// CHECK-NEXT:   3: [B10.4].~A() (Implicit destructor)1165// CHECK-NEXT:   4: [B11.4].~A() (Implicit destructor)1166// CHECK-NEXT:   5: [B11.2].~A() (Implicit destructor)1167// CHECK-NEXT:   Preds (1): B51168// CHECK-NEXT:   Succs (1): B01169// CHECK:      [B5]1170// CHECK-NEXT:   1: UV1171// CHECK-NEXT:   2: [B5.1] (ImplicitCastExpr, LValueToRValue, _Bool)1172// CHECK-NEXT:   T: if [B5.2]1173// CHECK-NEXT:   Preds (1): B71174// CHECK-NEXT:   Succs (2): B4 B31175// CHECK:      [B6]1176// CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)1177// CHECK-NEXT:   T: continue;1178// CHECK:        Preds (1): B71179// CHECK-NEXT:   Succs (1): B21180// CHECK:      [B7]1181// CHECK-NEXT:   1: UV1182// CHECK-NEXT:   2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)1183// CHECK-NEXT:   T: if [B7.2]1184// CHECK-NEXT:   Preds (1): B91185// CHECK-NEXT:   Succs (2): B6 B51186// CHECK:      [B8]1187// CHECK-NEXT:   1: [B9.2].~A() (Implicit destructor)1188// CHECK-NEXT:   T: break;1189// CHECK:        Preds (1): B91190// CHECK-NEXT:   Succs (1): B11191// CHECK:      [B9]1192// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)1193// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B9.2], A)1194// CHECK-NEXT:   2: A d;1195// CHECK-NEXT:   3: UV1196// CHECK-NEXT:   4: [B9.3] (ImplicitCastExpr, LValueToRValue, _Bool)1197// CHECK-NEXT:   T: if [B9.4]1198// CHECK-NEXT:   Preds (1): B101199// CHECK-NEXT:   Succs (2): B8 B71200// CHECK:      [B10]1201// CHECK-NEXT:   1: b1202// CHECK-NEXT:   2: [B10.1] (ImplicitCastExpr, NoOp, const A)1203// WARNINGS-NEXT:   3: [B10.2] (CXXConstructExpr, A)1204// ANALYZER-NEXT:   3: [B10.2] (CXXConstructExpr, [B10.4], A)1205// CHECK-NEXT:   4: A c = b;1206// CHECK-NEXT:   5: c1207// CHECK-NEXT:   6: [B10.5] (ImplicitCastExpr, NoOp, const class A)1208// CHECK-NEXT:   7: [B10.6].operator int1209// CHECK-NEXT:   8: [B10.6]1210// CHECK-NEXT:   9: [B10.8] (ImplicitCastExpr, UserDefinedConversion, int)1211// CHECK:       10: [B10.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)1212// CHECK-NEXT:   T: for (...; [B10.10]; )1213// CHECK-NEXT:   Preds (2): B2 B111214// CHECK-NEXT:   Succs (2): B9 B11215// CHECK:      [B11]1216// WARNINGS-NEXT:   1:  (CXXConstructExpr, A)1217// ANALYZER-NEXT:   1:  (CXXConstructExpr, [B11.2], A)1218// CHECK-NEXT:   2: A a;1219// WARNINGS-NEXT:   3:  (CXXConstructExpr, A)1220// ANALYZER-NEXT:   3:  (CXXConstructExpr, [B11.4], A)1221// CHECK-NEXT:   4: A b;1222// CHECK-NEXT:   Preds (1): B121223// CHECK-NEXT:   Succs (1): B101224// CHECK:      [B0 (EXIT)]1225// CHECK-NEXT:   Preds (2): B1 B41226void test_for_jumps() {1227  A a;1228  for (A b; A c = b;) {1229    A d;1230    if (UV) break;1231    if (UV) continue;1232    if (UV) return;1233    A e;1234  }1235  A f;1236}1237 1238// CHECK:        [B9 (ENTRY)]1239// CHECK-NEXT:     Succs (1): B81240// CHECK:        [B1]1241// CHECK-NEXT:     1: [B7.4].~A() (Implicit destructor)1242// CHECK-NEXT:     2: [B8.2].~A() (Implicit destructor)1243// CHECK-NEXT:     Preds (1): B71244// CHECK-NEXT:     Succs (1): B01245// CHECK:        [B2]1246// CHECK-NEXT:     1: [B5.4] ? [B3.3] : [B4.1]1247// CHECK-NEXT:     2: [B7.4].~A() (Implicit destructor)1248// CHECK-NEXT:     Preds (2): B3 B41249// CHECK-NEXT:     Succs (1): B71250// CHECK:        [B3]1251// CHECK-NEXT:     1: b1252// CHECK-NEXT:     2: [B3.1].x1253// CHECK-NEXT:     3: [B3.2]++1254// CHECK-NEXT:     Preds (1): B51255// CHECK-NEXT:     Succs (1): B21256// CHECK:        [B4]1257// CHECK-NEXT:     1: 01258// CHECK-NEXT:     Preds (1): B51259// CHECK-NEXT:     Succs (1): B21260// CHECK:        [B5]1261// CHECK-NEXT:     1: b1262// CHECK-NEXT:     2: [B5.1].x1263// CHECK-NEXT:     3: [B5.2] (ImplicitCastExpr, LValueToRValue, int)1264// CHECK-NEXT:     4: [B5.3] (ImplicitCastExpr, IntegralToBoolean, _Bool)1265// CHECK-NEXT:     T: [B5.4] ? ... : ...1266// CHECK-NEXT:     Preds (1): B61267// CHECK-NEXT:     Succs (2): B3 B41268// CHECK:        [B6]1269// CHECK-NEXT:     1: 01270// CHECK-NEXT:     2: (void)[B6.1] (CStyleCastExpr, ToVoid, void)1271// CHECK-NEXT:     Preds (1): B71272// CHECK-NEXT:     Succs (1): B51273// CHECK:        [B7]1274// CHECK-NEXT:     1: a1275// CHECK-NEXT:     2: [B7.1] (ImplicitCastExpr, NoOp, const A)1276// WARNINGS-NEXT:  3: [B7.2] (CXXConstructExpr, A)1277// ANALYZER-NEXT:  3: [B7.2] (CXXConstructExpr, [B7.4], A)1278// CHECK-NEXT:     4: A b = a;1279// CHECK-NEXT:     5: b1280// CHECK-NEXT:     6: [B7.5] (ImplicitCastExpr, NoOp, const class A)1281// CHECK-NEXT:     7: [B7.6].operator int1282// CHECK-NEXT:     8: [B7.6]1283// CHECK-NEXT:     9: [B7.8] (ImplicitCastExpr, UserDefinedConversion, int)1284// CHECK-NEXT:    10: [B7.9] (ImplicitCastExpr, IntegralToBoolean, _Bool)1285// CHECK-NEXT:     T: for (...; [B7.10]; ...)1286// CHECK-NEXT:     Preds (2): B2 B81287// CHECK-NEXT:     Succs (2): B6 B11288// CHECK:        [B8]1289// WARNINGS-NEXT:  1:  (CXXConstructExpr, A)1290// ANALYZER-NEXT:  1:  (CXXConstructExpr, [B8.2], A)1291// CHECK-NEXT:     2: A a;1292// CHECK-NEXT:     Preds (1): B91293// CHECK-NEXT:     Succs (1): B71294void test_for_inc_conditional() {1295  for (A a; A b = a; b.x ? b.x++ : 0)1296    (void)0;1297}1298 1299// CHECK:      [B3 (ENTRY)]1300// CHECK-NEXT:   Succs (1): B01301// CHECK:      [B1]1302// CHECK-NEXT:   T: try ...1303// CHECK-NEXT:   Succs (2): B2 B01304// CHECK:      [B2]1305// CHECK-NEXT:  catch (const A &e):1306// CHECK-NEXT:   1: catch (const A &e) {1307// CHECK-NEXT:  }1308// CHECK-NEXT:   Preds (1): B11309// CHECK-NEXT:   Succs (1): B01310// CHECK:      [B0 (EXIT)]1311// CHECK-NEXT:   Preds (3): B2 B1 B31312void test_catch_const_ref() {1313  try {1314  } catch (const A& e) {1315  }1316}1317 1318// CHECK:      [B3 (ENTRY)]1319// CHECK-NEXT:   Succs (1): B01320// CHECK:      [B1]1321// CHECK-NEXT:   T: try ...1322// CHECK-NEXT:   Succs (2): B2 B01323// CHECK:      [B2]1324// CHECK-NEXT:  catch (A e):1325// CHECK-NEXT:   1: catch (A e) {1326// CHECK-NEXT:  }1327// CHECK-NEXT:   2: [B2.1].~A() (Implicit destructor)1328// CHECK-NEXT:   Preds (1): B11329// CHECK-NEXT:   Succs (1): B01330// CHECK:      [B0 (EXIT)]1331// CHECK-NEXT:   Preds (3): B2 B1 B31332void test_catch_copy() {1333  try {1334  } catch (A e) {1335  }1336}1337