xref: /aosp_15_r20/external/clang/test/CXX/except/except.spec/p14-ir.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fexceptions -o - %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // Copy constructor
4*67e74705SXin Li struct X0 {
5*67e74705SXin Li   X0();
6*67e74705SXin Li   X0(const X0 &) throw();
7*67e74705SXin Li   X0(X0 &);
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li struct X1 {
11*67e74705SXin Li   X1();
12*67e74705SXin Li   X1(const X1 &) throw();
13*67e74705SXin Li };
14*67e74705SXin Li 
15*67e74705SXin Li struct X2 : X1 {
16*67e74705SXin Li   X2();
17*67e74705SXin Li };
18*67e74705SXin Li struct X3 : X0, X1 {
19*67e74705SXin Li   X3();
20*67e74705SXin Li };
21*67e74705SXin Li 
22*67e74705SXin Li struct X4 {
23*67e74705SXin Li   X4(X4 &) throw();
24*67e74705SXin Li };
25*67e74705SXin Li 
26*67e74705SXin Li struct X5 : X0, X4 { };
27*67e74705SXin Li 
test(X2 x2,X3 x3,X5 x5)28*67e74705SXin Li void test(X2 x2, X3 x3, X5 x5) {
29*67e74705SXin Li   // CHECK: define linkonce_odr void @_ZN2X2C1ERKS_(%struct.X2* %this, %struct.X2* dereferenceable({{[0-9]+}})) unnamed_addr
30*67e74705SXin Li   // CHECK:      call void @_ZN2X2C2ERKS_({{.*}}) [[NUW:#[0-9]+]]
31*67e74705SXin Li   // CHECK-NEXT: ret void
32*67e74705SXin Li   // CHECK-NEXT: }
33*67e74705SXin Li   X2 x2a(x2);
34*67e74705SXin Li   // CHECK: define linkonce_odr void @_ZN2X3C1ERKS_(%struct.X3* %this, %struct.X3* dereferenceable({{[0-9]+}})) unnamed_addr
35*67e74705SXin Li   // CHECK:      call void @_ZN2X3C2ERKS_({{.*}}) [[NUW]]
36*67e74705SXin Li   // CHECK-NEXT: ret void
37*67e74705SXin Li   // CHECK-NEXT: }
38*67e74705SXin Li   X3 x3a(x3);
39*67e74705SXin Li   // CHECK: define linkonce_odr void @_ZN2X5C1ERS_({{.*}}) unnamed_addr
40*67e74705SXin Li   // CHECK-NOT: call void @__cxa_call_unexpected
41*67e74705SXin Li   // CHECK: ret void
42*67e74705SXin Li   X5 x5a(x5);
43*67e74705SXin Li }
44*67e74705SXin Li 
45*67e74705SXin Li // Default constructor
46*67e74705SXin Li struct X6 {
47*67e74705SXin Li   X6() throw();
48*67e74705SXin Li };
49*67e74705SXin Li 
50*67e74705SXin Li struct X7 {
51*67e74705SXin Li   X7();
52*67e74705SXin Li };
53*67e74705SXin Li 
54*67e74705SXin Li struct X8 : X6 { };
55*67e74705SXin Li struct X9 : X6, X7 { };
56*67e74705SXin Li 
test()57*67e74705SXin Li void test() {
58*67e74705SXin Li   // CHECK: define linkonce_odr void @_ZN2X8C1Ev(%struct.X8* %this) unnamed_addr
59*67e74705SXin Li   // CHECK:      call void @_ZN2X8C2Ev({{.*}}) [[NUW]]
60*67e74705SXin Li   // CHECK-NEXT: ret void
61*67e74705SXin Li   X8();
62*67e74705SXin Li 
63*67e74705SXin Li   // CHECK: define linkonce_odr void @_ZN2X9C1Ev(%struct.X9* %this) unnamed_addr
64*67e74705SXin Li   //   FIXME: check that this is the end of the line here:
65*67e74705SXin Li   // CHECK:      call void @_ZN2X9C2Ev({{.*}})
66*67e74705SXin Li   // CHECK-NEXT: ret void
67*67e74705SXin Li   X9();
68*67e74705SXin Li 
69*67e74705SXin Li   // CHECK: define linkonce_odr void @_ZN2X8C2Ev(%struct.X8* %this) unnamed_addr
70*67e74705SXin Li   // CHECK:      call void @_ZN2X6C2Ev({{.*}}) [[NUW]]
71*67e74705SXin Li   // CHECK-NEXT: ret void
72*67e74705SXin Li 
73*67e74705SXin Li   // CHECK: define linkonce_odr void @_ZN2X9C2Ev(%struct.X9* %this) unnamed_addr
74*67e74705SXin Li   // CHECK:      call void @_ZN2X6C2Ev({{.*}}) [[NUW]]
75*67e74705SXin Li   //   FIXME: and here:
76*67e74705SXin Li   // CHECK-NEXT: bitcast
77*67e74705SXin Li   // CHECK-NEXT: call void @_ZN2X7C2Ev({{.*}})
78*67e74705SXin Li   // CHECK: ret void
79*67e74705SXin Li }
80*67e74705SXin Li 
81*67e74705SXin Li // CHECK: attributes [[NUW]] = { nounwind{{.*}} }
82