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 Livoid 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 Livoid 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