xref: /aosp_15_r20/external/clang/test/CodeGenCXX/microsoft-abi-vftables.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -fno-rtti -triple=i386-pc-win32 -fms-extensions -emit-llvm -o - -O1 -disable-llvm-optzns | FileCheck %s -check-prefix=NO-RTTI
2*67e74705SXin Li // RUN: %clang_cc1 %s -triple=i386-pc-win32 -fms-extensions -emit-llvm -o - -O1 -disable-llvm-optzns | FileCheck %s -check-prefix=RTTI
3*67e74705SXin Li 
4*67e74705SXin Li // RTTI-DAG: $"\01??_7S@@6B@" = comdat largest
5*67e74705SXin Li // RTTI-DAG: $"\01??_7V@@6B@" = comdat largest
6*67e74705SXin Li 
7*67e74705SXin Li struct S {
8*67e74705SXin Li   virtual ~S();
9*67e74705SXin Li } s;
10*67e74705SXin Li 
11*67e74705SXin Li // RTTI-DAG: [[VTABLE_S:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast ({{.*}} @"\01??_R4S@@6B@" to i8*), i8* bitcast ({{.*}} @"\01??_GS@@UAEPAXI@Z" to i8*)], comdat($"\01??_7S@@6B@")
12*67e74705SXin Li // RTTI-DAG: @"\01??_7S@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ([2 x i8*], [2 x i8*]* [[VTABLE_S]], i32 0, i32 1)
13*67e74705SXin Li 
14*67e74705SXin Li // NO-RTTI-DAG: @"\01??_7S@@6B@" = linkonce_odr unnamed_addr constant [1 x i8*] [i8* bitcast ({{.*}} @"\01??_GS@@UAEPAXI@Z" to i8*)]
15*67e74705SXin Li 
16*67e74705SXin Li struct __declspec(dllimport) U {
17*67e74705SXin Li   virtual ~U();
18*67e74705SXin Li } u;
19*67e74705SXin Li 
20*67e74705SXin Li // RTTI-DAG: [[VTABLE_U:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast ({{.*}} @"\01??_R4U@@6B@" to i8*), i8* bitcast ({{.*}} @"\01??_GU@@UAEPAXI@Z" to i8*)]
21*67e74705SXin Li // RTTI-DAG: @"\01??_SU@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ([2 x i8*], [2 x i8*]* [[VTABLE_U]], i32 0, i32 1)
22*67e74705SXin Li 
23*67e74705SXin Li // NO-RTTI-DAG: @"\01??_SU@@6B@" = linkonce_odr unnamed_addr constant [1 x i8*] [i8* bitcast ({{.*}} @"\01??_GU@@UAEPAXI@Z" to i8*)]
24*67e74705SXin Li 
25*67e74705SXin Li struct __declspec(dllexport) V {
26*67e74705SXin Li   virtual ~V();
27*67e74705SXin Li } v;
28*67e74705SXin Li 
29*67e74705SXin Li // RTTI-DAG: [[VTABLE_V:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast ({{.*}} @"\01??_R4V@@6B@" to i8*), i8* bitcast ({{.*}} @"\01??_GV@@UAEPAXI@Z" to i8*)], comdat($"\01??_7V@@6B@")
30*67e74705SXin Li // RTTI-DAG: @"\01??_7V@@6B@" = dllexport unnamed_addr alias i8*, getelementptr inbounds ([2 x i8*], [2 x i8*]* [[VTABLE_V]], i32 0, i32 1)
31*67e74705SXin Li 
32*67e74705SXin Li // NO-RTTI-DAG: @"\01??_7V@@6B@" = weak_odr dllexport unnamed_addr constant [1 x i8*] [i8* bitcast ({{.*}} @"\01??_GV@@UAEPAXI@Z" to i8*)]
33*67e74705SXin Li 
34*67e74705SXin Li namespace {
35*67e74705SXin Li struct W {
~W__anonfd96ce850111::W36*67e74705SXin Li   virtual ~W() {}
37*67e74705SXin Li } w;
38*67e74705SXin Li }
39*67e74705SXin Li // RTTI-DAG: [[VTABLE_W:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast ({{.*}} @"\01??_R4W@?A@@6B@" to i8*), i8* bitcast ({{.*}} @"\01??_GW@?A@@UAEPAXI@Z" to i8*)]
40*67e74705SXin Li // RTTI-DAG: @"\01??_7W@?A@@6B@" = internal unnamed_addr alias i8*, getelementptr inbounds ([2 x i8*], [2 x i8*]* [[VTABLE_W]], i32 0, i32 1)
41*67e74705SXin Li 
42*67e74705SXin Li // NO-RTTI-DAG: @"\01??_7W@?A@@6B@" = internal unnamed_addr constant [1 x i8*] [i8* bitcast ({{.*}} @"\01??_GW@?A@@UAEPAXI@Z" to i8*)]
43*67e74705SXin Li 
44*67e74705SXin Li struct X {};
45*67e74705SXin Li template <class> struct Y : virtual X {
YY46*67e74705SXin Li   Y() {}
47*67e74705SXin Li   virtual ~Y();
48*67e74705SXin Li };
49*67e74705SXin Li 
50*67e74705SXin Li extern template class Y<int>;
51*67e74705SXin Li template Y<int>::Y();
52*67e74705SXin Li // RTTI-DAG: [[VTABLE_Y:@.*]] = private unnamed_addr constant [2 x i8*] [i8* bitcast (%rtti.CompleteObjectLocator* @"\01??_R4?$Y@H@@6B@" to i8*), i8* bitcast (i8* (%struct.Y*, i32)* @"\01??_G?$Y@H@@UAEPAXI@Z" to i8*)], comdat($"\01??_7?$Y@H@@6B@")
53*67e74705SXin Li // RTTI-DAG: @"\01??_7?$Y@H@@6B@" = unnamed_addr alias i8*, getelementptr inbounds ([2 x i8*], [2 x i8*]* [[VTABLE_Y]], i32 0, i32 1)
54*67e74705SXin Li 
55*67e74705SXin Li // NO-RTTI-DAG: @"\01??_7?$Y@H@@6B@" = linkonce_odr unnamed_addr constant [1 x i8*] [i8* bitcast (i8* (%struct.Y*, i32)* @"\01??_G?$Y@H@@UAEPAXI@Z" to i8*)], comdat
56