xref: /aosp_15_r20/external/clang/test/CodeGenCXX/vtable-key-function-ios.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=armv7-apple-darwin -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 %s -triple=armv7-apple-darwin -emit-llvm -o - | FileCheck -check-prefix=CHECK-LATE %s
3*67e74705SXin Li 
4*67e74705SXin Li // RUN: %clang_cc1 %s -triple=x86_64-pc-windows-gnu -emit-llvm -o - | FileCheck %s
5*67e74705SXin Li // RUN: %clang_cc1 %s -triple=x86_64-pc-windows-gnu -emit-llvm -o - | FileCheck -check-prefix=CHECK-LATE %s
6*67e74705SXin Li 
7*67e74705SXin Li // The 'a' variants ask for the vtable first.
8*67e74705SXin Li // The 'b' variants ask for the vtable second.
9*67e74705SXin Li // The 'c' variants ask for the vtable third.
10*67e74705SXin Li // We do a separate CHECK-LATE pass because the RTTI definition gets
11*67e74705SXin Li // changed after the fact, which causes reordering of the globals.
12*67e74705SXin Li 
13*67e74705SXin Li // These are not separated into namespaces because the way that Sema
14*67e74705SXin Li // currently reports namespaces to IR-generation (i.e., en masse for
15*67e74705SXin Li // the entire namespace at once) subverts the ordering that we're
16*67e74705SXin Li // trying to test.
17*67e74705SXin Li 
18*67e74705SXin Li namespace std { class type_info; }
19*67e74705SXin Li extern void use(const std::type_info &rtti);
20*67e74705SXin Li 
21*67e74705SXin Li /*** Test0a ******************************************************************/
22*67e74705SXin Li 
23*67e74705SXin Li struct Test0a {
24*67e74705SXin Li   Test0a();
25*67e74705SXin Li   virtual inline void foo();
26*67e74705SXin Li   virtual void bar();
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li // V-table should be defined externally.
Test0a()30*67e74705SXin Li Test0a::Test0a() { use(typeid(Test0a)); }
31*67e74705SXin Li // CHECK: @_ZTV6Test0a = external unnamed_addr constant
32*67e74705SXin Li // CHECK: @_ZTI6Test0a = external constant
33*67e74705SXin Li 
34*67e74705SXin Li // This is not a key function.
foo()35*67e74705SXin Li void Test0a::foo() {}
36*67e74705SXin Li 
37*67e74705SXin Li /*** Test0b ******************************************************************/
38*67e74705SXin Li 
39*67e74705SXin Li struct Test0b {
40*67e74705SXin Li   Test0b();
41*67e74705SXin Li   virtual inline void foo();
42*67e74705SXin Li   virtual void bar();
43*67e74705SXin Li };
44*67e74705SXin Li 
45*67e74705SXin Li // This is not a key function.
foo()46*67e74705SXin Li void Test0b::foo() {}
47*67e74705SXin Li 
48*67e74705SXin Li // V-table should be defined externally.
Test0b()49*67e74705SXin Li Test0b::Test0b() { use(typeid(Test0b)); }
50*67e74705SXin Li // CHECK: @_ZTV6Test0b = external unnamed_addr constant
51*67e74705SXin Li // CHECK: @_ZTI6Test0b = external constant
52*67e74705SXin Li 
53*67e74705SXin Li /*** Test1a ******************************************************************/
54*67e74705SXin Li 
55*67e74705SXin Li struct Test1a {
56*67e74705SXin Li   Test1a();
57*67e74705SXin Li   virtual void foo();
58*67e74705SXin Li   virtual void bar();
59*67e74705SXin Li };
60*67e74705SXin Li 
61*67e74705SXin Li // V-table needs to be defined weakly.
Test1a()62*67e74705SXin Li Test1a::Test1a() { use(typeid(Test1a)); }
63*67e74705SXin Li // CHECK:      @_ZTV6Test1a = linkonce_odr unnamed_addr constant
64*67e74705SXin Li // CHECK-LATE: @_ZTS6Test1a = linkonce_odr constant
65*67e74705SXin Li // CHECK-LATE: @_ZTI6Test1a = linkonce_odr constant
66*67e74705SXin Li 
67*67e74705SXin Li // This defines the key function.
foo()68*67e74705SXin Li inline void Test1a::foo() {}
69*67e74705SXin Li 
70*67e74705SXin Li /*** Test1b ******************************************************************/
71*67e74705SXin Li 
72*67e74705SXin Li struct Test1b {
73*67e74705SXin Li   Test1b();
74*67e74705SXin Li   virtual void foo();
75*67e74705SXin Li   virtual void bar();
76*67e74705SXin Li };
77*67e74705SXin Li 
78*67e74705SXin Li // This defines the key function.
foo()79*67e74705SXin Li inline void Test1b::foo() {}
80*67e74705SXin Li 
81*67e74705SXin Li // V-table should be defined weakly..
Test1b()82*67e74705SXin Li Test1b::Test1b() { use(typeid(Test1b)); }
83*67e74705SXin Li // CHECK: @_ZTV6Test1b = linkonce_odr unnamed_addr constant
84*67e74705SXin Li // CHECK: @_ZTS6Test1b = linkonce_odr constant
85*67e74705SXin Li // CHECK: @_ZTI6Test1b = linkonce_odr constant
86*67e74705SXin Li 
87*67e74705SXin Li /*** Test2a ******************************************************************/
88*67e74705SXin Li 
89*67e74705SXin Li struct Test2a {
90*67e74705SXin Li   Test2a();
91*67e74705SXin Li   virtual void foo();
92*67e74705SXin Li   virtual void bar();
93*67e74705SXin Li };
94*67e74705SXin Li 
95*67e74705SXin Li // V-table should be defined with weak linkage.
Test2a()96*67e74705SXin Li Test2a::Test2a() { use(typeid(Test2a)); }
97*67e74705SXin Li // CHECK:      @_ZTV6Test2a = linkonce_odr unnamed_addr constant
98*67e74705SXin Li // CHECK-LATE: @_ZTS6Test2a = linkonce_odr constant
99*67e74705SXin Li // CHECK-LATE: @_ZTI6Test2a = linkonce_odr constant
100*67e74705SXin Li 
bar()101*67e74705SXin Li void Test2a::bar() {}
foo()102*67e74705SXin Li inline void Test2a::foo() {}
103*67e74705SXin Li 
104*67e74705SXin Li /*** Test2b ******************************************************************/
105*67e74705SXin Li 
106*67e74705SXin Li struct Test2b {
107*67e74705SXin Li   Test2b();
108*67e74705SXin Li   virtual void foo();
109*67e74705SXin Li   virtual void bar();
110*67e74705SXin Li };
111*67e74705SXin Li 
bar()112*67e74705SXin Li void Test2b::bar() {}
113*67e74705SXin Li 
114*67e74705SXin Li // V-table should be defined with weak linkage.
Test2b()115*67e74705SXin Li Test2b::Test2b() { use(typeid(Test2b)); }
116*67e74705SXin Li // CHECK:      @_ZTV6Test2b = linkonce_odr unnamed_addr constant
117*67e74705SXin Li // CHECK-LATE: @_ZTS6Test2b = linkonce_odr constant
118*67e74705SXin Li // CHECK-LATE: @_ZTI6Test2b = linkonce_odr constant
119*67e74705SXin Li 
foo()120*67e74705SXin Li inline void Test2b::foo() {}
121*67e74705SXin Li 
122*67e74705SXin Li /*** Test2c ******************************************************************/
123*67e74705SXin Li 
124*67e74705SXin Li struct Test2c {
125*67e74705SXin Li   Test2c();
126*67e74705SXin Li   virtual void foo();
127*67e74705SXin Li   virtual void bar();
128*67e74705SXin Li };
129*67e74705SXin Li 
bar()130*67e74705SXin Li void Test2c::bar() {}
foo()131*67e74705SXin Li inline void Test2c::foo() {}
132*67e74705SXin Li 
133*67e74705SXin Li // V-table should be defined with weak linkage.
Test2c()134*67e74705SXin Li Test2c::Test2c() { use(typeid(Test2c)); }
135*67e74705SXin Li // CHECK: @_ZTV6Test2c = linkonce_odr unnamed_addr constant
136*67e74705SXin Li // CHECK: @_ZTS6Test2c = linkonce_odr constant
137*67e74705SXin Li // CHECK: @_ZTI6Test2c = linkonce_odr constant
138*67e74705SXin Li 
139*67e74705SXin Li /*** Test3a ******************************************************************/
140*67e74705SXin Li 
141*67e74705SXin Li struct Test3a {
142*67e74705SXin Li   Test3a();
143*67e74705SXin Li   virtual void foo();
144*67e74705SXin Li   virtual void bar();
145*67e74705SXin Li };
146*67e74705SXin Li 
147*67e74705SXin Li // V-table should be defined with weak linkage.
Test3a()148*67e74705SXin Li Test3a::Test3a() { use(typeid(Test3a)); }
149*67e74705SXin Li // CHECK:      @_ZTV6Test3a = linkonce_odr unnamed_addr constant
150*67e74705SXin Li // CHECK-LATE: @_ZTS6Test3a = linkonce_odr constant
151*67e74705SXin Li // CHECK-LATE: @_ZTI6Test3a = linkonce_odr constant
152*67e74705SXin Li 
153*67e74705SXin Li // This defines the key function.
bar()154*67e74705SXin Li inline void Test3a::bar() {}
foo()155*67e74705SXin Li inline void Test3a::foo() {}
156*67e74705SXin Li 
157*67e74705SXin Li /*** Test3b ******************************************************************/
158*67e74705SXin Li 
159*67e74705SXin Li struct Test3b {
160*67e74705SXin Li   Test3b();
161*67e74705SXin Li   virtual void foo();
162*67e74705SXin Li   virtual void bar();
163*67e74705SXin Li };
164*67e74705SXin Li 
bar()165*67e74705SXin Li inline void Test3b::bar() {}
166*67e74705SXin Li 
167*67e74705SXin Li // V-table should be defined with weak linkage.
Test3b()168*67e74705SXin Li Test3b::Test3b() { use(typeid(Test3b)); }
169*67e74705SXin Li // CHECK:      @_ZTV6Test3b = linkonce_odr unnamed_addr constant
170*67e74705SXin Li // CHECK-LATE: @_ZTS6Test3b = linkonce_odr constant
171*67e74705SXin Li // CHECK-LATE: @_ZTI6Test3b = linkonce_odr constant
172*67e74705SXin Li 
173*67e74705SXin Li // This defines the key function.
foo()174*67e74705SXin Li inline void Test3b::foo() {}
175*67e74705SXin Li 
176*67e74705SXin Li /*** Test3c ******************************************************************/
177*67e74705SXin Li 
178*67e74705SXin Li struct Test3c {
179*67e74705SXin Li   Test3c();
180*67e74705SXin Li   virtual void foo();
181*67e74705SXin Li   virtual void bar();
182*67e74705SXin Li };
183*67e74705SXin Li 
184*67e74705SXin Li // This defines the key function.
bar()185*67e74705SXin Li inline void Test3c::bar() {}
foo()186*67e74705SXin Li inline void Test3c::foo() {}
187*67e74705SXin Li 
188*67e74705SXin Li // V-table should be defined with weak linkage.
Test3c()189*67e74705SXin Li Test3c::Test3c() { use(typeid(Test3c)); }
190*67e74705SXin Li // CHECK: @_ZTV6Test3c = linkonce_odr unnamed_addr constant
191*67e74705SXin Li // CHECK: @_ZTS6Test3c = linkonce_odr constant
192*67e74705SXin Li // CHECK: @_ZTI6Test3c = linkonce_odr constant
193