105 lines · cpp
1// RUN: %clang_cc1 -std=c++1y -triple x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm %s -o - | FileCheck %s2 3struct S {4 S();5 ~S();6};7 8struct T {9 T() noexcept;10 ~T();11 int n;12};13 14// CHECK-LABEL: define{{.*}} void @_Z1fv(15void f() {16 // CHECK: call void @_ZN1SC1Ev(17 // CHECK: invoke void @__cxa_throw18 //19 // Ensure we call the lambda destructor here, and do not call the destructor20 // for the capture.21 // CHECK: landingpad22 // CHECK-NOT: _ZN1SD23 // CHECK: call void @"_ZZ1fvEN3$_0D1Ev"(24 // CHECK-NOT: _ZN1SD25 // CHECK: resume26 [s = S()] {}, throw 0;27 28 // CHECK: }29}30 31// CHECK-LABEL: define{{.*}} void @_Z1gv(32void g() {33 // CHECK: call void @_ZN1SC1Ev(34 // CHECK: invoke void @__cxa_throw35 //36 // Ensure we call the lambda destructor here, and do not call the destructor37 // for the capture.38 // CHECK: landingpad39 // CHECK-NOT: @"_ZZ1gvEN3$_0D1Ev"(40 // CHECK: call void @_ZN1SD1Ev(41 // CHECK-NOT: @"_ZZ1gvEN3$_0D1Ev"(42 // CHECK: resume43 [s = S(), t = (throw 0, 1)] {};44 45 // CHECK: }46}47 48void x() noexcept;49void y() noexcept;50 51// CHECK-LABEL: define{{.*}} void @_Z1hbb(52void 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 b158 // CHECK: call void @_ZN1SC1Ev(59 // CHECK: store i1 true, ptr %[[S_ISACTIVE]], align 160 // CHECK: call void @_ZN1TC1Ev(61 // CHECK: br i162 63 // throw 164 // CHECK: invoke void @__cxa_throw65 66 // completion of lambda init, branch on b267 // CHECK: store i32 42,68 // CHECK: store i1 false, ptr %[[S_ISACTIVE]], align 169 // CHECK: br i170 71 // throw 272 // CHECK: invoke void @__cxa_throw73 74 // end of full-expression75 // CHECK: call void @_Z1xv(76 // CHECK: call void @"_ZZ1hbbEN3$_0D1Ev"(77 // CHECK: call void @_ZN1TD1Ev(78 // CHECK: call void @_Z1yv(79 // CHECK: ret void80 81 // cleanups for throw 182 // CHECK: landingpad83 // CHECK-NOT: @"_ZZ1hbbEN3$_0D1Ev"(84 // CHECK: br85 86 // cleanups for throw 287 // CHECK: landingpad88 // CHECK: call void @"_ZZ1hbbEN3$_0D1Ev"(89 // CHECK: br90 91 // common cleanup code92 // CHECK: call void @_ZN1TD1Ev(93 // CHECK: load i1, ptr %[[S_ISACTIVE]],94 // CHECK: br i195 96 // CHECK: call void @_ZN1SD1Ev(97 // CHECK: br98 99 // CHECK: resume100 [s = S(), t = T().n, u = (b1 ? throw 1 : 42)] {}, (b2 ? throw 2 : 0), x();101 y();102 103 // CHECK: }104}105