1461 lines · cpp
1// RUN: rm -f %t2// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=false -std=c++98 %s > %t 2>&13// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,CXX98,WARNINGS,CXX98-WARNINGS %s4// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=false -std=c++11 %s > %t 2>&15// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,CXX11,WARNINGS,CXX11-WARNINGS %s6// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=true -std=c++98 %s > %t 2>&17// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,CXX98,ANALYZER,CXX98-ANALYZER %s8// RUN: %clang_analyze_cc1 -analyzer-checker=debug.DumpCFG -analyzer-config cfg-rich-constructors=true -std=c++11 %s > %t 2>&19// RUN: FileCheck --input-file=%t -check-prefixes=CHECK,CXX11,ANALYZER,CXX11-ANALYZER %s10 11// This file tests how we construct two different flavors of the Clang CFG -12// the CFG used by the Sema analysis-based warnings and the CFG used by the13// static analyzer. The difference in the behavior is checked via FileCheck14// prefixes (WARNINGS and ANALYZER respectively). When introducing new analyzer15// flags, no new run lines should be added - just these flags would go to the16// respective line depending on where is it turned on and where is it turned17// off. Feel free to add tests that test only one of the CFG flavors if you're18// not sure how the other flavor is supposed to work in your case.19 20// Additionally, different C++ standards are checked.21 22class A {23public:24 A() {}25 ~A() {}26 27 static A make() { return A(); }28 29 operator bool() { return false; }30 operator int() { return 0; }31};32 33class B {34public:35 B() {}36 ~B() {}37 38 operator bool() { return true; }39 operator int() { return 1; }40 operator A() { return A(); }41};42 43void foo(int);44void foo(bool);45void foo(const A&);46 47void test_binary() {48 int a = int(A()) + int(B());49 foo(int(A()) + int(B()));50 int b;51}52 53void test_and() {54 bool a = A() && B();55 foo(A() && B());56 int b;57}58 59void test_or() {60 bool a = A() || B();61 foo(A() || B());62 int b;63}64 65void test_cond() {66 A a = B() ? A() : A(B());67 if (B()) { foo(0); } else { foo(0); }68 int b;69}70 71struct C {72 C():b_(true) {}73 ~C() {}74 75 operator bool() { return b_; }76 bool b_;77};78 79struct D {80 D():b_(true) {}81 82 operator bool() { return b_; }83 bool b_;84};85 86int test_cond_unnamed_custom_destructor() {87 if (C()) { return 1; } else { return 0; }88}89 90int test_cond_named_custom_destructor() {91 if (C c = C()) { return 1; } else { return 0; }92}93 94int test_cond_unnamed_auto_destructor() {95 if (D()) { return 1; } else { return 0; }96}97 98int test_cond_named_auto_destructor() {99 if (D d = D()) { return 1; } else { return 0; }100}101 102void test_cond_cref() {103 const A& a = B() ? A() : A(B());104 foo(B() ? A() : A(B()));105 int b;106}107 108void test_cond_implicit() {109 A a = A() ?: A();110 int b;111}112 113void test_cond_implicit_cref() {114 const A& a = A() ?: A();115 foo(A() ?: A());116 int b;117}118 119void test_copy_init() {120 A a = A();121 int b;122}123 124void test_cref_init() {125 const A& a = A();126 foo(A());127 int b;128}129 130void test_call_copy_init() {131 A a = A::make();132 int b;133}134 135void test_call_cref_init() {136 const A& a = A::make();137 foo(A::make());138 int b;139}140 141void test_assign() {142 int a;143 a = A();144 int b;145}146 147class TestCtorInits {148 int a;149 int b;150public:151 TestCtorInits();152};153 154TestCtorInits::TestCtorInits()155 : a(int(A()) + int(B()))156 , b() {}157 158class NoReturn {159public:160 ~NoReturn() __attribute__((noreturn));161 void f();162};163 164void test_noreturn1() {165 int a;166 NoReturn().f();167 int b;168}169 170void test_noreturn2() {171 int a;172 NoReturn(), 47;173 int b;174}175 176extern bool check(const NoReturn&);177 178// PR16664 and PR18159179int testConsistencyNestedSimple(bool value) {180 if (value) {181 if (!value || check(NoReturn())) {182 return 1;183 }184 }185 return 0;186}187 188// PR16664 and PR18159189int testConsistencyNestedComplex(bool value) {190 if (value) {191 if (!value || !value || check(NoReturn())) {192 return 1;193 }194 }195 return 0;196}197 198// PR16664 and PR18159199int testConsistencyNestedNormalReturn(bool value) {200 if (value) {201 if (!value || value || check(NoReturn())) {202 return 1;203 }204 }205 return 0;206}207 208namespace pass_references_through {209class C {210public:211 ~C() {}212};213 214const C &foo1();215C &&foo2();216 217// In these examples the foo() expression has record type, not reference type.218// Don't try to figure out how to perform construction of the record here.219const C &bar1() { return foo1(); } // no-crash220C &&bar2() { return foo2(); } // no-crash221const C &bar3(bool coin) {222 return coin ? foo1() : foo1(); // no-crash223}224} // end namespace pass_references_through225 226// CHECK: [B1 (ENTRY)]227// CHECK: Succs (1): B0228// CHECK: [B0 (EXIT)]229// CHECK: Preds (1): B1230// CHECK: [B1 (ENTRY)]231// CHECK: Succs (1): B0232// CHECK: [B0 (EXIT)]233// CHECK: Preds (1): B1234// CHECK: [B2 (ENTRY)]235// CHECK: Succs (1): B1236// CHECK: [B1]237// WARNINGS: 1: A() (CXXConstructExpr, A)238// ANALYZER: 1: A() (CXXConstructExpr, [B1.2], [B1.4], [B1.5], A)239// CHECK: 2: [B1.1] (BindTemporary)240// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const A)241// CHECK: 4: [B1.3]242// WARNINGS: 5: [B1.4] (CXXConstructExpr, A)243// ANALYZER: 5: [B1.4] (CXXConstructExpr, [B1.7], A)244// CHECK: 6: ~A() (Temporary object destructor)245// CHECK: 7: return [B1.5];246// CHECK: Preds (1): B2247// CHECK: Succs (1): B0248// CHECK: [B0 (EXIT)]249// CHECK: Preds (1): B1250// CHECK: [B2 (ENTRY)]251// CHECK: Succs (1): B1252// CHECK: [B1]253// CHECK: 1: false254// CHECK: 2: return [B1.1];255// CHECK: Preds (1): B2256// CHECK: Succs (1): B0257// CHECK: [B0 (EXIT)]258// CHECK: Preds (1): B1259// CHECK: [B2 (ENTRY)]260// CHECK: Succs (1): B1261// CHECK: [B1]262// CHECK: 1: 0263// CHECK: 2: return [B1.1];264// CHECK: Preds (1): B2265// CHECK: Succs (1): B0266// CHECK: [B0 (EXIT)]267// CHECK: Preds (1): B1268// CHECK: [B1 (ENTRY)]269// CHECK: Succs (1): B0270// CHECK: [B0 (EXIT)]271// CHECK: Preds (1): B1272// CHECK: [B1 (ENTRY)]273// CHECK: Succs (1): B0274// CHECK: [B0 (EXIT)]275// CHECK: Preds (1): B1276// CHECK: [B2 (ENTRY)]277// CHECK: Succs (1): B1278// CHECK: [B1]279// CHECK: 1: true280// CHECK: 2: return [B1.1];281// CHECK: Preds (1): B2282// CHECK: Succs (1): B0283// CHECK: [B0 (EXIT)]284// CHECK: Preds (1): B1285// CHECK: [B2 (ENTRY)]286// CHECK: Succs (1): B1287// CHECK: [B1]288// CHECK: 1: 1289// CHECK: 2: return [B1.1];290// CHECK: Preds (1): B2291// CHECK: Succs (1): B0292// CHECK: [B0 (EXIT)]293// CHECK: Preds (1): B1294// CHECK: [B2 (ENTRY)]295// CHECK: Succs (1): B1296// CHECK: [B1]297// WARNINGS: 1: A() (CXXConstructExpr, A)298// ANALYZER: 1: A() (CXXConstructExpr, [B1.2], [B1.4], [B1.5], A)299// CHECK: 2: [B1.1] (BindTemporary)300// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const A)301// CHECK: 4: [B1.3]302// WARNINGS: 5: [B1.4] (CXXConstructExpr, A)303// ANALYZER: 5: [B1.4] (CXXConstructExpr, [B1.7], A)304// CHECK: 6: ~A() (Temporary object destructor)305// CHECK: 7: return [B1.5];306// CHECK: Preds (1): B2307// CHECK: Succs (1): B0308// CHECK: [B0 (EXIT)]309// CHECK: Preds (1): B1310// CHECK: [B2 (ENTRY)]311// CHECK: Succs (1): B1312// CHECK: [B1]313// WARNINGS: 1: A() (CXXConstructExpr, A)314// ANALYZER: 1: A() (CXXConstructExpr, [B1.2], [B1.3], A)315// CHECK: 2: [B1.1] (BindTemporary)316// CHECK: 3: [B1.2]317// CHECK: 4: [B1.3].operator int318// CHECK: 5: [B1.3]319// CHECK: 6: [B1.5] (ImplicitCastExpr, UserDefinedConversion, int)320// CHECK: 7: int([B1.6]) (CXXFunctionalCastExpr, NoOp, int)321// WARNINGS: 8: B() (CXXConstructExpr, B)322// ANALYZER: 8: B() (CXXConstructExpr, [B1.9], [B1.10], B)323// CHECK: 9: [B1.8] (BindTemporary)324// CHECK: 10: [B1.9]325// CHECK: 11: [B1.10].operator int326// CHECK: 12: [B1.10]327// CHECK: 13: [B1.12] (ImplicitCastExpr, UserDefinedConversion, int)328// CHECK: 14: int([B1.13]) (CXXFunctionalCastExpr, NoOp, int)329// CHECK: 15: [B1.7] + [B1.14]330// CHECK: 16: int a = int(A()) + int(B());331// CHECK: 17: ~B() (Temporary object destructor)332// CHECK: 18: ~A() (Temporary object destructor)333// CHECK: 19: foo334// CHECK: 20: [B1.19] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))335// WARNINGS: 21: A() (CXXConstructExpr, A)336// ANALYZER: 21: A() (CXXConstructExpr, [B1.22], [B1.23], A)337// CHECK: 22: [B1.21] (BindTemporary)338// CHECK: 23: [B1.22]339// CHECK: 24: [B1.23].operator int340// CHECK: 25: [B1.23]341// CHECK: 26: [B1.25] (ImplicitCastExpr, UserDefinedConversion, int)342// CHECK: 27: int([B1.26]) (CXXFunctionalCastExpr, NoOp, int)343// WARNINGS: 28: B() (CXXConstructExpr, B)344// ANALYZER: 28: B() (CXXConstructExpr, [B1.29], [B1.30], B)345// CHECK: 29: [B1.28] (BindTemporary)346// CHECK: 30: [B1.29]347// CHECK: 31: [B1.30].operator int348// CHECK: 32: [B1.30]349// CHECK: 33: [B1.32] (ImplicitCastExpr, UserDefinedConversion, int)350// CHECK: 34: int([B1.33]) (CXXFunctionalCastExpr, NoOp, int)351// CHECK: 35: [B1.27] + [B1.34]352// CHECK: 36: [B1.20]([B1.35])353// CHECK: 37: ~B() (Temporary object destructor)354// CHECK: 38: ~A() (Temporary object destructor)355// CHECK: 39: int b;356// CHECK: Preds (1): B2357// CHECK: Succs (1): B0358// CHECK: [B0 (EXIT)]359// CHECK: Preds (1): B1360// CHECK: [B10 (ENTRY)]361// CHECK: Succs (1): B9362// CHECK: [B1]363// CHECK: 1: ~A() (Temporary object destructor)364// CHECK: 2: int b;365// CHECK: Preds (2): B2 B3366// CHECK: Succs (1): B0367// CHECK: [B2]368// CHECK: 1: ~B() (Temporary object destructor)369// CHECK: Preds (1): B3370// CHECK: Succs (1): B1371// CHECK: [B3]372// CHECK: 1: [B5.9] && [B4.6]373// CHECK: 2: [B5.3]([B3.1])374// CHECK: T: (Temp Dtor) [B4.2]375// CHECK: Preds (2): B4 B5376// CHECK: Succs (2): B2 B1377// CHECK: [B4]378// WARNINGS: 1: B() (CXXConstructExpr, B)379// ANALYZER: 1: B() (CXXConstructExpr, [B4.2], [B4.3], B)380// CHECK: 2: [B4.1] (BindTemporary)381// CHECK: 3: [B4.2]382// CHECK: 4: [B4.3].operator bool383// CHECK: 5: [B4.3]384// CHECK: 6: [B4.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)385// CHECK: Preds (1): B5386// CHECK: Succs (1): B3387// CHECK: [B5]388// CHECK: 1: ~A() (Temporary object destructor)389// CHECK: 2: foo390// CHECK: 3: [B5.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool))391// WARNINGS: 4: A() (CXXConstructExpr, A)392// ANALYZER: 4: A() (CXXConstructExpr, [B5.5], [B5.6], A)393// CHECK: 5: [B5.4] (BindTemporary)394// CHECK: 6: [B5.5]395// CHECK: 7: [B5.6].operator bool396// CHECK: 8: [B5.6]397// CHECK: 9: [B5.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)398// CHECK: T: [B5.9] && ...399// CHECK: Preds (2): B6 B7400// CHECK: Succs (2): B4 B3401// CHECK: [B6]402// CHECK: 1: ~B() (Temporary object destructor)403// CHECK: Preds (1): B7404// CHECK: Succs (1): B5405// CHECK: [B7]406// CHECK: 1: [B9.6] && [B8.6]407// CHECK: 2: bool a = A() && B();408// CHECK: T: (Temp Dtor) [B8.2]409// CHECK: Preds (2): B8 B9410// CHECK: Succs (2): B6 B5411// CHECK: [B8]412// WARNINGS: 1: B() (CXXConstructExpr, B)413// ANALYZER: 1: B() (CXXConstructExpr, [B8.2], [B8.3], B)414// CHECK: 2: [B8.1] (BindTemporary)415// CHECK: 3: [B8.2]416// CHECK: 4: [B8.3].operator bool417// CHECK: 5: [B8.3]418// CHECK: 6: [B8.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)419// CHECK: Preds (1): B9420// CHECK: Succs (1): B7421// CHECK: [B9]422// WARNINGS: 1: A() (CXXConstructExpr, A)423// ANALYZER: 1: A() (CXXConstructExpr, [B9.2], [B9.3], A)424// CHECK: 2: [B9.1] (BindTemporary)425// CHECK: 3: [B9.2]426// CHECK: 4: [B9.3].operator bool427// CHECK: 5: [B9.3]428// CHECK: 6: [B9.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)429// CHECK: T: [B9.6] && ...430// CHECK: Preds (1): B10431// CHECK: Succs (2): B8 B7432// CHECK: [B0 (EXIT)]433// CHECK: Preds (1): B1434// CHECK: [B10 (ENTRY)]435// CHECK: Succs (1): B9436// CHECK: [B1]437// CHECK: 1: ~A() (Temporary object destructor)438// CHECK: 2: int b;439// CHECK: Preds (2): B2 B3440// CHECK: Succs (1): B0441// CHECK: [B2]442// CHECK: 1: ~B() (Temporary object destructor)443// CHECK: Preds (1): B3444// CHECK: Succs (1): B1445// CHECK: [B3]446// CHECK: 1: [B5.9] || [B4.6]447// CHECK: 2: [B5.3]([B3.1])448// CHECK: T: (Temp Dtor) [B4.2]449// CHECK: Preds (2): B4 B5450// CHECK: Succs (2): B2 B1451// CHECK: [B4]452// WARNINGS: 1: B() (CXXConstructExpr, B)453// ANALYZER: 1: B() (CXXConstructExpr, [B4.2], [B4.3], B)454// CHECK: 2: [B4.1] (BindTemporary)455// CHECK: 3: [B4.2]456// CHECK: 4: [B4.3].operator bool457// CHECK: 5: [B4.3]458// CHECK: 6: [B4.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)459// CHECK: Preds (1): B5460// CHECK: Succs (1): B3461// CHECK: [B5]462// CHECK: 1: ~A() (Temporary object destructor)463// CHECK: 2: foo464// CHECK: 3: [B5.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(_Bool))465// WARNINGS: 4: A() (CXXConstructExpr, A)466// ANALYZER: 4: A() (CXXConstructExpr, [B5.5], [B5.6], A)467// CHECK: 5: [B5.4] (BindTemporary)468// CHECK: 6: [B5.5]469// CHECK: 7: [B5.6].operator bool470// CHECK: 8: [B5.6]471// CHECK: 9: [B5.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)472// CHECK: T: [B5.9] || ...473// CHECK: Preds (2): B6 B7474// CHECK: Succs (2): B3 B4475// CHECK: [B6]476// CHECK: 1: ~B() (Temporary object destructor)477// CHECK: Preds (1): B7478// CHECK: Succs (1): B5479// CHECK: [B7]480// CHECK: 1: [B9.6] || [B8.6]481// CHECK: 2: bool a = A() || B();482// CHECK: T: (Temp Dtor) [B8.2]483// CHECK: Preds (2): B8 B9484// CHECK: Succs (2): B6 B5485// CHECK: [B8]486// WARNINGS: 1: B() (CXXConstructExpr, B)487// ANALYZER: 1: B() (CXXConstructExpr, [B8.2], [B8.3], B)488// CHECK: 2: [B8.1] (BindTemporary)489// CHECK: 3: [B8.2]490// CHECK: 4: [B8.3].operator bool491// CHECK: 5: [B8.3]492// CHECK: 6: [B8.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)493// CHECK: Preds (1): B9494// CHECK: Succs (1): B7495// CHECK: [B9]496// WARNINGS: 1: A() (CXXConstructExpr, A)497// ANALYZER: 1: A() (CXXConstructExpr, [B9.2], [B9.3], A)498// CHECK: 2: [B9.1] (BindTemporary)499// CHECK: 3: [B9.2]500// CHECK: 4: [B9.3].operator bool501// CHECK: 5: [B9.3]502// CHECK: 6: [B9.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)503// CHECK: T: [B9.6] || ...504// CHECK: Preds (1): B10505// CHECK: Succs (2): B7 B8506// CHECK: [B0 (EXIT)]507// CHECK: Preds (1): B1508// CHECK: [B11 (ENTRY)]509// CHECK: Succs (1): B10510// CHECK: [B1]511// CHECK: 1: int b;512// CHECK: 2: [B7.5].~A() (Implicit destructor)513// CHECK: Preds (2): B2 B3514// CHECK: Succs (1): B0515// CHECK: [B2]516// CHECK: 1: foo517// CHECK: 2: [B2.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))518// CHECK: 3: 0519// CHECK: 4: [B2.2]([B2.3])520// CHECK: Preds (1): B4521// CHECK: Succs (1): B1522// CHECK: [B3]523// CHECK: 1: foo524// CHECK: 2: [B3.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(int))525// CHECK: 3: 0526// CHECK: 4: [B3.2]([B3.3])527// CHECK: Preds (1): B4528// CHECK: Succs (1): B1529// CHECK: [B4]530// CHECK: 1: ~B() (Temporary object destructor)531// WARNINGS: 2: B() (CXXConstructExpr, B)532// ANALYZER: 2: B() (CXXConstructExpr, [B4.3], [B4.4], B)533// CHECK: 3: [B4.2] (BindTemporary)534// CHECK: 4: [B4.3]535// CHECK: 5: [B4.4].operator bool536// CHECK: 6: [B4.4]537// CHECK: 7: [B4.6] (ImplicitCastExpr, UserDefinedConversion, _Bool)538// CHECK: 8: ~B() (Temporary object destructor)539// CHECK: T: if [B4.7]540// CHECK: Preds (2): B5 B6541// CHECK: Succs (2): B3 B2542// CHECK: [B5]543// CHECK: 1: ~A() (Temporary object destructor)544// CHECK: 2: ~A() (Temporary object destructor)545// CHECK: Preds (1): B7546// CHECK: Succs (1): B4547// CHECK: [B6]548// CHECK: 1: ~A() (Temporary object destructor)549// CHECK: 2: ~A() (Temporary object destructor)550// CHECK: 3: ~A() (Temporary object destructor)551// CHECK: 4: ~B() (Temporary object destructor)552// CHECK: Preds (1): B7553// CHECK: Succs (1): B4554// CHECK: [B7]555// CHECK: 1: [B10.6] ? [B8.6] : [B9.16]556// CHECK: 2: [B7.1] (ImplicitCastExpr, NoOp, const A)557// CHECK: 3: [B7.2]558// WARNINGS: 4: [B7.3] (CXXConstructExpr, A)559// ANALYZER: 4: [B7.3] (CXXConstructExpr, [B7.5], A)560// CHECK: 5: A a = B() ? A() : A(B());561// CHECK: T: (Temp Dtor) [B9.2]562// CHECK: Preds (2): B8 B9563// CHECK: Succs (2): B6 B5564// CHECK: [B8]565// WARNINGS: 1: A() (CXXConstructExpr, A)566// ANALYZER: 1: A() (CXXConstructExpr, [B8.2], [B8.4], [B8.5], A)567// CHECK: 2: [B8.1] (BindTemporary)568// CHECK: 3: [B8.2] (ImplicitCastExpr, NoOp, const A)569// CHECK: 4: [B8.3]570// WARNINGS: 5: [B8.4] (CXXConstructExpr, A)571// ANALYZER: 5: [B8.4] (CXXConstructExpr, [B8.6], [B7.3], [B7.4], A)572// CHECK: 6: [B8.5] (BindTemporary)573// CHECK: Preds (1): B10574// CHECK: Succs (1): B7575// CHECK: [B9]576// WARNINGS: 1: B() (CXXConstructExpr, B)577// ANALYZER: 1: B() (CXXConstructExpr, [B9.2], [B9.3], B)578// CHECK: 2: [B9.1] (BindTemporary)579// CHECK: 3: [B9.2]580// CHECK: 4: [B9.3].operator A581// CHECK: 5: [B9.3]582// CHECK: 6: [B9.5] (ImplicitCastExpr, UserDefinedConversion, A)583// CHECK: 7: [B9.6] (BindTemporary)584// CHECK: 8: [B9.7] (ImplicitCastExpr, NoOp, const A)585// CHECK: 9: [B9.8]586// WARNINGS: 10: [B9.9] (CXXConstructExpr, A)587// ANALYZER: 10: [B9.9] (CXXConstructExpr, [B9.11], [B9.14], [B9.15], A)588// CHECK: 11: [B9.10] (BindTemporary)589// CHECK: 12: A([B9.11]) (CXXFunctionalCastExpr, ConstructorConversion, A)590// CHECK: 13: [B9.12] (ImplicitCastExpr, NoOp, const A)591// CHECK: 14: [B9.13]592// WARNINGS: 15: [B9.14] (CXXConstructExpr, A)593// ANALYZER: 15: [B9.14] (CXXConstructExpr, [B9.16], [B7.3], [B7.4], A)594// CHECK: 16: [B9.15] (BindTemporary)595// CHECK: Preds (1): B10596// CHECK: Succs (1): B7597// CHECK: [B10]598// WARNINGS: 1: B() (CXXConstructExpr, B)599// ANALYZER: 1: B() (CXXConstructExpr, [B10.2], [B10.3], B)600// CHECK: 2: [B10.1] (BindTemporary)601// CHECK: 3: [B10.2]602// CHECK: 4: [B10.3].operator bool603// CHECK: 5: [B10.3]604// CHECK: 6: [B10.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)605// CHECK: T: [B10.6] ? ... : ...606// CHECK: Preds (1): B11607// CHECK: Succs (2): B8 B9608// CHECK: [B0 (EXIT)]609// CHECK: Preds (1): B1610// CHECK: [B2 (ENTRY)]611// CHECK: Succs (1): B1612// CHECK: [B1]613// CHECK: 1: true614// CHECK: 2: b_([B1.1]) (Member initializer)615// CHECK: Preds (1): B2616// CHECK: Succs (1): B0617// CHECK: [B0 (EXIT)]618// CHECK: Preds (1): B1619// CHECK: [B1 (ENTRY)]620// CHECK: Succs (1): B0621// CHECK: [B0 (EXIT)]622// CHECK: Preds (1): B1623// CHECK: [B2 (ENTRY)]624// CHECK: Succs (1): B1625// CHECK: [B1]626// CHECK: 1: this627// CHECK: 2: [B1.1]->b_628// CHECK: 3: [B1.2] (ImplicitCastExpr, LValueToRValue, _Bool)629// CHECK: 4: return [B1.3];630// CHECK: Preds (1): B2631// CHECK: Succs (1): B0632// CHECK: [B0 (EXIT)]633// CHECK: Preds (1): B1634// CHECK: [B2 (ENTRY)]635// CHECK: Succs (1): B1636// CHECK: [B1]637// CHECK: 1: true638// CHECK: 2: b_([B1.1]) (Member initializer)639// CHECK: Preds (1): B2640// CHECK: Succs (1): B0641// CHECK: [B0 (EXIT)]642// CHECK: Preds (1): B1643// CHECK: [B2 (ENTRY)]644// CHECK: Succs (1): B1645// CHECK: [B1]646// CHECK: 1: this647// CHECK: 2: [B1.1]->b_648// CHECK: 3: [B1.2] (ImplicitCastExpr, LValueToRValue, _Bool)649// CHECK: 4: return [B1.3];650// CHECK: Preds (1): B2651// CHECK: Succs (1): B0652// CHECK: [B0 (EXIT)]653// CHECK: Preds (1): B1654// CHECK: [B4 (ENTRY)]655// CHECK: Succs (1): B3656// CHECK: [B1]657// CHECK: 1: 0658// CHECK: 2: return [B1.1];659// CHECK: Preds (1): B3660// CHECK: Succs (1): B0661// CHECK: [B2]662// CHECK: 1: 1663// CHECK: 2: return [B2.1];664// CHECK: Preds (1): B3665// CHECK: Succs (1): B0666// CHECK: [B3]667// WARNINGS: 1: C() (CXXConstructExpr, C)668// ANALYZER: 1: C() (CXXConstructExpr, [B3.2], [B3.3], C)669// CHECK: 2: [B3.1] (BindTemporary)670// CHECK: 3: [B3.2]671// CHECK: 4: [B3.3].operator bool672// CHECK: 5: [B3.3]673// CHECK: 6: [B3.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)674// CHECK: 7: ~C() (Temporary object destructor)675// CHECK: T: if [B3.6]676// CHECK: Preds (1): B4677// CHECK: Succs (2): B2 B1678// CHECK: [B0 (EXIT)]679// CHECK: Preds (2): B1 B2680// CHECK: [B5 (ENTRY)]681// CHECK: Succs (1): B4682// CHECK: [B1]683// CHECK: 1: [B4.6].~C() (Implicit destructor)684// CHECK: Succs (1): B0685// CHECK: [B2]686// CHECK: 1: 0687// CHECK: 2: return [B2.1];688// CHECK: 3: [B4.6].~C() (Implicit destructor)689// CHECK: Preds (1): B4690// CHECK: Succs (1): B0691// CHECK: [B3]692// CHECK: 1: 1693// CHECK: 2: return [B3.1];694// CHECK: 3: [B4.6].~C() (Implicit destructor)695// CHECK: Preds (1): B4696// CHECK: Succs (1): B0697// CHECK: [B4]698// WARNINGS: 1: C() (CXXConstructExpr, C)699// ANALYZER: 1: C() (CXXConstructExpr, [B4.2], [B4.4], [B4.5], C)700// CHECK: 2: [B4.1] (BindTemporary)701// CHECK: 3: [B4.2] (ImplicitCastExpr, NoOp, const C)702// CHECK: 4: [B4.3]703// WARNINGS: 5: [B4.4] (CXXConstructExpr, C)704// ANALYZER: 5: [B4.4] (CXXConstructExpr, [B4.6], C)705// CHECK: 6: C c = C();706// CHECK: 7: ~C() (Temporary object destructor)707// CHECK: 8: c708// CHECK: 9: [B4.8].operator bool709// CHECK: 10: [B4.8]710// CHECK: 11: [B4.10] (ImplicitCastExpr, UserDefinedConversion, _Bool)711// CHECK: T: if [B4.11]712// CHECK: Preds (1): B5713// CHECK: Succs (2): B3 B2714// CHECK: [B0 (EXIT)]715// CHECK: Preds (3): B1 B2 B3716// CHECK: [B4 (ENTRY)]717// CHECK: Succs (1): B3718// CHECK: [B1]719// CHECK: 1: 0720// CHECK: 2: return [B1.1];721// CHECK: Preds (1): B3722// CHECK: Succs (1): B0723// CHECK: [B2]724// CHECK: 1: 1725// CHECK: 2: return [B2.1];726// CHECK: Preds (1): B3727// CHECK: Succs (1): B0728// CHECK: [B3]729// WARNINGS: 1: D() (CXXConstructExpr, D)730// ANALYZER: 1: D() (CXXConstructExpr, [B3.2], D)731// CHECK: 2: [B3.1]732// CHECK: 3: [B3.2].operator bool733// CHECK: 4: [B3.2]734// CHECK: 5: [B3.4] (ImplicitCastExpr, UserDefinedConversion, _Bool)735// CHECK: T: if [B3.5]736// CHECK: Preds (1): B4737// CHECK: Succs (2): B2 B1738// CHECK: [B0 (EXIT)]739// CHECK: Preds (2): B1 B2740// CHECK: [B4 (ENTRY)]741// CHECK: Succs (1): B3742// CHECK: [B1]743// CHECK: 1: 0744// CHECK: 2: return [B1.1];745// CHECK: Preds (1): B3746// CHECK: Succs (1): B0747// CHECK: [B2]748// CHECK: 1: 1749// CHECK: 2: return [B2.1];750// CHECK: Preds (1): B3751// CHECK: Succs (1): B0752// CHECK: [B3]753// CXX98-WARNINGS: 1: D() (CXXConstructExpr, D)754// CXX98-ANALYZER: 1: D() (CXXConstructExpr, [B3.3], [B3.4], D)755// CXX98: 2: [B3.1] (ImplicitCastExpr, NoOp, const D)756// CXX98: 3: [B3.2]757// CXX98-WARNINGS: 4: [B3.3] (CXXConstructExpr, D)758// CXX98-ANALYZER: 4: [B3.3] (CXXConstructExpr, [B3.5], D)759// CXX98: 5: D d = D();760// CXX98: 6: d761// CXX98: 7: [B3.6].operator bool762// CXX98: 8: [B3.6]763// CXX98: 9: [B3.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)764// CXX98: T: if [B3.9]765// CXX11-WARNINGS: 1: D() (CXXConstructExpr, D)766// CXX11-ANALYZER: 1: D() (CXXConstructExpr, [B3.2], [B3.3], D)767// CXX11: 2: [B3.1]768// CXX11-WARNINGS: 3: [B3.2] (CXXConstructExpr, D)769// CXX11-ANALYZER: 3: [B3.2] (CXXConstructExpr, [B3.4], D)770// CXX11: 4: D d = D();771// CXX11: 5: d772// CXX11: 6: [B3.5].operator bool773// CXX11: 7: [B3.5]774// CXX11: 8: [B3.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)775// CXX11: T: if [B3.8]776// CHECK: Preds (1): B4777// CHECK: Succs (2): B2 B1778// CHECK: [B0 (EXIT)]779// CHECK: Preds (2): B1 B2780// CHECK: [B14 (ENTRY)]781// CHECK: Succs (1): B13782// CHECK: [B1]783// CHECK: 1: ~B() (Temporary object destructor)784// CHECK: 2: int b;785// CHECK: 3: [B10.4].~A() (Implicit destructor)786// CHECK: Preds (2): B2 B3787// CHECK: Succs (1): B0788// CHECK: [B2]789// CHECK: 1: ~A() (Temporary object destructor)790// CHECK: 2: ~A() (Temporary object destructor)791// CHECK: Preds (1): B4792// CHECK: Succs (1): B1793// CHECK: [B3]794// CHECK: 1: ~A() (Temporary object destructor)795// CHECK: 2: ~A() (Temporary object destructor)796// CHECK: 3: ~A() (Temporary object destructor)797// CHECK: 4: ~B() (Temporary object destructor)798// CHECK: Preds (1): B4799// CHECK: Succs (1): B1800// CHECK: [B4]801// CHECK: 1: [B7.9] ? [B5.6] : [B6.16]802// CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const A)803// CHECK: 3: [B4.2]804// CHECK: 4: [B7.3]([B4.3])805// CHECK: T: (Temp Dtor) [B6.2]806// CHECK: Preds (2): B5 B6807// CHECK: Succs (2): B3 B2808// CHECK: [B5]809// WARNINGS: 1: A() (CXXConstructExpr, A)810// ANALYZER: 1: A() (CXXConstructExpr, [B5.2], [B5.4], [B5.5], A)811// CHECK: 2: [B5.1] (BindTemporary)812// CHECK: 3: [B5.2] (ImplicitCastExpr, NoOp, const A)813// CHECK: 4: [B5.3]814// WARNINGS: 5: [B5.4] (CXXConstructExpr, A)815// ANALYZER: 5: [B5.4] (CXXConstructExpr, [B5.6], [B4.3], A)816// CHECK: 6: [B5.5] (BindTemporary)817// CHECK: Preds (1): B7818// CHECK: Succs (1): B4819// CHECK: [B6]820// WARNINGS: 1: B() (CXXConstructExpr, B)821// ANALYZER: 1: B() (CXXConstructExpr, [B6.2], [B6.3], B)822// CHECK: 2: [B6.1] (BindTemporary)823// CHECK: 3: [B6.2]824// CHECK: 4: [B6.3].operator A825// CHECK: 5: [B6.3]826// CHECK: 6: [B6.5] (ImplicitCastExpr, UserDefinedConversion, A)827// CHECK: 7: [B6.6] (BindTemporary)828// CHECK: 8: [B6.7] (ImplicitCastExpr, NoOp, const A)829// CHECK: 9: [B6.8]830// WARNINGS: 10: [B6.9] (CXXConstructExpr, A)831// ANALYZER: 10: [B6.9] (CXXConstructExpr, [B6.11], [B6.14], [B6.15], A)832// CHECK: 11: [B6.10] (BindTemporary)833// CHECK: 12: A([B6.11]) (CXXFunctionalCastExpr, ConstructorConversion, A)834// CHECK: 13: [B6.12] (ImplicitCastExpr, NoOp, const A)835// CHECK: 14: [B6.13]836// WARNINGS: 15: [B6.14] (CXXConstructExpr, A)837// ANALYZER: 15: [B6.14] (CXXConstructExpr, [B6.16], [B4.3], A)838// CHECK: 16: [B6.15] (BindTemporary)839// CHECK: Preds (1): B7840// CHECK: Succs (1): B4841// CHECK: [B7]842// CHECK: 1: ~B() (Temporary object destructor)843// CHECK: 2: foo844// CHECK: 3: [B7.2] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const A &))845// WARNINGS: 4: B() (CXXConstructExpr, B)846// ANALYZER: 4: B() (CXXConstructExpr, [B7.5], [B7.6], B)847// CHECK: 5: [B7.4] (BindTemporary)848// CHECK: 6: [B7.5]849// CHECK: 7: [B7.6].operator bool850// CHECK: 8: [B7.6]851// CHECK: 9: [B7.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)852// CHECK: T: [B7.9] ? ... : ...853// CHECK: Preds (2): B8 B9854// CHECK: Succs (2): B5 B6855// CHECK: [B8]856// CHECK: 1: ~A() (Temporary object destructor)857// CHECK: Preds (1): B10858// CHECK: Succs (1): B7859// CHECK: [B9]860// CHECK: 1: ~A() (Temporary object destructor)861// CHECK: 2: ~A() (Temporary object destructor)862// CHECK: 3: ~B() (Temporary object destructor)863// CHECK: Preds (1): B10864// CHECK: Succs (1): B7865// CHECK: [B10]866// CHECK: 1: [B13.6] ? [B11.6] : [B12.16]867// CHECK: 2: [B10.1] (ImplicitCastExpr, NoOp, const A)868// CHECK: 3: [B10.2]869// CHECK: 4: const A &a = B() ? A() : A(B());870// CHECK: T: (Temp Dtor) [B12.2]871// CHECK: Preds (2): B11 B12872// CHECK: Succs (2): B9 B8873// CHECK: [B11]874// WARNINGS: 1: A() (CXXConstructExpr, A)875// ANALYZER: 1: A() (CXXConstructExpr, [B11.2], [B11.4], [B11.5], A)876// CHECK: 2: [B11.1] (BindTemporary)877// CHECK: 3: [B11.2] (ImplicitCastExpr, NoOp, const A)878// CHECK: 4: [B11.3]879// WARNINGS: 5: [B11.4] (CXXConstructExpr, A)880// ANALYZER: 5: [B11.4] (CXXConstructExpr, [B10.3], A)881// CHECK: 6: [B11.5] (BindTemporary)882// CHECK: Preds (1): B13883// CHECK: Succs (1): B10884// CHECK: [B12]885// WARNINGS: 1: B() (CXXConstructExpr, B)886// ANALYZER: 1: B() (CXXConstructExpr, [B12.2], [B12.3], B)887// CHECK: 2: [B12.1] (BindTemporary)888// CHECK: 3: [B12.2]889// CHECK: 4: [B12.3].operator A890// CHECK: 5: [B12.3]891// CHECK: 6: [B12.5] (ImplicitCastExpr, UserDefinedConversion, A)892// CHECK: 7: [B12.6] (BindTemporary)893// CHECK: 8: [B12.7] (ImplicitCastExpr, NoOp, const A)894// CHECK: 9: [B12.8]895// WARNINGS: 10: [B12.9] (CXXConstructExpr, A)896// ANALYZER: 10: [B12.9] (CXXConstructExpr, [B12.11], [B12.14], [B12.15], A)897// CHECK: 11: [B12.10] (BindTemporary)898// CHECK: 12: A([B12.11]) (CXXFunctionalCastExpr, ConstructorConversion, A)899// CHECK: 13: [B12.12] (ImplicitCastExpr, NoOp, const A)900// CHECK: 14: [B12.13]901// WARNINGS: 15: [B12.14] (CXXConstructExpr, A)902// ANALYZER: 15: [B12.14] (CXXConstructExpr, [B10.3], A)903// CHECK: 16: [B12.15] (BindTemporary)904// CHECK: Preds (1): B13905// CHECK: Succs (1): B10906// CHECK: [B13]907// WARNINGS: 1: B() (CXXConstructExpr, B)908// ANALYZER: 1: B() (CXXConstructExpr, [B13.2], [B13.3], B)909// CHECK: 2: [B13.1] (BindTemporary)910// CHECK: 3: [B13.2]911// CHECK: 4: [B13.3].operator bool912// CHECK: 5: [B13.3]913// CHECK: 6: [B13.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)914// CHECK: T: [B13.6] ? ... : ...915// CHECK: Preds (1): B14916// CHECK: Succs (2): B11 B12917// CHECK: [B0 (EXIT)]918// CHECK: Preds (1): B1919// CHECK: [B8 (ENTRY)]920// CHECK: Succs (1): B7921// CHECK: [B1]922// CHECK: 1: int b;923// CHECK: 2: [B4.5].~A() (Implicit destructor)924// CHECK: Preds (2): B2 B3925// CHECK: Succs (1): B0926// CHECK: [B2]927// CHECK: 1: ~A() (Temporary object destructor)928// CHECK: Preds (1): B4929// CHECK: Succs (1): B1930// CHECK: [B3]931// CHECK: 1: ~A() (Temporary object destructor)932// CHECK: 2: ~A() (Temporary object destructor)933// CHECK: Preds (1): B4934// CHECK: Succs (1): B1935// CHECK: [B4]936// CXX98: 1: [B7.2] ?: [B6.6]937// CXX11: 1: [B7.3] ?: [B6.6]938// CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const A)939// CHECK: 3: [B4.2]940// WARNINGS: 4: [B4.3] (CXXConstructExpr, A)941// ANALYZER: 4: [B4.3] (CXXConstructExpr, [B4.5], A)942// CHECK: 5: A a = A() ?: A();943// CHECK: T: (Temp Dtor) [B6.2]944// CHECK: Preds (2): B5 B6945// CHECK: Succs (2): B3 B2946// CHECK: [B5]947// CXX98: 1: [B7.2] (ImplicitCastExpr, NoOp, const A)948// CXX98: 2: [B5.1]949// WARNINGS-CXX98: 3: [B5.2] (CXXConstructExpr, A)950// ANALYZER-CXX98: 3: [B5.2] (CXXConstructExpr, [B5.4], A)951// CXX98: 4: [B5.3] (BindTemporary)952// CXX11: 1: [B7.3] (ImplicitCastExpr, NoOp, const A)953// WARNINGS-CXX11: 2: [B5.1] (CXXConstructExpr, A)954// ANALYZER-CXX11: 2: [B5.1] (CXXConstructExpr, [B5.3], A)955// CXX11: 3: [B5.2] (BindTemporary)956// CHECK: Preds (1): B7957// CHECK: Succs (1): B4958// CHECK: [B6]959// WARNINGS: 1: A() (CXXConstructExpr, A)960// ANALYZER: 1: A() (CXXConstructExpr, [B6.2], [B6.4], [B6.5], A)961// CHECK: 2: [B6.1] (BindTemporary)962// CHECK: 3: [B6.2] (ImplicitCastExpr, NoOp, const A)963// CHECK: 4: [B6.3]964// WARNINGS: 5: [B6.4] (CXXConstructExpr, A)965// ANALYZER: 5: [B6.4] (CXXConstructExpr, [B6.6], A)966// CHECK: 6: [B6.5] (BindTemporary)967// CHECK: Preds (1): B7968// CHECK: Succs (1): B4969// CHECK: [B7]970// WARNINGS: 1: A() (CXXConstructExpr, A)971// ANALYZER-CXX98: 1: A() (CXXConstructExpr, [B7.2], [B7.3], A)972// ANALYZER-CXX11: 1: A() (CXXConstructExpr, [B7.2], A)973// CHECK: 2: [B7.1] (BindTemporary)974// CHECK: 3: [B7.2]975// CHECK: 4: [B7.3].operator bool976// CHECK: 5: [B7.3]977// CHECK: 6: [B7.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)978// CHECK: T: [B7.6] ? ... : ...979// CHECK: Preds (1): B8980// CHECK: Succs (2): B5 B6981// CHECK: [B0 (EXIT)]982// CHECK: Preds (1): B1983// CHECK: [B13 (ENTRY)]984// CHECK: Succs (1): B12985// CHECK: [B1]986// CHECK: 1: int b;987// CHECK: 2: [B9.4].~A() (Implicit destructor)988// CHECK: Preds (2): B2 B3989// CHECK: Succs (1): B0990// CHECK: [B2]991// CHECK: 1: ~A() (Temporary object destructor)992// CHECK: Preds (1): B4993// CHECK: Succs (1): B1994// CHECK: [B3]995// CHECK: 1: ~A() (Temporary object destructor)996// CHECK: 2: ~A() (Temporary object destructor)997// CHECK: Preds (1): B4998// CHECK: Succs (1): B1999// CHECK: [B4]1000// CXX98: 1: [B7.4] ?: [B6.6]1001// CXX11: 1: [B7.5] ?: [B6.6]1002// CHECK: 2: [B4.1] (ImplicitCastExpr, NoOp, const A)1003// CHECK: 3: [B4.2]1004// CHECK: 4: [B7.2]([B4.3])1005// CHECK: T: (Temp Dtor) [B6.2]1006// CHECK: Preds (2): B5 B61007// CHECK: Succs (2): B3 B21008// CHECK: [B5]1009// CXX98: 1: [B7.4] (ImplicitCastExpr, NoOp, const A)1010// CXX98: 2: [B5.1]1011// WARNINGS-CXX98: 3: [B5.2] (CXXConstructExpr, A)1012// ANALYZER-CXX98: 3: [B5.2] (CXXConstructExpr, [B5.4], A)1013// CXX98: 4: [B5.3] (BindTemporary)1014// CXX11: 1: [B7.5] (ImplicitCastExpr, NoOp, const A)1015// WARNINGS-CXX11: 2: [B5.1] (CXXConstructExpr, A)1016// ANALYZER-CXX11: 2: [B5.1] (CXXConstructExpr, [B5.3], A)1017// CXX11: 3: [B5.2] (BindTemporary)1018// CHECK: Preds (1): B71019// CHECK: Succs (1): B41020// CHECK: [B6]1021// WARNINGS: 1: A() (CXXConstructExpr, A)1022// ANALYZER: 1: A() (CXXConstructExpr, [B6.2], [B6.4], [B6.5], A)1023// CHECK: 2: [B6.1] (BindTemporary)1024// CHECK: 3: [B6.2] (ImplicitCastExpr, NoOp, const A)1025// CHECK: 4: [B6.3]1026// WARNINGS: 5: [B6.4] (CXXConstructExpr, A)1027// ANALYZER: 5: [B6.4] (CXXConstructExpr, [B6.6], A)1028// CHECK: 6: [B6.5] (BindTemporary)1029// CHECK: Preds (1): B71030// CHECK: Succs (1): B41031// CHECK: [B7]1032// CHECK: 1: foo1033// CHECK: 2: [B7.1] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const A &))1034// WARNINGS: 3: A() (CXXConstructExpr, A)1035// ANALYZER-CXX98: 3: A() (CXXConstructExpr, [B7.4], A)1036// ANALYZER-CXX11: 3: A() (CXXConstructExpr, A)1037// CHECK: 4: [B7.3] (BindTemporary)1038// CHECK: 5: [B7.4]1039// CHECK: 6: [B7.5].operator bool1040// CHECK: 7: [B7.5]1041// CHECK: 8: [B7.7] (ImplicitCastExpr, UserDefinedConversion, _Bool)1042// CHECK: T: [B7.8] ? ... : ...1043// CHECK: Preds (2): B8 B91044// CHECK: Succs (2): B5 B61045// CHECK: [B8]1046// CHECK: 1: ~A() (Temporary object destructor)1047// CHECK: Preds (1): B91048// CHECK: Succs (1): B71049// CHECK: [B9]1050// CXX98: 1: [B12.2] ?: [B11.6]1051// CXX11: 1: [B12.3] ?: [B11.6]1052// CHECK: 2: [B9.1] (ImplicitCastExpr, NoOp, const A)1053// CHECK: 3: [B9.2]1054// CHECK: 4: const A &a = A() ?: A();1055// CHECK: T: (Temp Dtor) [B11.2]1056// CHECK: Preds (2): B10 B111057// CHECK: Succs (2): B8 B71058// CHECK: [B10]1059// CXX98: 1: [B12.2] (ImplicitCastExpr, NoOp, const A)1060// CXX98: 2: [B10.1]1061// WARNINGS-CXX98: 3: [B10.2] (CXXConstructExpr, A)1062// ANALYZER-CXX98: 3: [B10.2] (CXXConstructExpr, [B10.4], A)1063// CXX98: 4: [B10.3] (BindTemporary)1064// CXX11: 1: [B12.3] (ImplicitCastExpr, NoOp, const A)1065// WARNINGS-CXX11: 2: [B10.1] (CXXConstructExpr, A)1066// ANALYZER-CXX11: 2: [B10.1] (CXXConstructExpr, [B10.3], A)1067// CXX11: 3: [B10.2] (BindTemporary)1068// CHECK: Preds (1): B121069// CHECK: Succs (1): B91070// CHECK: [B11]1071// WARNINGS-CHECK: 1: A() (CXXConstructExpr, A)1072// ANALYZER-CHECK: 1: A() (CXXConstructExpr, [B11.2], A)1073// CHECK: 2: [B11.1] (BindTemporary)1074// CHECK: 3: [B11.2] (ImplicitCastExpr, NoOp, const A)1075// CHECK: 4: [B11.3]1076// WARNINGS: 5: [B11.4] (CXXConstructExpr, A)1077// ANALYZER: 5: [B11.4] (CXXConstructExpr, [B11.6], A)1078// CHECK: 6: [B11.5] (BindTemporary)1079// CHECK: Preds (1): B121080// CHECK: Succs (1): B91081// CHECK: [B12]1082// WARNINGS: 1: A() (CXXConstructExpr, A)1083// ANALYZER-CXX98: 1: A() (CXXConstructExpr, [B12.2], [B12.3], A)1084// ANALYZER-CXX11: 1: A() (CXXConstructExpr, [B12.2], A)1085// CHECK: 2: [B12.1] (BindTemporary)1086// CHECK: 3: [B12.2]1087// CHECK: 4: [B12.3].operator bool1088// CHECK: 5: [B12.3]1089// CHECK: 6: [B12.5] (ImplicitCastExpr, UserDefinedConversion, _Bool)1090// CHECK: T: [B12.6] ? ... : ...1091// CHECK: Preds (1): B131092// CHECK: Succs (2): B10 B111093// CHECK: [B0 (EXIT)]1094// CHECK: Preds (1): B11095// CHECK: [B2 (ENTRY)]1096// CHECK: Succs (1): B11097// CHECK: [B1]1098// WARNINGS: 1: A() (CXXConstructExpr, A)1099// ANALYZER: 1: A() (CXXConstructExpr, [B1.2], [B1.4], [B1.5], A)1100// CHECK: 2: [B1.1] (BindTemporary)1101// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const A)1102// CHECK: 4: [B1.3]1103// WARNINGS: 5: [B1.4] (CXXConstructExpr, A)1104// ANALYZER: 5: [B1.4] (CXXConstructExpr, [B1.6], A)1105// CHECK: 6: A a = A();1106// CHECK: 7: ~A() (Temporary object destructor)1107// CHECK: 8: int b;1108// CHECK: 9: [B1.6].~A() (Implicit destructor)1109// CHECK: Preds (1): B21110// CHECK: Succs (1): B01111// CHECK: [B0 (EXIT)]1112// CHECK: Preds (1): B11113// CHECK: [B2 (ENTRY)]1114// CHECK: Succs (1): B11115// CHECK: [B1]1116// WARNINGS: 1: A() (CXXConstructExpr, A)1117// ANALYZER: 1: A() (CXXConstructExpr, [B1.4], A)1118// CHECK: 2: [B1.1] (BindTemporary)1119// CHECK: 3: [B1.2] (ImplicitCastExpr, NoOp, const A)1120// CHECK: 4: [B1.3]1121// CHECK: 5: const A &a = A();1122// CHECK: 6: foo1123// CHECK: 7: [B1.6] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const A &))1124// WARNINGS: 8: A() (CXXConstructExpr, A)1125// ANALYZER: 8: A() (CXXConstructExpr, [B1.9], [B1.11], A)1126// CHECK: 9: [B1.8] (BindTemporary)1127// CHECK: 10: [B1.9] (ImplicitCastExpr, NoOp, const A)1128// CHECK: 11: [B1.10]1129// CHECK: 12: [B1.7]([B1.11])1130// CHECK: 13: ~A() (Temporary object destructor)1131// CHECK: 14: int b;1132// CHECK: 15: [B1.5].~A() (Implicit destructor)1133// CHECK: Preds (1): B21134// CHECK: Succs (1): B01135// CHECK: [B0 (EXIT)]1136// CHECK: Preds (1): B11137// CHECK: [B2 (ENTRY)]1138// CHECK: Succs (1): B11139// CHECK: [B1]1140// CHECK: 1: A::make1141// CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, A (*)(void))1142// WARNINGS: 3: [B1.2]()1143// ANALYZER: 3: [B1.2]() (CXXRecordTypedCall, [B1.4], [B1.6], [B1.7])1144// CHECK: 4: [B1.3] (BindTemporary)1145// CHECK: 5: [B1.4] (ImplicitCastExpr, NoOp, const A)1146// CHECK: 6: [B1.5]1147// WARNINGS: 7: [B1.6] (CXXConstructExpr, A)1148// ANALYZER: 7: [B1.6] (CXXConstructExpr, [B1.8], A)1149// CHECK: 8: A a = A::make();1150// CHECK: 9: ~A() (Temporary object destructor)1151// CHECK: 10: int b;1152// CHECK: 11: [B1.8].~A() (Implicit destructor)1153// CHECK: Preds (1): B21154// CHECK: Succs (1): B01155// CHECK: [B0 (EXIT)]1156// CHECK: Preds (1): B11157// CHECK: [B2 (ENTRY)]1158// CHECK: Succs (1): B11159// CHECK: [B1]1160// CHECK: 1: A::make1161// CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, A (*)(void))1162// WARNINGS: 3: [B1.2]()1163// ANALYZER: 3: [B1.2]() (CXXRecordTypedCall, [B1.6])1164// CHECK: 4: [B1.3] (BindTemporary)1165// CHECK: 5: [B1.4] (ImplicitCastExpr, NoOp, const A)1166// CHECK: 6: [B1.5]1167// CHECK: 7: const A &a = A::make();1168// CHECK: 8: foo1169// CHECK: 9: [B1.8] (ImplicitCastExpr, FunctionToPointerDecay, void (*)(const A &))1170// CHECK: 10: A::make1171// CHECK: 11: [B1.10] (ImplicitCastExpr, FunctionToPointerDecay, A (*)(void))1172// WARNINGS: 12: [B1.11]()1173// ANALYZER: 12: [B1.11]() (CXXRecordTypedCall, [B1.13], [B1.15])1174// CHECK: 13: [B1.12] (BindTemporary)1175// CHECK: 14: [B1.13] (ImplicitCastExpr, NoOp, const A)1176// CHECK: 15: [B1.14]1177// CHECK: 16: [B1.9]([B1.15])1178// CHECK: 17: ~A() (Temporary object destructor)1179// CHECK: 18: int b;1180// CHECK: 19: [B1.7].~A() (Implicit destructor)1181// CHECK: Preds (1): B21182// CHECK: Succs (1): B01183// CHECK: [B0 (EXIT)]1184// CHECK: Preds (1): B11185// CHECK: [B2 (ENTRY)]1186// CHECK: Succs (1): B11187// CHECK: [B1]1188// CHECK: 1: int a;1189// WARNINGS: 2: A() (CXXConstructExpr, A)1190// ANALYZER: 2: A() (CXXConstructExpr, [B1.3], [B1.4], A)1191// CHECK: 3: [B1.2] (BindTemporary)1192// CHECK: 4: [B1.3]1193// CHECK: 5: [B1.4].operator int1194// CHECK: 6: [B1.4]1195// CHECK: 7: [B1.6] (ImplicitCastExpr, UserDefinedConversion, int)1196// CHECK: 8: a1197// CHECK: 9: [B1.8] = [B1.7]1198// CHECK: 10: ~A() (Temporary object destructor)1199// CHECK: 11: int b;1200// CHECK: Preds (1): B21201// CHECK: Succs (1): B01202// CHECK: [B0 (EXIT)]1203// CHECK: Preds (1): B11204// CHECK: [B2 (ENTRY)]1205// CHECK: Succs (1): B11206// CHECK: [B1]1207// WARNINGS: 1: A() (CXXConstructExpr, A)1208// ANALYZER: 1: A() (CXXConstructExpr, [B1.2], [B1.3], A)1209// CHECK: 2: [B1.1] (BindTemporary)1210// CHECK: 3: [B1.2]1211// CHECK: 4: [B1.3].operator int1212// CHECK: 5: [B1.3]1213// CHECK: 6: [B1.5] (ImplicitCastExpr, UserDefinedConversion, int)1214// CHECK: 7: int([B1.6]) (CXXFunctionalCastExpr, NoOp, int)1215// WARNINGS: 8: B() (CXXConstructExpr, B)1216// ANALYZER: 8: B() (CXXConstructExpr, [B1.9], [B1.10], B)1217// CHECK: 9: [B1.8] (BindTemporary)1218// CHECK: 10: [B1.9]1219// CHECK: 11: [B1.10].operator int1220// CHECK: 12: [B1.10]1221// CHECK: 13: [B1.12] (ImplicitCastExpr, UserDefinedConversion, int)1222// CHECK: 14: int([B1.13]) (CXXFunctionalCastExpr, NoOp, int)1223// CHECK: 15: [B1.7] + [B1.14]1224// CHECK: 16: a([B1.15]) (Member initializer)1225// CHECK: 17: ~B() (Temporary object destructor)1226// CHECK: 18: ~A() (Temporary object destructor)1227// CHECK: 19: b(/*implicit*/(int)0) (Member initializer)1228// CHECK: Preds (1): B21229// CHECK: Succs (1): B01230// CHECK: [B0 (EXIT)]1231// CHECK: Preds (1): B11232// CHECK: [B3 (ENTRY)]1233// CHECK: Succs (1): B21234// CHECK: [B1]1235// CHECK: 1: int b;1236// CHECK: Preds (1): B2(Unreachable)1237// CHECK: Succs (1): B01238// CHECK: [B2 (NORETURN)]1239// CHECK: 1: int a;1240// WARNINGS: 2: NoReturn() (CXXConstructExpr, NoReturn)1241// ANALYZER-CXX98: 2: NoReturn() (CXXConstructExpr, [B2.3], [B2.4], NoReturn)1242// ANALYZER-CXX11: 2: NoReturn() (CXXConstructExpr, [B2.3], NoReturn)1243// CHECK: 3: [B2.2] (BindTemporary)1244// CHECK: [[MEMBER:[45]]]: [B2.{{[34]}}].f1245// CHECK: {{[56]}}: [B2.[[MEMBER]]]()1246// CHECK: {{[67]}}: ~NoReturn() (Temporary object destructor)1247// CHECK: Preds (1): B31248// CHECK: Succs (1): B01249// CHECK: [B0 (EXIT)]1250// CHECK: Preds (2): B1 B21251// CHECK: [B3 (ENTRY)]1252// CHECK: Succs (1): B21253// CHECK: [B1]1254// CHECK: 1: int b;1255// CHECK: Preds (1): B2(Unreachable)1256// CHECK: Succs (1): B01257// CHECK: [B2 (NORETURN)]1258// CHECK: 1: int a;1259// WARNINGS: 2: NoReturn() (CXXConstructExpr, NoReturn)1260// ANALYZER: 2: NoReturn() (CXXConstructExpr, [B2.3], NoReturn)1261// CHECK: 3: [B2.2] (BindTemporary)1262// CHECK: 4: 471263// CHECK: 5: ... , [B2.4]1264// CHECK: 6: ~NoReturn() (Temporary object destructor)1265// CHECK: Preds (1): B31266// CHECK: Succs (1): B01267// CHECK: [B0 (EXIT)]1268// CHECK: Preds (2): B1 B21269// CHECK: [B9 (ENTRY)]1270// CHECK: Succs (1): B81271// CHECK: [B1]1272// CHECK: 1: 01273// CHECK: 2: return [B1.1];1274// CHECK: Preds (2): B3 B81275// CHECK: Succs (1): B01276// CHECK: [B2]1277// CHECK: 1: 11278// CHECK: 2: return [B2.1];1279// CHECK: Preds (1): B31280// CHECK: Succs (1): B01281// CHECK: [B3]1282// CHECK: T: if [B5.1]1283// CHECK: Preds (2): B4(Unreachable) B51284// CHECK: Succs (2): B2 B11285// CHECK: [B4 (NORETURN)]1286// CHECK: 1: ~NoReturn() (Temporary object destructor)1287// CHECK: Preds (1): B51288// CHECK: Succs (1): B01289// CHECK: [B5]1290// CHECK: 1: [B7.3] || [B6.7]1291// CHECK: T: (Temp Dtor) [B6.4]1292// CHECK: Preds (2): B6 B71293// CHECK: Succs (2): B4 B31294// CHECK: [B6]1295// CHECK: 1: check1296// CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const NoReturn &))1297// WARNINGS: 3: NoReturn() (CXXConstructExpr, NoReturn)1298// ANALYZER: 3: NoReturn() (CXXConstructExpr, [B6.4], [B6.6], NoReturn)1299// CHECK: 4: [B6.3] (BindTemporary)1300// CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const NoReturn)1301// CHECK: 6: [B6.5]1302// CHECK: 7: [B6.2]([B6.6])1303// CHECK: Preds (1): B71304// CHECK: Succs (1): B51305// CHECK: [B7]1306// CHECK: 1: value1307// CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)1308// CHECK: 3: ![B7.2]1309// CHECK: T: [B7.3] || ...1310// CHECK: Preds (1): B81311// CHECK: Succs (2): B5 B61312// CHECK: [B8]1313// CHECK: 1: value1314// CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)1315// CHECK: T: if [B8.2]1316// CHECK: Preds (1): B91317// CHECK: Succs (2): B7 B11318// CHECK: [B0 (EXIT)]1319// CHECK: Preds (3): B1 B2 B41320// CHECK: [B10 (ENTRY)]1321// CHECK: Succs (1): B91322// CHECK: [B1]1323// CHECK: 1: 01324// CHECK: 2: return [B1.1];1325// CHECK: Preds (2): B3 B91326// CHECK: Succs (1): B01327// CHECK: [B2]1328// CHECK: 1: 11329// CHECK: 2: return [B2.1];1330// CHECK: Preds (1): B31331// CHECK: Succs (1): B01332// CHECK: [B3]1333// CHECK: T: if [B5.1]1334// CHECK: Preds (2): B4(Unreachable) B51335// CHECK: Succs (2): B2 B11336// CHECK: [B4 (NORETURN)]1337// CHECK: 1: ~NoReturn() (Temporary object destructor)1338// CHECK: Preds (1): B51339// CHECK: Succs (1): B01340// CHECK: [B5]1341// CHECK: 1: [B8.3] || [B7.3] || [B6.7]1342// CHECK: T: (Temp Dtor) [B6.4]1343// CHECK: Preds (3): B6 B7 B81344// CHECK: Succs (2): B4 B31345// CHECK: [B6]1346// CHECK: 1: check1347// CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const NoReturn &))1348// WARNINGS: 3: NoReturn() (CXXConstructExpr, NoReturn)1349// ANALYZER: 3: NoReturn() (CXXConstructExpr, [B6.4], [B6.6], NoReturn)1350// CHECK: 4: [B6.3] (BindTemporary)1351// CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const NoReturn)1352// CHECK: 6: [B6.5]1353// CHECK: 7: [B6.2]([B6.6])1354// CHECK: Preds (1): B71355// CHECK: Succs (1): B51356// CHECK: [B7]1357// CHECK: 1: value1358// CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)1359// CHECK: 3: ![B7.2]1360// CHECK: T: [B8.3] || [B7.3] || ...1361// CHECK: Preds (1): B81362// CHECK: Succs (2): B5 B61363// CHECK: [B8]1364// CHECK: 1: value1365// CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)1366// CHECK: 3: ![B8.2]1367// CHECK: T: [B8.3] || ...1368// CHECK: Preds (1): B91369// CHECK: Succs (2): B5 B71370// CHECK: [B9]1371// CHECK: 1: value1372// CHECK: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool)1373// CHECK: T: if [B9.2]1374// CHECK: Preds (1): B101375// CHECK: Succs (2): B8 B11376// CHECK: [B0 (EXIT)]1377// CHECK: Preds (3): B1 B2 B41378// CHECK: [B10 (ENTRY)]1379// CHECK: Succs (1): B91380// CHECK: [B1]1381// CHECK: 1: 01382// CHECK: 2: return [B1.1];1383// CHECK: Preds (2): B3 B91384// CHECK: Succs (1): B01385// CHECK: [B2]1386// CHECK: 1: 11387// CHECK: 2: return [B2.1];1388// CHECK: Preds (1): B31389// CHECK: Succs (1): B01390// CHECK: [B3]1391// CHECK: T: if [B5.1]1392// CHECK: Preds (2): B4(Unreachable) B51393// CHECK: Succs (2): B2 B11394// CHECK: [B4 (NORETURN)]1395// CHECK: 1: ~NoReturn() (Temporary object destructor)1396// CHECK: Preds (1): B5(Unreachable)1397// CHECK: Succs (1): B01398// CHECK: [B5]1399// CHECK: 1: [B8.3] || [B7.2] || [B6.7]1400// CHECK: T: (Temp Dtor) [B6.4]1401// CHECK: Preds (3): B6 B7 B81402// CHECK: Succs (2): B4(Unreachable) B31403// CHECK: [B6]1404// CHECK: 1: check1405// CHECK: 2: [B6.1] (ImplicitCastExpr, FunctionToPointerDecay, _Bool (*)(const NoReturn &))1406// WARNINGS: 3: NoReturn() (CXXConstructExpr, NoReturn)1407// ANALYZER: 3: NoReturn() (CXXConstructExpr, [B6.4], [B6.6], NoReturn)1408// CHECK: 4: [B6.3] (BindTemporary)1409// CHECK: 5: [B6.4] (ImplicitCastExpr, NoOp, const NoReturn)1410// CHECK: 6: [B6.5]1411// CHECK: 7: [B6.2]([B6.6])1412// CHECK: Preds (1): B71413// CHECK: Succs (1): B51414// CHECK: [B7]1415// CHECK: 1: value1416// CHECK: 2: [B7.1] (ImplicitCastExpr, LValueToRValue, _Bool)1417// CHECK: T: [B8.3] || [B7.2] || ...1418// CHECK: Preds (1): B81419// CHECK: Succs (2): B5 B61420// CHECK: [B8]1421// CHECK: 1: value1422// CHECK: 2: [B8.1] (ImplicitCastExpr, LValueToRValue, _Bool)1423// CHECK: 3: ![B8.2]1424// CHECK: T: [B8.3] || ...1425// CHECK: Preds (1): B91426// CHECK: Succs (2): B5 B71427// CHECK: [B9]1428// CHECK: 1: value1429// CHECK: 2: [B9.1] (ImplicitCastExpr, LValueToRValue, _Bool)1430// CHECK: T: if [B9.2]1431// CHECK: Preds (1): B101432// CHECK: Succs (2): B8 B11433// CHECK: [B0 (EXIT)]1434// CHECK: Preds (3): B1 B2 B41435// CHECK: [B1 (ENTRY)]1436// CHECK: Succs (1): B01437// CHECK: [B0 (EXIT)]1438// CHECK: Preds (1): B11439// CHECK: [B2 (ENTRY)]1440// CHECK: Succs (1): B11441// CHECK: [B1]1442// CHECK: 1: foo11443// CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, const C &(*)(void))1444// CHECK: 3: [B1.2]()1445// CHECK: 4: return [B1.3];1446// CHECK: Preds (1): B21447// CHECK: Succs (1): B01448// CHECK: [B0 (EXIT)]1449// CHECK: Preds (1): B11450// CHECK: [B2 (ENTRY)]1451// CHECK: Succs (1): B11452// CHECK: [B1]1453// CHECK: 1: foo21454// CHECK: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, C &&(*)(void))1455// CHECK: 3: [B1.2]()1456// CHECK: 4: return [B1.3];1457// CHECK: Preds (1): B21458// CHECK: Succs (1): B01459// CHECK: [B0 (EXIT)]1460// CHECK: Preds (1): B11461