diff options
Diffstat (limited to 'test/CodeGenCXX/cxx1y-init-captures-eh.cpp')
-rw-r--r-- | test/CodeGenCXX/cxx1y-init-captures-eh.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/test/CodeGenCXX/cxx1y-init-captures-eh.cpp b/test/CodeGenCXX/cxx1y-init-captures-eh.cpp new file mode 100644 index 0000000000..70103dccb1 --- /dev/null +++ b/test/CodeGenCXX/cxx1y-init-captures-eh.cpp @@ -0,0 +1,104 @@ +// RUN: %clang_cc1 -std=c++1y -triple x86_64-linux-gnu -fexceptions -fcxx-exceptions -emit-llvm %s -o - | FileCheck %s + +struct S { + S(); + ~S(); +}; + +struct T { + T() noexcept; + ~T(); + int n; +}; + +// CHECK-LABEL: define void @_Z1fv( +void f() { + // CHECK: call void @_ZN1SC1Ev( + // CHECK: invoke void @__cxa_throw + // + // Ensure we call the lambda destructor here, and do not call the destructor + // for the capture. + // CHECK: landingpad + // CHECK-NOT: _ZN1SD + // CHECK: call void @"_ZZ1fvEN3$_0D1Ev"( + // CHECK-NOT: _ZN1SD + // CHECK: resume + [s = S()] {}, throw 0; + + // CHECK: } +} + +// CHECK-LABEL: define void @_Z1gv( +void g() { + // CHECK: call void @_ZN1SC1Ev( + // CHECK: invoke void @__cxa_throw + // + // Ensure we call the lambda destructor here, and do not call the destructor + // for the capture. + // CHECK: landingpad + // CHECK-NOT: @"_ZZ1gvEN3$_0D1Ev"( + // CHECK: call void @_ZN1SD1Ev( + // CHECK-NOT: @"_ZZ1gvEN3$_0D1Ev"( + // CHECK: resume + [s = S(), t = (throw 0, 1)] {}; + + // CHECK: } +} + +void x() noexcept; +void y() noexcept; + +// CHECK-LABEL: define void @_Z1hbb( +void h(bool b1, bool b2) { + // CHECK: {{.*}} = alloca i1, + // CHECK: %[[S_ISACTIVE:.*]] = alloca i1, + // CHECK: {{.*}} = alloca i1, + + // lambda init: s and t, branch on b1 + // CHECK: call void @_ZN1SC1Ev( + // CHECK: store i1 true, i1* %[[S_ISACTIVE]], align 1 + // CHECK: call void @_ZN1TC1Ev( + // CHECK: br i1 + + // throw 1 + // CHECK: invoke void @__cxa_throw + + // completion of lambda init, branch on b2 + // CHECK: store i32 42, + // CHECK: store i1 false, i1* %[[S_ISACTIVE]], align 1 + // CHECK: br i1 + + // throw 2 + // CHECK: invoke void @__cxa_throw + + // end of full-expression + // CHECK: call void @_Z1xv( + // CHECK: call void @"_ZZ1hbbEN3$_2D1Ev"( + // CHECK: call void @_ZN1TD1Ev( + // CHECK: call void @_Z1yv( + // CHECK: ret void + + // cleanups for throw 1 + // CHECK: landingpad + // CHECK-NOT: @"_ZZ1hbbEN3$_2D1Ev"( + // CHECK: br + + // cleanups for throw 2 + // CHECK: landingpad + // CHECK: call void @"_ZZ1hbbEN3$_2D1Ev"( + // CHECK: br + + // common cleanup code + // CHECK: call void @_ZN1TD1Ev( + // CHECK: load i1, i1* %[[S_ISACTIVE]], + // CHECK: br i1 + + // CHECK: call void @_ZN1SD1Ev( + // CHECK: br + + // CHECK: resume + [s = S(), t = T().n, u = (b1 ? throw 1 : 42)] {}, (b2 ? throw 2 : 0), x(); + y(); + + // CHECK: } +} |