1) emit base destructors as aliases to their unique base class destructors under some careful conditions. This is enabled for the same targets that can support complete-to-base aliases, i.e. not darwin. 2) Emit non-variadic complete constructors for classes with no virtual bases as calls to the base constructor. This is enabled on all targets and in theory can trigger in situations that the alias optimization can't (mostly involving virtual bases, mostly not yet supported). These are bundled together because I didn't think it worthwhile to split them, not because they really need to be. llvm-svn: 96842
66 lines
1.1 KiB
C++
66 lines
1.1 KiB
C++
// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
|
|
|
|
// PR5484
|
|
namespace PR5484 {
|
|
struct A { };
|
|
extern A a;
|
|
|
|
void f(const A & = a);
|
|
|
|
void g() {
|
|
f();
|
|
}
|
|
}
|
|
|
|
struct A1 {
|
|
A1();
|
|
~A1();
|
|
};
|
|
|
|
struct A2 {
|
|
A2();
|
|
~A2();
|
|
};
|
|
|
|
struct B {
|
|
B(const A1& = A1(), const A2& = A2());
|
|
};
|
|
|
|
// CHECK: define void @_Z2f1v()
|
|
void f1() {
|
|
|
|
// CHECK: call void @_ZN2A1C1Ev(
|
|
// CHECK: call void @_ZN2A2C1Ev(
|
|
// CHECK: call void @_ZN1BC1ERK2A1RK2A2(
|
|
// CHECK: call void @_ZN2A2D1Ev
|
|
// CHECK: call void @_ZN2A1D1Ev
|
|
B bs[2];
|
|
}
|
|
|
|
struct C {
|
|
B bs[2];
|
|
C();
|
|
};
|
|
|
|
// CHECK: define void @_ZN1CC1Ev(
|
|
// CHECK: call void @_ZN1CC2Ev(
|
|
|
|
// CHECK: define void @_ZN1CC2Ev(
|
|
// CHECK: call void @_ZN2A1C1Ev(
|
|
// CHECK: call void @_ZN2A2C1Ev(
|
|
// CHECK: call void @_ZN1BC1ERK2A1RK2A2(
|
|
// CHECK: call void @_ZN2A2D1Ev
|
|
// CHECK: call void @_ZN2A1D1Ev
|
|
C::C() { }
|
|
|
|
// CHECK: define void @_Z2f3v()
|
|
void f3() {
|
|
// CHECK: call void @_ZN2A1C1Ev(
|
|
// CHECK: call void @_ZN2A2C1Ev(
|
|
// CHECK: call void @_ZN1BC1ERK2A1RK2A2(
|
|
// CHECK: call void @_ZN2A2D1Ev
|
|
// CHECK: call void @_ZN2A1D1Ev
|
|
B *bs = new B[2];
|
|
delete bs;
|
|
}
|