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