Clang Project

clang_source_code/test/CodeGenCXX/cxx1y-init-captures-eh.cpp
1// RUN: %clang_cc1 -std=c++1y -triple x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm %s -o - | FileCheck %s
2
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_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(
32void 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
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 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