p14-ir.cpp revision 0691a5c83246604a89654e0dfc25870e742035b4
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) {
290691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola  // CHECK: define linkonce_odr void @_ZN2X2C1ERKS_(%struct.X0* %this, %struct.X0*) unnamed_addr
309c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK:      call void @_ZN2X2C2ERKS_({{.*}}) nounwind
319c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: ret void
329c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: }
330d405db2d847acba979a74d747894bcf4d580fe3Douglas Gregor  X2 x2a(x2);
340691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola  // CHECK: define linkonce_odr void @_ZN2X3C1ERKS_(%struct.X0* %this, %struct.X0*) unnamed_addr
359c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK:      call void @_ZN2X3C2ERKS_({{.*}}) nounwind
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() {
580691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola  // CHECK: define linkonce_odr void @_ZN2X8C1Ev(%struct.X0* %this) unnamed_addr
599c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK:      call void @_ZN2X8C2Ev({{.*}}) nounwind
609c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: ret void
61eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor  X8();
6239dbad9b67cd9e36b9cd3b48a16caf7e4461211eJohn McCall
630691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola  // CHECK: define linkonce_odr void @_ZN2X9C1Ev(%struct.X0* %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
690691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola  // CHECK: define linkonce_odr void @_ZN2X9C2Ev(%struct.X0* %this) unnamed_addr
709c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK:      call void @_ZN2X6C2Ev({{.*}}) nounwind
7139dbad9b67cd9e36b9cd3b48a16caf7e4461211eJohn McCall  //   FIXME: and here:
7239dbad9b67cd9e36b9cd3b48a16caf7e4461211eJohn McCall  // CHECK-NEXT: call void @_ZN2X7C2Ev({{.*}})
739c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK: ret void
749c0c1f333ab8f5a3da055b99ee94778689face17John McCall
750691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola  // CHECK: define linkonce_odr void @_ZN2X8C2Ev(%struct.X0* %this) unnamed_addr
769c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK:      call void @_ZN2X6C2Ev({{.*}}) nounwind
779c0c1f333ab8f5a3da055b99ee94778689face17John McCall  // CHECK-NEXT: ret void
78eb8c670d2949eb62005eca36c64c9461f2a2173eDouglas Gregor}
79