| // 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: } |
| } |