10d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fexceptions -o - %s | FileCheck %s
20d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor
3eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor// Copy constructor
40d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregorstruct X0 {
50d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X0();
60d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X0(const X0 &) throw();
70d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X0(X0 &);
80d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor};
90d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor
100d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregorstruct X1 {
110d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X1();
120d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X1(const X1 &) throw();
130d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor};
140d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor
150d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregorstruct X2 : X1 {
160d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X2();
170d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor};
180d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregorstruct X3 : X0, X1 {
190d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X3();
200d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor};
210d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor
220d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregorstruct X4 {
230d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X4(X4 &) throw();
240d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor};
250d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor
260d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregorstruct X5 : X0, X4 { };
270d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor
280d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregorvoid test(X2 x2, X3 x3, X5 x5) {
29ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: define linkonce_odr void @_ZN2X2C1ERKS_(%struct.X2* %this, %struct.X2* nonnull) unnamed_addr
304e1125f630e75a52209b928e9d43b638abf39987Bill Wendling  // CHECK:      call void @_ZN2X2C2ERKS_({{.*}}) [[NUW:#[0-9]+]]
319c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: ret void
329c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: }
330d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X2 x2a(x2);
34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK: define linkonce_odr void @_ZN2X3C1ERKS_(%struct.X3* %this, %struct.X3* nonnull) unnamed_addr
354e1125f630e75a52209b928e9d43b638abf39987Bill Wendling  // CHECK:      call void @_ZN2X3C2ERKS_({{.*}}) [[NUW]]
369c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: ret void
379c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: }
380d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X3 x3a(x3);
390691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola  // CHECK: define linkonce_odr void @_ZN2X5C1ERS_({{.*}}) unnamed_addr
400d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  // CHECK-NOT: call void @__cxa_call_unexpected
410d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  // CHECK: ret void
420d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X5 x5a(x5);
430d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor}
44eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor
45eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor// Default constructor
46eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregorstruct X6 {
47eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor  X6() throw();
48eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor};
49eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor
50eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregorstruct X7 {
51eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor  X7();
52eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor};
53eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor
54eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregorstruct X8 : X6 { };
55eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregorstruct X9 : X6, X7 { };
56eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor
57eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregorvoid test() {
589cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK: define linkonce_odr void @_ZN2X8C1Ev(%struct.X8* %this) unnamed_addr
594e1125f630e75a52209b928e9d43b638abf39987Bill Wendling  // CHECK:      call void @_ZN2X8C2Ev({{.*}}) [[NUW]]
609c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: ret void
61eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor  X8();
6239dbad9b67cd9e36b9cd3b48a16caf7e4461211eJohn McCall
639cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK: define linkonce_odr void @_ZN2X9C1Ev(%struct.X9* %this) unnamed_addr
6439dbad9b67cd9e36b9cd3b48a16caf7e4461211eJohn McCall  //   FIXME: check that this is the end of the line here:
6539dbad9b67cd9e36b9cd3b48a16caf7e4461211eJohn McCall  // CHECK:      call void @_ZN2X9C2Ev({{.*}})
669c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: ret void
67eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor  X9();
689c0c1f333ab8f5a3da055b99ee94778689face17John McCall
699cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK: define linkonce_odr void @_ZN2X9C2Ev(%struct.X9* %this) unnamed_addr
704e1125f630e75a52209b928e9d43b638abf39987Bill Wendling  // CHECK:      call void @_ZN2X6C2Ev({{.*}}) [[NUW]]
7139dbad9b67cd9e36b9cd3b48a16caf7e4461211eJohn McCall  //   FIXME: and here:
729cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK-NEXT: bitcast
7339dbad9b67cd9e36b9cd3b48a16caf7e4461211eJohn McCall  // CHECK-NEXT: call void @_ZN2X7C2Ev({{.*}})
749c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK: ret void
759c0c1f333ab8f5a3da055b99ee94778689face17John McCall
769cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK: define linkonce_odr void @_ZN2X8C2Ev(%struct.X8* %this) unnamed_addr
774e1125f630e75a52209b928e9d43b638abf39987Bill Wendling  // CHECK:      call void @_ZN2X6C2Ev({{.*}}) [[NUW]]
789c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: ret void
79eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor}
804e1125f630e75a52209b928e9d43b638abf39987Bill Wendling
814e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: attributes [[NUW]] = { nounwind{{.*}} }
82