1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o %t.ll 2a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// RUN: FileCheck --input-file=%t.ll %s 3a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 4a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpstruct test1_D { 5a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump double d; 6a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} d1; 7a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 8a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test1() { 9a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump throw d1; 10a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} 11a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 1293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z5test1v() 133ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall// CHECK: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8) 14ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]] 15ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXN2:%.*]] = bitcast [[DSTAR]] [[EXN]] to i8* 16ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[EXN2]], i8* bitcast ([[DSTAR]] @d1 to i8*), i64 8, i32 8, i1 false) 174e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({ i8*, i8* }* @_ZTI7test1_D to i8*), i8* null) [[NR:#[0-9]+]] 18a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT: unreachable 19a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 20a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 21a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpstruct test2_D { 22a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump test2_D(const test2_D&o); 23a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump test2_D(); 24a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump virtual void bar() { } 25a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump int i; int j; 26a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} d2; 27a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 28a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test2() { 29a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump throw d2; 30a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} 31a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 3293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z5test2v() 3393c332a8ba2c193c435b293966d343dab15f555bJohn McCall// CHECK: [[EXNVAR:%.*]] = alloca i8* 3493c332a8ba2c193c435b293966d343dab15f555bJohn McCall// CHECK-NEXT: [[SELECTORVAR:%.*]] = alloca i32 35ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 16) 36ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]] 37ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-NEXT: invoke void @_ZN7test2_DC1ERKS_([[DSTAR]] [[EXN]], [[DSTAR]] nonnull @d2) 38ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: to label %[[CONT:.*]] unwind label %{{.*}} 397e2f128354f631d44b3f6dbcd4cee1cc04bdf7b1John McCall// : [[CONT]]: (can't check this in Release-Asserts builds) 404e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{.*}}* @_ZTI7test2_D to i8*), i8* null) [[NR]] 41a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT: unreachable 42a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 43a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 44a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpstruct test3_D { 45a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump test3_D() { } 46a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump test3_D(volatile test3_D&o); 47a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump virtual void bar(); 48a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump}; 49a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 50a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test3() { 51a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump throw (volatile test3_D *)0; 52a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} 53a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 5493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z5test3v() 553ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall// CHECK: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8) 563ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall// CHECK-NEXT: [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[D:%[^*]+]]** 573ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall// CHECK-NEXT: store [[D]]* null, [[D]]** [[EXN]] 584e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK-NEXT: call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({ i8*, i8*, i32, i8* }* @_ZTIPV7test3_D to i8*), i8* null) [[NR]] 59ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: unreachable 60a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 61a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 62a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test4() { 63a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump throw; 64a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} 65a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump 6693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_Z5test4v() 674e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: call void @__cxa_rethrow() [[NR]] 68a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT: unreachable 69ac418162692a951ca3796d6830496a85a2d12493John McCall 70ac418162692a951ca3796d6830496a85a2d12493John McCall 71ac418162692a951ca3796d6830496a85a2d12493John McCall// rdar://problem/7696549 72ac418162692a951ca3796d6830496a85a2d12493John McCallnamespace test5 { 73ac418162692a951ca3796d6830496a85a2d12493John McCall struct A { 74ac418162692a951ca3796d6830496a85a2d12493John McCall A(); 75ac418162692a951ca3796d6830496a85a2d12493John McCall A(const A&); 76ac418162692a951ca3796d6830496a85a2d12493John McCall ~A(); 77ac418162692a951ca3796d6830496a85a2d12493John McCall }; 78ac418162692a951ca3796d6830496a85a2d12493John McCall 79ac418162692a951ca3796d6830496a85a2d12493John McCall void test() { 80ac418162692a951ca3796d6830496a85a2d12493John McCall try { throw A(); } catch (A &x) {} 81ac418162692a951ca3796d6830496a85a2d12493John McCall } 8293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN5test54testEv() 83ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 1) 84ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK: [[EXNCAST:%.*]] = bitcast i8* [[EXNOBJ]] to [[A:%[^*]*]]* 85ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: invoke void @_ZN5test51AC1Ev([[A]]* [[EXNCAST]]) 864e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: invoke void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{.*}}* @_ZTIN5test51AE to i8*), i8* bitcast (void ([[A]]*)* @_ZN5test51AD1Ev to i8*)) [[NR]] 87ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: to label {{%.*}} unwind label %[[HANDLER:[^ ]*]] 887e2f128354f631d44b3f6dbcd4cee1cc04bdf7b1John McCall// : [[HANDLER]]: (can't check this in Release-Asserts builds) 899cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner// CHECK: {{%.*}} = call i32 @llvm.eh.typeid.for(i8* bitcast ({{.*}}* @_ZTIN5test51AE to i8*)) 90ac418162692a951ca3796d6830496a85a2d12493John McCall} 91f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 92f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test6 { 93f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall template <class T> struct allocator { 94f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall ~allocator() throw() { } 95f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall }; 96f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 97f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall void foo() { 98f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall allocator<int> a; 99f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 100f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall} 101f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 102f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// PR7127 103f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test7 { 10493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @_ZN5test73fooEv() 105f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall int foo() { 1063ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall// CHECK: [[CAUGHTEXNVAR:%.*]] = alloca i8* 10793c332a8ba2c193c435b293966d343dab15f555bJohn McCall// CHECK-NEXT: [[SELECTORVAR:%.*]] = alloca i32 108f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[INTCATCHVAR:%.*]] = alloca i32 109f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall try { 110f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall try { 111f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[EXNALLOC:%.*]] = call i8* @__cxa_allocate_exception 112f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: bitcast i8* [[EXNALLOC]] to i32* 113f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i32 1, i32* 114f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: invoke void @__cxa_throw(i8* [[EXNALLOC]], i8* bitcast (i8** @_ZTIi to i8*), i8* null 115f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall throw 1; 116f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 117f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 118285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK: [[CAUGHTVAL:%.*]] = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) 119285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) 120285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK-NEXT: catch i8* null 121285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK-NEXT: [[CAUGHTEXN:%.*]] = extractvalue { i8*, i32 } [[CAUGHTVAL]], 0 122777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: store i8* [[CAUGHTEXN]], i8** [[CAUGHTEXNVAR]] 123285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK-NEXT: [[SELECTOR:%.*]] = extractvalue { i8*, i32 } [[CAUGHTVAL]], 1 12493c332a8ba2c193c435b293966d343dab15f555bJohn McCall// CHECK-NEXT: store i32 [[SELECTOR]], i32* [[SELECTORVAR]] 125777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: br label 126777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK: [[SELECTOR:%.*]] = load i32* [[SELECTORVAR]] 127777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: [[T0:%.*]] = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) 128777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: icmp eq i32 [[SELECTOR]], [[T0]] 129f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: br i1 130777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK: [[T0:%.*]] = load i8** [[CAUGHTEXNVAR]] 131777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: [[T1:%.*]] = call i8* @__cxa_begin_catch(i8* [[T0]]) 132777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: [[T2:%.*]] = bitcast i8* [[T1]] to i32* 133777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: [[T3:%.*]] = load i32* [[T2]] 134777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: store i32 [[T3]], i32* {{%.*}}, align 4 135777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: invoke void @__cxa_rethrow 136f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall catch (int) { 137f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall throw; 138f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 139f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 140285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK: [[CAUGHTVAL:%.*]] = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) 141285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK-NEXT: catch i8* null 142285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK-NEXT: [[CAUGHTEXN:%.*]] = extractvalue { i8*, i32 } [[CAUGHTVAL]], 0 143777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall// CHECK-NEXT: store i8* [[CAUGHTEXN]], i8** [[CAUGHTEXNVAR]] 144285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling// CHECK-NEXT: [[SELECTOR:%.*]] = extractvalue { i8*, i32 } [[CAUGHTVAL]], 1 14593c332a8ba2c193c435b293966d343dab15f555bJohn McCall// CHECK-NEXT: store i32 [[SELECTOR]], i32* [[SELECTORVAR]] 146f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call void @__cxa_end_catch() 147f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: br label 148f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: load i8** [[CAUGHTEXNVAR]] 149f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i8* @__cxa_begin_catch 150f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call void @__cxa_end_catch 151f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall catch (...) { 152f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 153f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK: ret i32 0 154f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall return 0; 155f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 156f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall} 157f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 158f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// Ordering of destructors in a catch handler. 159f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test8 { 160f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall struct A { A(const A&); ~A(); }; 161f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall void bar(); 162f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall 16393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test83fooEv() 164f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall void foo() { 165f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall try { 166f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: invoke void @_ZN5test83barEv() 167f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall bar(); 168f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } catch (A a) { 169f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: call i8* @__cxa_get_exception_ptr 170f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK-NEXT: bitcast 171f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK-NEXT: invoke void @_ZN5test81AC1ERKS0_( 172f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: call i8* @__cxa_begin_catch 1730ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl // CHECK-NEXT: call void @_ZN5test81AD1Ev( 174f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: call void @__cxa_end_catch() 175f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall // CHECK: ret void 176f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 177f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall } 178f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall} 17959a7000a79118e4c140885ccbb2ac6a686a73092John McCall 18059a7000a79118e4c140885ccbb2ac6a686a73092John McCall// Constructor function-try-block must rethrow on fallthrough. 18159a7000a79118e4c140885ccbb2ac6a686a73092John McCall// rdar://problem/7696603 18259a7000a79118e4c140885ccbb2ac6a686a73092John McCallnamespace test9 { 18359a7000a79118e4c140885ccbb2ac6a686a73092John McCall void opaque(); 18459a7000a79118e4c140885ccbb2ac6a686a73092John McCall 18559a7000a79118e4c140885ccbb2ac6a686a73092John McCall struct A { A(); }; 18659a7000a79118e4c140885ccbb2ac6a686a73092John McCall 18759a7000a79118e4c140885ccbb2ac6a686a73092John McCall 18893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5test91AC2Ev(%"struct.test9::A"* %this) unnamed_addr 18959a7000a79118e4c140885ccbb2ac6a686a73092John McCall A::A() try { 19059a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: invoke void @_ZN5test96opaqueEv() 19159a7000a79118e4c140885ccbb2ac6a686a73092John McCall opaque(); 19259a7000a79118e4c140885ccbb2ac6a686a73092John McCall } catch (int x) { 193285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling // CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) 194285cfd8953d4ca4da613a47a0d691f7234068f8cBill Wendling // CHECK-NEXT: catch i8* bitcast (i8** @_ZTIi to i8*) 195777d6e56ad9b1fed9866daf3ee6486d85c5b7d32John McCall 19659a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: call i8* @__cxa_begin_catch 19759a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: invoke void @_ZN5test96opaqueEv() 19859a7000a79118e4c140885ccbb2ac6a686a73092John McCall // CHECK: invoke void @__cxa_rethrow() 199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: define void @_ZN5test91AC1Ev(%"struct.test9::A"* %this) unnamed_addr 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK: call void @_ZN5test91AC2Ev 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: ret void 20359a7000a79118e4c140885ccbb2ac6a686a73092John McCall opaque(); 20459a7000a79118e4c140885ccbb2ac6a686a73092John McCall } 20559a7000a79118e4c140885ccbb2ac6a686a73092John McCall} 2068e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2078e3f86193995c47ee0d229e4336c3382410f09f5John McCall// __cxa_end_catch can throw for some kinds of caught exceptions. 2088e3f86193995c47ee0d229e4336c3382410f09f5John McCallnamespace test10 { 2098e3f86193995c47ee0d229e4336c3382410f09f5John McCall void opaque(); 2108e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2118e3f86193995c47ee0d229e4336c3382410f09f5John McCall struct A { ~A(); }; 2128e3f86193995c47ee0d229e4336c3382410f09f5John McCall struct B { int x; }; 2138e3f86193995c47ee0d229e4336c3382410f09f5John McCall 21493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test103fooEv() 2158e3f86193995c47ee0d229e4336c3382410f09f5John McCall void foo() { 2168e3f86193995c47ee0d229e4336c3382410f09f5John McCall A a; // force a cleanup context 2178e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2188e3f86193995c47ee0d229e4336c3382410f09f5John McCall try { 2198e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: invoke void @_ZN6test106opaqueEv() 2208e3f86193995c47ee0d229e4336c3382410f09f5John McCall opaque(); 2218e3f86193995c47ee0d229e4336c3382410f09f5John McCall } catch (int i) { 2228e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: call i8* @__cxa_begin_catch 2238e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: bitcast 2248e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: load i32* 2258e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: store i32 2264e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK-NEXT: call void @__cxa_end_catch() [[NUW:#[0-9]+]] 2278e3f86193995c47ee0d229e4336c3382410f09f5John McCall } catch (B a) { 2288e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: call i8* @__cxa_begin_catch 2298e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: bitcast 2308e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: bitcast 2318e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: bitcast 2328e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: call void @llvm.memcpy 2338e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: invoke void @__cxa_end_catch() 2348e3f86193995c47ee0d229e4336c3382410f09f5John McCall } catch (...) { 2358e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: call i8* @__cxa_begin_catch 2368e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK-NEXT: invoke void @__cxa_end_catch() 2378e3f86193995c47ee0d229e4336c3382410f09f5John McCall } 2388e3f86193995c47ee0d229e4336c3382410f09f5John McCall 2398e3f86193995c47ee0d229e4336c3382410f09f5John McCall // CHECK: call void @_ZN6test101AD1Ev( 2408e3f86193995c47ee0d229e4336c3382410f09f5John McCall } 2418e3f86193995c47ee0d229e4336c3382410f09f5John McCall} 242204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall 243204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall// __cxa_begin_catch returns pointers by value, even when catching by reference 244204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall// <rdar://problem/8212123> 245204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCallnamespace test11 { 246204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall void opaque(); 247204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall 24893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test113fooEv() 249204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall void foo() { 250204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall try { 251204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: invoke void @_ZN6test116opaqueEv() 252204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall opaque(); 253204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } catch (int**&p) { 254204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: [[EXN:%.*]] = load i8** 2554e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK-NEXT: call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]] 256204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[ADJ1:%.*]] = getelementptr i8* [[EXN]], i32 32 257204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to i32*** 258204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: store i32*** [[ADJ2]], i32**** [[P:%.*]] 2594e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK-NEXT: call void @__cxa_end_catch() [[NUW]] 260204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } 261204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } 262204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall 263204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall struct A {}; 264204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall 26593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test113barEv() 266204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall void bar() { 267204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall try { 268204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: [[EXNSLOT:%.*]] = alloca i8* 26993c332a8ba2c193c435b293966d343dab15f555bJohn McCall // CHECK-NEXT: [[SELECTORSLOT:%.*]] = alloca i32 270204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[P:%.*]] = alloca [[A:%.*]]**, 271204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[TMP:%.*]] = alloca [[A]]* 272204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: invoke void @_ZN6test116opaqueEv() 273204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall opaque(); 274204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } catch (A*&p) { 275204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK: [[EXN:%.*]] = load i8** [[EXNSLOT]] 2764e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK-NEXT: [[ADJ1:%.*]] = call i8* @__cxa_begin_catch(i8* [[EXN]]) [[NUW]] 277204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to [[A]]* 278204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: store [[A]]* [[ADJ2]], [[A]]** [[TMP]] 279204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall // CHECK-NEXT: store [[A]]** [[TMP]], [[A]]*** [[P]] 2804e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK-NEXT: call void @__cxa_end_catch() [[NUW]] 281204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } 282204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall } 283204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall} 284ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 285ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// PR7686 286ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCallnamespace test12 { 2870ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl struct A { ~A() noexcept(false); }; 288ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall bool opaque(const A&); 289ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 29093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test124testEv() 291ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall void test() { 292ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[X:%.*]] = alloca [[A:%.*]], 293ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[EHCLEANUPDEST:%.*]] = alloca i32 294ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[Y:%.*]] = alloca [[A]] 295ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[Z:%.*]] = alloca [[A]] 296ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: [[CLEANUPDEST:%.*]] = alloca i32 297ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 298ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A x; 299ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: invoke zeroext i1 @_ZN6test126opaqueERKNS_1AE( 300ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall if (opaque(x)) { 301ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A y; 302ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A z; 303ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 304ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: invoke void @_ZN6test121AD1Ev([[A]]* [[Z]]) 305ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: invoke void @_ZN6test121AD1Ev([[A]]* [[Y]]) 30682cd2e5c15aa909ec9613c4228ab69e07f1c6f7aJohn McCall // CHECK-NOT: switch 307ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall goto success; 308ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 309ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 310ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall success: 311ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall bool _ = true; 312ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 313ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK: call void @_ZN6test121AD1Ev([[A]]* [[X]]) 314ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall // CHECK-NEXT: ret void 315ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 316ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall} 317ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 318ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// Reduced from some TableGen code that was causing a self-host crash. 319ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCallnamespace test13 { 320ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall struct A { ~A(); }; 321ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 322ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall void test0(int x) { 323ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall try { 324ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall switch (x) { 325ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall case 0: 326ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall break; 327ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall case 1:{ 328ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A a; 329ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall break; 330ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 331ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall default: 332ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall return; 333ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 334ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall return; 335ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } catch (int x) { 336ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 337ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall return; 338ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 339ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall 340ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall void test1(int x) { 341ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall A y; 342ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall try { 343ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall switch (x) { 344ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall default: break; 345ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 346ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } catch (int x) {} 347ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall } 348ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall} 3497cd4b060f1e59f6d29126383ceee614e4772f859John McCall 3507cd4b060f1e59f6d29126383ceee614e4772f859John McCall// rdar://problem/8231514 3517cd4b060f1e59f6d29126383ceee614e4772f859John McCallnamespace test14 { 3527cd4b060f1e59f6d29126383ceee614e4772f859John McCall struct A { ~A(); }; 3537cd4b060f1e59f6d29126383ceee614e4772f859John McCall struct B { ~B(); }; 3547cd4b060f1e59f6d29126383ceee614e4772f859John McCall 3557cd4b060f1e59f6d29126383ceee614e4772f859John McCall B b(); 3567cd4b060f1e59f6d29126383ceee614e4772f859John McCall void opaque(); 3577cd4b060f1e59f6d29126383ceee614e4772f859John McCall 3587cd4b060f1e59f6d29126383ceee614e4772f859John McCall void foo() { 3597cd4b060f1e59f6d29126383ceee614e4772f859John McCall A a; 3607cd4b060f1e59f6d29126383ceee614e4772f859John McCall try { 3617cd4b060f1e59f6d29126383ceee614e4772f859John McCall B str = b(); 3627cd4b060f1e59f6d29126383ceee614e4772f859John McCall opaque(); 3637cd4b060f1e59f6d29126383ceee614e4772f859John McCall } catch (int x) { 3647cd4b060f1e59f6d29126383ceee614e4772f859John McCall } 3657cd4b060f1e59f6d29126383ceee614e4772f859John McCall } 3667cd4b060f1e59f6d29126383ceee614e4772f859John McCall} 367413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 368413e67778d593215d2f2161a4e712c8568f1ddd0John McCall// rdar://problem/8231514 369413e67778d593215d2f2161a4e712c8568f1ddd0John McCall// JumpDests shouldn't get confused by scopes that aren't normal cleanups. 370413e67778d593215d2f2161a4e712c8568f1ddd0John McCallnamespace test15 { 371413e67778d593215d2f2161a4e712c8568f1ddd0John McCall struct A { ~A(); }; 372413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 373413e67778d593215d2f2161a4e712c8568f1ddd0John McCall bool opaque(int); 374413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 37593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test153fooEv() 376413e67778d593215d2f2161a4e712c8568f1ddd0John McCall void foo() { 377413e67778d593215d2f2161a4e712c8568f1ddd0John McCall A a; 378413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 379413e67778d593215d2f2161a4e712c8568f1ddd0John McCall try { 380413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: [[X:%.*]] = alloca i32 381413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: store i32 10, i32* [[X]] 382413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK-NEXT: br label 383413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // -> while.cond 384413e67778d593215d2f2161a4e712c8568f1ddd0John McCall int x = 10; 385413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 386413e67778d593215d2f2161a4e712c8568f1ddd0John McCall while (true) { 387413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: load i32* [[X]] 388413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK-NEXT: [[COND:%.*]] = invoke zeroext i1 @_ZN6test156opaqueEi 389413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: br i1 [[COND]] 390413e67778d593215d2f2161a4e712c8568f1ddd0John McCall if (opaque(x)) 391413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: br label 392413e67778d593215d2f2161a4e712c8568f1ddd0John McCall break; 393413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 394413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: br label 395413e67778d593215d2f2161a4e712c8568f1ddd0John McCall } 396413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: br label 397413e67778d593215d2f2161a4e712c8568f1ddd0John McCall } catch (int x) { } 398413e67778d593215d2f2161a4e712c8568f1ddd0John McCall 399413e67778d593215d2f2161a4e712c8568f1ddd0John McCall // CHECK: call void @_ZN6test151AD1Ev 400413e67778d593215d2f2161a4e712c8568f1ddd0John McCall } 401413e67778d593215d2f2161a4e712c8568f1ddd0John McCall} 4023ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall 4033ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCallnamespace test16 { 4040ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl struct A { A(); ~A() noexcept(false); }; 4050ee33912f8ec3453856c8a32ed2c2e8007bed614Sebastian Redl struct B { int x; B(const A &); ~B() noexcept(false); }; 4063ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall void foo(); 4073ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall bool cond(); 4083ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall 40993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test163barEv() 4103ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall void bar() { 4113ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: [[EXN_SAVE:%.*]] = alloca i8* 4123ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: [[EXN_ACTIVE:%.*]] = alloca i1 4133ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: [[TEMP:%.*]] = alloca [[A:%.*]], 4143ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: [[EXNSLOT:%.*]] = alloca i8* 41593c332a8ba2c193c435b293966d343dab15f555bJohn McCall // CHECK-NEXT: [[SELECTORSLOT:%.*]] = alloca i32 4163ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: [[TEMP_ACTIVE:%.*]] = alloca i1 4173ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall 4183ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall cond() ? throw B(A()) : foo(); 4193ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall 4203ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: [[COND:%.*]] = call zeroext i1 @_ZN6test164condEv() 4213ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: store i1 false, i1* [[EXN_ACTIVE]] 4223ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: store i1 false, i1* [[TEMP_ACTIVE]] 4233ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: br i1 [[COND]], 4243ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall 4253ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: [[EXN:%.*]] = call i8* @__cxa_allocate_exception(i64 4) 4263ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: store i8* [[EXN]], i8** [[EXN_SAVE]] 4273ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: store i1 true, i1* [[EXN_ACTIVE]] 4283ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[EXN]] to [[B:%.*]]* 4293ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: invoke void @_ZN6test161AC1Ev([[A]]* [[TEMP]]) 4303ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: store i1 true, i1* [[TEMP_ACTIVE]] 431ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // CHECK-NEXT: invoke void @_ZN6test161BC1ERKNS_1AE([[B]]* [[T0]], [[A]]* nonnull [[TEMP]]) 4323ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: store i1 false, i1* [[EXN_ACTIVE]] 4333ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: invoke void @__cxa_throw(i8* [[EXN]], 4343ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall 4353ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: invoke void @_ZN6test163fooEv() 4363ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: br label 4373ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall 4383ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: invoke void @_ZN6test161AD1Ev([[A]]* [[TEMP]]) 4393ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: ret void 4403ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall 4413ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: [[T0:%.*]] = load i1* [[EXN_ACTIVE]] 4423ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: br i1 [[T0]] 4433ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK: [[T1:%.*]] = load i8** [[EXN_SAVE]] 4443ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: call void @__cxa_free_exception(i8* [[T1]]) 4453ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall // CHECK-NEXT: br label 4463ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall } 4473ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall} 4484e1125f630e75a52209b928e9d43b638abf39987Bill Wendling 4494e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: attributes [[NUW]] = { nounwind } 4504e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: attributes [[NR]] = { noreturn } 451