xref: /aosp_15_r20/external/clang/test/CodeGenCXX/microsoft-abi-structors-alias.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o - -triple=i386-pc-win32 -fno-rtti -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace test1 {
4*67e74705SXin Li template <typename T> class A {
~A()5*67e74705SXin Li   ~A() {}
6*67e74705SXin Li };
7*67e74705SXin Li template class A<char>;
8*67e74705SXin Li // CHECK-DAG: define weak_odr x86_thiscallcc void @"\01??1?$A@D@test1@@AAE@XZ"
9*67e74705SXin Li }
10*67e74705SXin Li 
11*67e74705SXin Li namespace test2 {
12*67e74705SXin Li struct A {
13*67e74705SXin Li   virtual ~A();
14*67e74705SXin Li };
15*67e74705SXin Li struct B : A {
16*67e74705SXin Li   B();
17*67e74705SXin Li   virtual ~B();
18*67e74705SXin Li };
19*67e74705SXin Li 
~A()20*67e74705SXin Li A::~A() {}
~B()21*67e74705SXin Li B::~B() {}
foo()22*67e74705SXin Li void foo() {
23*67e74705SXin Li   B b;
24*67e74705SXin Li }
25*67e74705SXin Li // CHECK-DAG: @"\01??1B@test2@@UAE@XZ" = alias void (%"struct.test2::B"*), bitcast (void (%"struct.test2::A"*)* @"\01??1A@test2@@UAE@XZ" to void (%"struct.test2::B"*)*)
26*67e74705SXin Li }
27*67e74705SXin Li 
28*67e74705SXin Li namespace test3 {
29*67e74705SXin Li struct A { virtual ~A(); };
~A()30*67e74705SXin Li A::~A() {}
31*67e74705SXin Li }
32*67e74705SXin Li // CHECK-DAG: define x86_thiscallcc void @"\01??1A@test3@@UAE@XZ"(
33*67e74705SXin Li namespace test3 {
34*67e74705SXin Li template <typename T>
35*67e74705SXin Li struct B : A {
~Btest3::B36*67e74705SXin Li   virtual ~B() { }
37*67e74705SXin Li };
38*67e74705SXin Li template struct B<int>;
39*67e74705SXin Li }
40*67e74705SXin Li // This has to be weak, and emitting weak aliases is fragile, so we don't do the
41*67e74705SXin Li // aliasing.
42*67e74705SXin Li // CHECK-DAG: define weak_odr x86_thiscallcc void @"\01??1?$B@H@test3@@UAE@XZ"(
43