eh.cpp revision 413e67778d593215d2f2161a4e712c8568f1ddd0
1ac418162692a951ca3796d6830496a85a2d12493John McCall// RUN: %clang_cc1 -fexceptions -triple x86_64-apple-darwin -std=c++0x -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
12ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:     define void @_Z5test1v()
13ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:       [[FREEVAR:%.*]] = alloca i1
14ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXNOBJVAR:%.*]] = alloca i8*
15ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i1 false, i1* [[FREEVAR]]
16ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8)
17ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i8* [[EXNOBJ]], i8** [[EXNOBJVAR]]
18ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i1 true, i1* [[FREEVAR]]
19ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]]
20ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXN2:%.*]] = bitcast [[DSTAR]] [[EXN]] to i8*
21ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[EXN2]], i8* bitcast ([[DSTAR]] @d1 to i8*), i64 8, i32 8, i1 false)
22ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i1 false, i1* [[FREEVAR]]
23ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast (%0* @_ZTI7test1_D to i8*), i8* null) noreturn
24a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT:  unreachable
25a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
26a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
27a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpstruct test2_D {
28a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  test2_D(const test2_D&o);
29a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  test2_D();
30a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  virtual void bar() { }
31a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  int i; int j;
32a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump} d2;
33a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
34a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test2() {
35a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  throw d2;
36a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump}
37a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
38ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:     define void @_Z5test2v()
39ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:       [[FREEVAR:%.*]] = alloca i1
40ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXNOBJVAR:%.*]] = alloca i8*
41f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT:  [[EXNSLOTVAR:%.*]] = alloca i8*
42ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// CHECK-NEXT:  [[CLEANUPDESTVAR:%.*]] = alloca i32
43ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i1 false, i1* [[FREEVAR]]
44ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 16)
45ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i8* [[EXNOBJ]], i8** [[EXNOBJVAR]]
46ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i1 true, i1* [[FREEVAR]]
47ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSTAR:%[^*]*\*]]
48ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  invoke void @_ZN7test2_DC1ERKS_([[DSTAR]] [[EXN]], [[DSTAR]] @d2)
49ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:     to label %[[CONT:.*]] unwind label %{{.*}}
507e2f128354f631d44b3f6dbcd4cee1cc04bdf7b1John McCall//      :     [[CONT]]:   (can't check this in Release-Asserts builds)
517e2f128354f631d44b3f6dbcd4cee1cc04bdf7b1John McCall// CHECK:       store i1 false, i1* [[FREEVAR]]
52ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast (%{{.*}}* @_ZTI7test2_D to i8*), i8* null) noreturn
53a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT:  unreachable
54a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
55a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
56a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpstruct test3_D {
57a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  test3_D() { }
58a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  test3_D(volatile test3_D&o);
59a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  virtual void bar();
60a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump};
61a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
62a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test3() {
63a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  throw (volatile test3_D *)0;
64a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump}
65a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
66ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:     define void @_Z5test3v()
67ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:       [[FREEVAR:%.*]] = alloca i1
68ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXNOBJVAR:%.*]] = alloca i8*
69ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i1 false, i1* [[FREEVAR]]
70ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 8)
71ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i8* [[EXNOBJ]], i8** [[EXNOBJVAR]]
72ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i1 true, i1* [[FREEVAR]]
73ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  [[EXN:%.*]] = bitcast i8* [[EXNOBJ]] to [[DSS:%[^*]*\*]]*
74ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store [[DSS]] null, [[DSS]]* [[EXN]]
75ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  store i1 false, i1* [[FREEVAR]]
76ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  call void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast (%1* @_ZTIPV7test3_D to i8*), i8* null) noreturn
77ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:  unreachable
78a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
79a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
80a446343a46ec5a2e3813f3d3314476be267fa242Mike Stumpvoid test4() {
81a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump  throw;
82a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump}
83a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump
84ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:     define void @_Z5test4v()
8553b4810bad9385fbc65f045711585517f99fd31bMike Stump// CHECK:        call void @__cxa_rethrow() noreturn
86a446343a46ec5a2e3813f3d3314476be267fa242Mike Stump// CHECK-NEXT:   unreachable
87ac418162692a951ca3796d6830496a85a2d12493John McCall
88ac418162692a951ca3796d6830496a85a2d12493John McCall
89ac418162692a951ca3796d6830496a85a2d12493John McCall// rdar://problem/7696549
90ac418162692a951ca3796d6830496a85a2d12493John McCallnamespace test5 {
91ac418162692a951ca3796d6830496a85a2d12493John McCall  struct A {
92ac418162692a951ca3796d6830496a85a2d12493John McCall    A();
93ac418162692a951ca3796d6830496a85a2d12493John McCall    A(const A&);
94ac418162692a951ca3796d6830496a85a2d12493John McCall    ~A();
95ac418162692a951ca3796d6830496a85a2d12493John McCall  };
96ac418162692a951ca3796d6830496a85a2d12493John McCall
97ac418162692a951ca3796d6830496a85a2d12493John McCall  void test() {
98ac418162692a951ca3796d6830496a85a2d12493John McCall    try { throw A(); } catch (A &x) {}
99ac418162692a951ca3796d6830496a85a2d12493John McCall  }
100ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:      define void @_ZN5test54testEv()
101ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:      [[EXNOBJ:%.*]] = call i8* @__cxa_allocate_exception(i64 1)
102ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:      [[EXNCAST:%.*]] = bitcast i8* [[EXNOBJ]] to [[A:%[^*]*]]*
103ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT: invoke void @_ZN5test51AC1Ev([[A]]* [[EXNCAST]])
104ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:      invoke void @__cxa_throw(i8* [[EXNOBJ]], i8* bitcast ({{%.*}}* @_ZTIN5test51AE to i8*), i8* bitcast (void ([[A]]*)* @_ZN5test51AD1Ev to i8*)) noreturn
105ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK-NEXT:   to label {{%.*}} unwind label %[[HANDLER:[^ ]*]]
1067e2f128354f631d44b3f6dbcd4cee1cc04bdf7b1John McCall//      :    [[HANDLER]]:  (can't check this in Release-Asserts builds)
107ac418162692a951ca3796d6830496a85a2d12493John McCall// CHECK:      {{%.*}} = call i32 @llvm.eh.typeid.for(i8* bitcast ({{%.*}}* @_ZTIN5test51AE to i8*))
108ac418162692a951ca3796d6830496a85a2d12493John McCall}
109f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
110f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test6 {
111f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  template <class T> struct allocator {
112f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    ~allocator() throw() { }
113f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  };
114f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
115f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  void foo() {
116f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    allocator<int> a;
117f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  }
118f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall}
119f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
120f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// PR7127
121f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test7 {
122f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK:      define i32 @_ZN5test73fooEv()
123f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  int foo() {
124f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK:      [[FREEEXNOBJ:%.*]] = alloca i1
125f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[EXNALLOCVAR:%.*]] = alloca i8*
126f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[CAUGHTEXNVAR:%.*]] = alloca i8*
127f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[INTCATCHVAR:%.*]] = alloca i32
128ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// CHECK-NEXT: [[EHCLEANUPDESTVAR:%.*]] = alloca i32
129f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i1 false, i1* [[FREEEXNOBJ]]
130f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    try {
131f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      try {
132f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: [[EXNALLOC:%.*]] = call i8* @__cxa_allocate_exception
133f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i8* [[EXNALLOC]], i8** [[EXNALLOCVAR]]
134f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i1 true, i1* [[FREEEXNOBJ]]
135f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: bitcast i8* [[EXNALLOC]] to i32*
136f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i32 1, i32*
137f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i1 false, i1* [[FREEEXNOBJ]]
138f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: invoke void @__cxa_throw(i8* [[EXNALLOC]], i8* bitcast (i8** @_ZTIi to i8*), i8* null
139f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall        throw 1;
140f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      }
141f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
142f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK:      [[CAUGHTEXN:%.*]] = call i8* @llvm.eh.exception()
143f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i8* [[CAUGHTEXN]], i8** [[CAUGHTEXNVAR]]
144f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* [[CAUGHTEXN]], i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* bitcast (i8** @_ZTIi to i8*), i8* null)
145f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*))
146f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: icmp eq
147f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: br i1
148f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK:      load i8** [[CAUGHTEXNVAR]]
149f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i8* @__cxa_begin_catch
150f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK:      invoke void @__cxa_rethrow
151f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      catch (int) {
152f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall        throw;
153f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      }
154f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    }
155f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK:      [[CAUGHTEXN:%.*]] = call i8* @llvm.eh.exception()
156f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: store i8* [[CAUGHTEXN]], i8** [[CAUGHTEXNVAR]]
157f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* [[CAUGHTEXN]], i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* null)
158ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// CHECK-NEXT: store i32 1, i32* [[EHCLEANUPDESTVAR]]
159f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call void @__cxa_end_catch()
160f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: br label
161f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK:      load i8** [[CAUGHTEXNVAR]]
162f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call i8* @__cxa_begin_catch
163f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK-NEXT: call void @__cxa_end_catch
164f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    catch (...) {
165f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    }
166f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// CHECK:      ret i32 0
167f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    return 0;
168f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  }
169f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall}
170f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
171f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall// Ordering of destructors in a catch handler.
172f1549f66a8216a78112286e3978cea2c29d6334cJohn McCallnamespace test8 {
173f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  struct A { A(const A&); ~A(); };
174f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  void bar();
175f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall
176f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  // CHECK: define void @_ZN5test83fooEv()
177f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  void foo() {
178f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    try {
179f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      // CHECK:      invoke void @_ZN5test83barEv()
180f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      bar();
181f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    } catch (A a) {
182f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      // CHECK:      call i8* @__cxa_get_exception_ptr
183f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      // CHECK-NEXT: bitcast
184f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      // CHECK-NEXT: invoke void @_ZN5test81AC1ERKS0_(
185f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      // CHECK:      call i8* @__cxa_begin_catch
186f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      // CHECK-NEXT: invoke void @_ZN5test81AD1Ev(
187f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      // CHECK:      call void @__cxa_end_catch()
188f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall      // CHECK:      ret void
189f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall    }
190f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall  }
191f1549f66a8216a78112286e3978cea2c29d6334cJohn McCall}
19259a7000a79118e4c140885ccbb2ac6a686a73092John McCall
19359a7000a79118e4c140885ccbb2ac6a686a73092John McCall// Constructor function-try-block must rethrow on fallthrough.
19459a7000a79118e4c140885ccbb2ac6a686a73092John McCall// rdar://problem/7696603
19559a7000a79118e4c140885ccbb2ac6a686a73092John McCallnamespace test9 {
19659a7000a79118e4c140885ccbb2ac6a686a73092John McCall  void opaque();
19759a7000a79118e4c140885ccbb2ac6a686a73092John McCall
19859a7000a79118e4c140885ccbb2ac6a686a73092John McCall  struct A { A(); };
19959a7000a79118e4c140885ccbb2ac6a686a73092John McCall
20059a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK:      define void @_ZN5test91AC1Ev
20159a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK:      call void @_ZN5test91AC2Ev
20259a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK-NEXT: ret void
20359a7000a79118e4c140885ccbb2ac6a686a73092John McCall
20459a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK: define void @_ZN5test91AC2Ev(
20559a7000a79118e4c140885ccbb2ac6a686a73092John McCall  A::A() try {
20659a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK:      invoke void @_ZN5test96opaqueEv()
20759a7000a79118e4c140885ccbb2ac6a686a73092John McCall    opaque();
20859a7000a79118e4c140885ccbb2ac6a686a73092John McCall  } catch (int x) {
20959a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK:      call i8* @__cxa_begin_catch
21059a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK:      invoke void @_ZN5test96opaqueEv()
21159a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK:      invoke void @__cxa_rethrow()
21259a7000a79118e4c140885ccbb2ac6a686a73092John McCall    opaque();
21359a7000a79118e4c140885ccbb2ac6a686a73092John McCall  }
21459a7000a79118e4c140885ccbb2ac6a686a73092John McCall
21559a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // landing pad from first call to invoke
21659a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK:      call i8* @llvm.eh.exception
21759a7000a79118e4c140885ccbb2ac6a686a73092John McCall  // CHECK:      call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* {{.*}}, i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*), i8* bitcast (i8** @_ZTIi to i8*), i8* null)
21859a7000a79118e4c140885ccbb2ac6a686a73092John McCall}
2198e3f86193995c47ee0d229e4336c3382410f09f5John McCall
2208e3f86193995c47ee0d229e4336c3382410f09f5John McCall// __cxa_end_catch can throw for some kinds of caught exceptions.
2218e3f86193995c47ee0d229e4336c3382410f09f5John McCallnamespace test10 {
2228e3f86193995c47ee0d229e4336c3382410f09f5John McCall  void opaque();
2238e3f86193995c47ee0d229e4336c3382410f09f5John McCall
2248e3f86193995c47ee0d229e4336c3382410f09f5John McCall  struct A { ~A(); };
2258e3f86193995c47ee0d229e4336c3382410f09f5John McCall  struct B { int x; };
2268e3f86193995c47ee0d229e4336c3382410f09f5John McCall
2278e3f86193995c47ee0d229e4336c3382410f09f5John McCall  // CHECK: define void @_ZN6test103fooEv()
2288e3f86193995c47ee0d229e4336c3382410f09f5John McCall  void foo() {
2298e3f86193995c47ee0d229e4336c3382410f09f5John McCall    A a; // force a cleanup context
2308e3f86193995c47ee0d229e4336c3382410f09f5John McCall
2318e3f86193995c47ee0d229e4336c3382410f09f5John McCall    try {
2328e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK:      invoke void @_ZN6test106opaqueEv()
2338e3f86193995c47ee0d229e4336c3382410f09f5John McCall      opaque();
2348e3f86193995c47ee0d229e4336c3382410f09f5John McCall    } catch (int i) {
2358e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK:      call i8* @__cxa_begin_catch
2368e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: bitcast
2378e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: load i32*
2388e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: store i32
2398e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: call void @__cxa_end_catch() nounwind
2408e3f86193995c47ee0d229e4336c3382410f09f5John McCall    } catch (B a) {
2418e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK:      call i8* @__cxa_begin_catch
2428e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: bitcast
2438e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: bitcast
2448e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: bitcast
2458e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: call void @llvm.memcpy
2468e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: invoke void @__cxa_end_catch()
2478e3f86193995c47ee0d229e4336c3382410f09f5John McCall    } catch (...) {
2488e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK:      call i8* @__cxa_begin_catch
2498e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK-NEXT: invoke void @__cxa_end_catch()
2508e3f86193995c47ee0d229e4336c3382410f09f5John McCall    }
2518e3f86193995c47ee0d229e4336c3382410f09f5John McCall
2528e3f86193995c47ee0d229e4336c3382410f09f5John McCall    // CHECK: call void @_ZN6test101AD1Ev(
2538e3f86193995c47ee0d229e4336c3382410f09f5John McCall  }
2548e3f86193995c47ee0d229e4336c3382410f09f5John McCall}
255204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall
256204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall// __cxa_begin_catch returns pointers by value, even when catching by reference
257204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall// <rdar://problem/8212123>
258204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCallnamespace test11 {
259204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall  void opaque();
260204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall
261204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall  // CHECK: define void @_ZN6test113fooEv()
262204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall  void foo() {
263204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall    try {
264204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK:      invoke void @_ZN6test116opaqueEv()
265204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      opaque();
266204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall    } catch (int**&p) {
267204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK:      [[EXN:%.*]] = load i8**
268204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: call i8* @__cxa_begin_catch(i8* [[EXN]]) nounwind
269204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: [[ADJ1:%.*]] = getelementptr i8* [[EXN]], i32 32
270204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to i32***
271204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: store i32*** [[ADJ2]], i32**** [[P:%.*]]
272204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: call void @__cxa_end_catch() nounwind
273204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall    }
274204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall  }
275204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall
276204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall  struct A {};
277204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall
278204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall  // CHECK: define void @_ZN6test113barEv()
279204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall  void bar() {
280204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall    try {
281204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK:      [[EXNSLOT:%.*]] = alloca i8*
282204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: [[P:%.*]] = alloca [[A:%.*]]**,
283204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: [[TMP:%.*]] = alloca [[A]]*
284204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: invoke void @_ZN6test116opaqueEv()
285204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      opaque();
286204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall    } catch (A*&p) {
287204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK:      [[EXN:%.*]] = load i8** [[EXNSLOT]]
288204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: [[ADJ1:%.*]] = call i8* @__cxa_begin_catch(i8* [[EXN]]) nounwind
289204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: [[ADJ2:%.*]] = bitcast i8* [[ADJ1]] to [[A]]*
290204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: store [[A]]* [[ADJ2]], [[A]]** [[TMP]]
291204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: store [[A]]** [[TMP]], [[A]]*** [[P]]
292204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall      // CHECK-NEXT: call void @__cxa_end_catch() nounwind
293204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall    }
294204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall  }
295204b075fcc47c3f2aa7276dfba9b42eb25840b53John McCall}
296ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
297ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// PR7686
298ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCallnamespace test12 {
299ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  struct A { ~A(); };
300ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  bool opaque(const A&);
301ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
302ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  // CHECK: define void @_ZN6test124testEv()
303ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  void test() {
304ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    // CHECK: [[X:%.*]] = alloca [[A:%.*]],
305ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    // CHECK: [[EHCLEANUPDEST:%.*]] = alloca i32
306ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    // CHECK: [[Y:%.*]] = alloca [[A]]
307ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    // CHECK: [[Z:%.*]] = alloca [[A]]
308ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    // CHECK: [[CLEANUPDEST:%.*]] = alloca i32
309ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
310ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    A x;
311ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    // CHECK: invoke zeroext i1 @_ZN6test126opaqueERKNS_1AE(
312ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    if (opaque(x)) {
313ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      A y;
314ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      A z;
315ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
316ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      // CHECK: invoke void @_ZN6test121AD1Ev([[A]]* [[Z]])
317ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      // CHECK: invoke void @_ZN6test121AD1Ev([[A]]* [[Y]])
318ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
319ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      // It'd be great if something eliminated this switch.
320ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      // CHECK:      load i32* [[CLEANUPDEST]]
321ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      // CHECK-NEXT: switch i32
322ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      goto success;
323ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    }
324ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
325ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  success:
326ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    bool _ = true;
327ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
328ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    // CHECK: call void @_ZN6test121AD1Ev([[A]]* [[X]])
329ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    // CHECK-NEXT: ret void
330ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  }
331ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall}
332ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
333ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall// Reduced from some TableGen code that was causing a self-host crash.
334ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCallnamespace test13 {
335ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  struct A { ~A(); };
336ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
337ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  void test0(int x) {
338ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    try {
339ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      switch (x) {
340ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      case 0:
341ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall        break;
342ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      case 1:{
343ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall        A a;
344ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall        break;
345ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      }
346ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      default:
347ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall        return;
348ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      }
349ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      return;
350ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    } catch (int x) {
351ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    }
352ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    return;
353ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  }
354ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall
355ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  void test1(int x) {
356ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    A y;
357ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    try {
358ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      switch (x) {
359ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      default: break;
360ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall      }
361ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall    } catch (int x) {}
362ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall  }
363ff8e11579fc904aa4032d90d2be6ce1ac5fc9fe1John McCall}
3647cd4b060f1e59f6d29126383ceee614e4772f859John McCall
3657cd4b060f1e59f6d29126383ceee614e4772f859John McCall// rdar://problem/8231514
3667cd4b060f1e59f6d29126383ceee614e4772f859John McCallnamespace test14 {
3677cd4b060f1e59f6d29126383ceee614e4772f859John McCall  struct A { ~A(); };
3687cd4b060f1e59f6d29126383ceee614e4772f859John McCall  struct B { ~B(); };
3697cd4b060f1e59f6d29126383ceee614e4772f859John McCall
3707cd4b060f1e59f6d29126383ceee614e4772f859John McCall  B b();
3717cd4b060f1e59f6d29126383ceee614e4772f859John McCall  void opaque();
3727cd4b060f1e59f6d29126383ceee614e4772f859John McCall
3737cd4b060f1e59f6d29126383ceee614e4772f859John McCall  void foo() {
3747cd4b060f1e59f6d29126383ceee614e4772f859John McCall    A a;
3757cd4b060f1e59f6d29126383ceee614e4772f859John McCall    try {
3767cd4b060f1e59f6d29126383ceee614e4772f859John McCall      B str = b();
3777cd4b060f1e59f6d29126383ceee614e4772f859John McCall      opaque();
3787cd4b060f1e59f6d29126383ceee614e4772f859John McCall    } catch (int x) {
3797cd4b060f1e59f6d29126383ceee614e4772f859John McCall    }
3807cd4b060f1e59f6d29126383ceee614e4772f859John McCall  }
3817cd4b060f1e59f6d29126383ceee614e4772f859John McCall}
382413e67778d593215d2f2161a4e712c8568f1ddd0John McCall
383413e67778d593215d2f2161a4e712c8568f1ddd0John McCall// rdar://problem/8231514
384413e67778d593215d2f2161a4e712c8568f1ddd0John McCall// JumpDests shouldn't get confused by scopes that aren't normal cleanups.
385413e67778d593215d2f2161a4e712c8568f1ddd0John McCallnamespace test15 {
386413e67778d593215d2f2161a4e712c8568f1ddd0John McCall  struct A { ~A(); };
387413e67778d593215d2f2161a4e712c8568f1ddd0John McCall
388413e67778d593215d2f2161a4e712c8568f1ddd0John McCall  bool opaque(int);
389413e67778d593215d2f2161a4e712c8568f1ddd0John McCall
390413e67778d593215d2f2161a4e712c8568f1ddd0John McCall  // CHECK: define void @_ZN6test153fooEv()
391413e67778d593215d2f2161a4e712c8568f1ddd0John McCall  void foo() {
392413e67778d593215d2f2161a4e712c8568f1ddd0John McCall    A a;
393413e67778d593215d2f2161a4e712c8568f1ddd0John McCall
394413e67778d593215d2f2161a4e712c8568f1ddd0John McCall    try {
395413e67778d593215d2f2161a4e712c8568f1ddd0John McCall      // CHECK:      [[X:%.*]] = alloca i32
396413e67778d593215d2f2161a4e712c8568f1ddd0John McCall      // CHECK:      store i32 10, i32* [[X]]
397413e67778d593215d2f2161a4e712c8568f1ddd0John McCall      // CHECK-NEXT: br label
398413e67778d593215d2f2161a4e712c8568f1ddd0John McCall      //   -> while.cond
399413e67778d593215d2f2161a4e712c8568f1ddd0John McCall      int x = 10;
400413e67778d593215d2f2161a4e712c8568f1ddd0John McCall
401413e67778d593215d2f2161a4e712c8568f1ddd0John McCall      while (true) {
402413e67778d593215d2f2161a4e712c8568f1ddd0John McCall        // CHECK:      load i32* [[X]]
403413e67778d593215d2f2161a4e712c8568f1ddd0John McCall        // CHECK-NEXT: [[COND:%.*]] = invoke zeroext i1 @_ZN6test156opaqueEi
404413e67778d593215d2f2161a4e712c8568f1ddd0John McCall        // CHECK:      br i1 [[COND]]
405413e67778d593215d2f2161a4e712c8568f1ddd0John McCall        if (opaque(x))
406413e67778d593215d2f2161a4e712c8568f1ddd0John McCall        // CHECK:      br label
407413e67778d593215d2f2161a4e712c8568f1ddd0John McCall          break;
408413e67778d593215d2f2161a4e712c8568f1ddd0John McCall
409413e67778d593215d2f2161a4e712c8568f1ddd0John McCall        // CHECK:      br label
410413e67778d593215d2f2161a4e712c8568f1ddd0John McCall      }
411413e67778d593215d2f2161a4e712c8568f1ddd0John McCall      // CHECK:      br label
412413e67778d593215d2f2161a4e712c8568f1ddd0John McCall    } catch (int x) { }
413413e67778d593215d2f2161a4e712c8568f1ddd0John McCall
414413e67778d593215d2f2161a4e712c8568f1ddd0John McCall    // CHECK: call void @_ZN6test151AD1Ev
415413e67778d593215d2f2161a4e712c8568f1ddd0John McCall  }
416413e67778d593215d2f2161a4e712c8568f1ddd0John McCall}
417