1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - -fcxx-exceptions -fexceptions -std=c++11 | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li // rdar://11904428 4*67e74705SXin Li // Ensure that we call __cxa_begin_catch before calling 5*67e74705SXin Li // std::terminate in a noexcept function. 6*67e74705SXin Li namespace test0 { 7*67e74705SXin Li void foo(); 8*67e74705SXin Li 9*67e74705SXin Li struct A { 10*67e74705SXin Li A(); 11*67e74705SXin Li ~A(); 12*67e74705SXin Li }; 13*67e74705SXin Li test()14*67e74705SXin Li void test() noexcept { 15*67e74705SXin Li A a; 16*67e74705SXin Li foo(); 17*67e74705SXin Li } 18*67e74705SXin Li } 19*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test04testEv() 20*67e74705SXin Li // CHECK: [[EXN:%.*]] = alloca i8* 21*67e74705SXin Li // This goes to the terminate lpad. 22*67e74705SXin Li // CHECK: invoke void @_ZN5test01AC1Ev( 23*67e74705SXin Li // This goes to the cleanup-and-then-terminate lpad. 24*67e74705SXin Li // CHECK: invoke void @_ZN5test03fooEv() 25*67e74705SXin Li // Destructors don't throw by default in C++11. 26*67e74705SXin Li // CHECK: call void @_ZN5test01AD1Ev( 27*67e74705SXin Li // Cleanup lpad. 28*67e74705SXin Li // CHECK: [[T0:%.*]] = landingpad 29*67e74705SXin Li // CHECK-NEXT: catch i8* null 30*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = extractvalue { i8*, i32 } [[T0]], 0 31*67e74705SXin Li // CHECK-NEXT: store i8* [[T1]], i8** [[EXN]] 32*67e74705SXin Li // (Calling this destructor is not technically required.) 33*67e74705SXin Li // CHECK: call void @_ZN5test01AD1Ev( 34*67e74705SXin Li // CHECK-NEXT: br label 35*67e74705SXin Li // The terminate landing pad jumps in here for some reason. 36*67e74705SXin Li // CHECK: [[T0:%.*]] = landingpad 37*67e74705SXin Li // CHECK-NEXT: catch i8* null 38*67e74705SXin Li // CHECK-NEXT: [[T1:%.*]] = extractvalue { i8*, i32 } [[T0]], 0 39*67e74705SXin Li // CHECK-NEXT: call void @__clang_call_terminate(i8* [[T1]]) 40*67e74705SXin Li // CHECK-NEXT: unreachable 41*67e74705SXin Li // The terminate handler chained to by the cleanup lpad. 42*67e74705SXin Li // CHECK: [[T0:%.*]] = load i8*, i8** [[EXN]] 43*67e74705SXin Li // CHECK-NEXT: call void @__clang_call_terminate(i8* [[T0]]) 44*67e74705SXin Li // CHECK-NEXT: unreachable 45*67e74705SXin Li 46*67e74705SXin Li // CHECK-LABEL: define linkonce_odr hidden void @__clang_call_terminate( 47*67e74705SXin Li // CHECK: call i8* @__cxa_begin_catch( 48*67e74705SXin Li // CHECK-NEXT: call void @_ZSt9terminatev() 49*67e74705SXin Li // CHECK-NEXT: unreachable 50