// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - -fcxx-exceptions -fexceptions -std=c++11 | FileCheck %s // Ensure that we call __cxa_begin_catch before calling // std::terminate in a noexcept function. namespace test0 { void foo(); struct A { A(); ~A(); }; void test() noexcept { A a; foo(); } } // CHECK-LABEL: define{{.*}} void @_ZN5test04testEv() // This goes to the terminate lpad. // CHECK: invoke void @_ZN5test01AC1Ev( // CHECK-NEXT: unwind label %[[TERMINATE_LPAD:.*]] // This also goes to the terminate lpad (no cleanups!). // CHECK: invoke void @_ZN5test03fooEv() // CHECK-NEXT: unwind label %[[TERMINATE_LPAD]] // Destructors don't throw by default in C++11. // CHECK: call void @_ZN5test01AD1Ev( // Cleanup lpad. // CHECK: [[TERMINATE_LPAD]]: // CHECK-NEXT: [[T0:%.*]] = landingpad // CHECK-NEXT: catch ptr null // CHECK-NEXT: [[T1:%.*]] = extractvalue { ptr, i32 } [[T0]], 0 // CHECK-NEXT: call void @__clang_call_terminate(ptr [[T1]]) // CHECK-NEXT: unreachable // CHECK-LABEL: define linkonce_odr hidden void @__clang_call_terminate( // CHECK: call ptr @__cxa_begin_catch( // CHECK-NEXT: call void @_ZSt9terminatev() // CHECK-NEXT: unreachable