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