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