1 // RUN: %clang_cc1 -no-opaque-pointers -std=c++1y -triple x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm %s -o - | FileCheck %s 2 3 struct S { 4 S(); 5 ~S(); 6 }; 7 8 struct T { 9 T() noexcept; 10 ~T(); 11 int n; 12 }; 13 14 // CHECK-LABEL: define{{.*}} void @_Z1fv( 15 void f() { 16 // CHECK: call void @_ZN1SC1Ev( 17 // CHECK: invoke void @__cxa_throw 18 // 19 // Ensure we call the lambda destructor here, and do not call the destructor 20 // for the capture. 21 // CHECK: landingpad 22 // CHECK-NOT: _ZN1SD 23 // CHECK: call void @"_ZZ1fvEN3$_0D1Ev"( 24 // CHECK-NOT: _ZN1SD 25 // CHECK: resume 26 [s = S()] {}, throw 0; 27 28 // CHECK: } 29 } 30 31 // CHECK-LABEL: define{{.*}} void @_Z1gv( 32 void g() { 33 // CHECK: call void @_ZN1SC1Ev( 34 // CHECK: invoke void @__cxa_throw 35 // 36 // Ensure we call the lambda destructor here, and do not call the destructor 37 // for the capture. 38 // CHECK: landingpad 39 // CHECK-NOT: @"_ZZ1gvEN3$_0D1Ev"( 40 // CHECK: call void @_ZN1SD1Ev( 41 // CHECK-NOT: @"_ZZ1gvEN3$_0D1Ev"( 42 // CHECK: resume 43 [s = S(), t = (throw 0, 1)] {}; 44 45 // CHECK: } 46 } 47 48 void x() noexcept; 49 void y() noexcept; 50 51 // CHECK-LABEL: define{{.*}} void @_Z1hbb( 52 void h(bool b1, bool b2) { 53 // CHECK: {{.*}} = alloca i1, 54 // CHECK: %[[S_ISACTIVE:.*]] = alloca i1, 55 // CHECK: {{.*}} = alloca i1, 56 57 // lambda init: s and t, branch on b1 58 // CHECK: call void @_ZN1SC1Ev( 59 // CHECK: store i1 true, i1* %[[S_ISACTIVE]], align 1 60 // CHECK: call void @_ZN1TC1Ev( 61 // CHECK: br i1 62 63 // throw 1 64 // CHECK: invoke void @__cxa_throw 65 66 // completion of lambda init, branch on b2 67 // CHECK: store i32 42, 68 // CHECK: store i1 false, i1* %[[S_ISACTIVE]], align 1 69 // CHECK: br i1 70 71 // throw 2 72 // CHECK: invoke void @__cxa_throw 73 74 // end of full-expression 75 // CHECK: call void @_Z1xv( 76 // CHECK: call void @"_ZZ1hbbEN3$_2D1Ev"( 77 // CHECK: call void @_ZN1TD1Ev( 78 // CHECK: call void @_Z1yv( 79 // CHECK: ret void 80 81 // cleanups for throw 1 82 // CHECK: landingpad 83 // CHECK-NOT: @"_ZZ1hbbEN3$_2D1Ev"( 84 // CHECK: br 85 86 // cleanups for throw 2 87 // CHECK: landingpad 88 // CHECK: call void @"_ZZ1hbbEN3$_2D1Ev"( 89 // CHECK: br 90 91 // common cleanup code 92 // CHECK: call void @_ZN1TD1Ev( 93 // CHECK: load i1, i1* %[[S_ISACTIVE]], 94 // CHECK: br i1 95 96 // CHECK: call void @_ZN1SD1Ev( 97 // CHECK: br 98 99 // CHECK: resume 100 [s = S(), t = T().n, u = (b1 ? throw 1 : 42)] {}, (b2 ? throw 2 : 0), x(); 101 y(); 102 103 // CHECK: } 104 } 105