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