1 // RUN: %clang_cc1 -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(
f()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(
g()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(
h(bool b1,bool b2)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