1 // 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.
7 // We do a separate CHECK-LATE pass because the RTTI defintion gets
8 // 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 
15 namespace std { class type_info; }
16 extern void use(const std::type_info &rtti);
17 
18 /*** Test0a ******************************************************************/
19 
20 struct Test0a {
21   Test0a();
22   virtual inline void foo();
23   virtual void bar();
24 };
25 
26 // V-table should be defined externally.
27 Test0a::Test0a() { use(typeid(Test0a)); }
28 // CHECK: @_ZTV6Test0a = external unnamed_addr constant
29 // CHECK: @_ZTI6Test0a = external constant
30 
31 // This is not a key function.
32 void Test0a::foo() {}
33 
34 /*** Test0b ******************************************************************/
35 
36 struct Test0b {
37   Test0b();
38   virtual inline void foo();
39   virtual void bar();
40 };
41 
42 // This is not a key function.
43 void Test0b::foo() {}
44 
45 // V-table should be defined externally.
46 Test0b::Test0b() { use(typeid(Test0b)); }
47 // CHECK: @_ZTV6Test0b = external unnamed_addr constant
48 // CHECK: @_ZTI6Test0b = external constant
49 
50 /*** Test1a ******************************************************************/
51 
52 struct Test1a {
53   Test1a();
54   virtual void foo();
55   virtual void bar();
56 };
57 
58 // V-table needs to be defined weakly.
59 Test1a::Test1a() { use(typeid(Test1a)); }
60 // CHECK:      @_ZTV6Test1a = linkonce_odr unnamed_addr constant
61 // CHECK-LATE: @_ZTS6Test1a = linkonce_odr constant
62 // CHECK-LATE: @_ZTI6Test1a = linkonce_odr unnamed_addr constant
63 
64 // This defines the key function.
65 inline void Test1a::foo() {}
66 
67 /*** Test1b ******************************************************************/
68 
69 struct Test1b {
70   Test1b();
71   virtual void foo();
72   virtual void bar();
73 };
74 
75 // This defines the key function.
76 inline void Test1b::foo() {}
77 
78 // V-table should be defined weakly..
79 Test1b::Test1b() { use(typeid(Test1b)); }
80 // CHECK: @_ZTV6Test1b = linkonce_odr unnamed_addr constant
81 // CHECK: @_ZTS6Test1b = linkonce_odr constant
82 // CHECK: @_ZTI6Test1b = linkonce_odr unnamed_addr constant
83 
84 /*** Test2a ******************************************************************/
85 
86 struct Test2a {
87   Test2a();
88   virtual void foo();
89   virtual void bar();
90 };
91 
92 // V-table should be defined with weak linkage.
93 Test2a::Test2a() { use(typeid(Test2a)); }
94 // CHECK:      @_ZTV6Test2a = linkonce_odr unnamed_addr constant
95 // CHECK-LATE: @_ZTS6Test2a = linkonce_odr constant
96 // CHECK-LATE: @_ZTI6Test2a = linkonce_odr unnamed_addr constant
97 
98 void Test2a::bar() {}
99 inline void Test2a::foo() {}
100 
101 /*** Test2b ******************************************************************/
102 
103 struct Test2b {
104   Test2b();
105   virtual void foo();
106   virtual void bar();
107 };
108 
109 void Test2b::bar() {}
110 
111 // V-table should be defined with weak linkage.
112 Test2b::Test2b() { use(typeid(Test2b)); }
113 // CHECK:      @_ZTV6Test2b = linkonce_odr unnamed_addr constant
114 // CHECK-LATE: @_ZTS6Test2b = linkonce_odr constant
115 // CHECK-LATE: @_ZTI6Test2b = linkonce_odr unnamed_addr constant
116 
117 inline void Test2b::foo() {}
118 
119 /*** Test2c ******************************************************************/
120 
121 struct Test2c {
122   Test2c();
123   virtual void foo();
124   virtual void bar();
125 };
126 
127 void Test2c::bar() {}
128 inline void Test2c::foo() {}
129 
130 // V-table should be defined with weak linkage.
131 Test2c::Test2c() { use(typeid(Test2c)); }
132 // CHECK: @_ZTV6Test2c = linkonce_odr unnamed_addr constant
133 // CHECK: @_ZTS6Test2c = linkonce_odr constant
134 // CHECK: @_ZTI6Test2c = linkonce_odr unnamed_addr constant
135 
136 /*** Test3a ******************************************************************/
137 
138 struct Test3a {
139   Test3a();
140   virtual void foo();
141   virtual void bar();
142 };
143 
144 // V-table should be defined with weak linkage.
145 Test3a::Test3a() { use(typeid(Test3a)); }
146 // CHECK:      @_ZTV6Test3a = linkonce_odr unnamed_addr constant
147 // CHECK-LATE: @_ZTS6Test3a = linkonce_odr constant
148 // CHECK-LATE: @_ZTI6Test3a = linkonce_odr unnamed_addr constant
149 
150 // This defines the key function.
151 inline void Test3a::bar() {}
152 inline void Test3a::foo() {}
153 
154 /*** Test3b ******************************************************************/
155 
156 struct Test3b {
157   Test3b();
158   virtual void foo();
159   virtual void bar();
160 };
161 
162 inline void Test3b::bar() {}
163 
164 // V-table should be defined with weak linkage.
165 Test3b::Test3b() { use(typeid(Test3b)); }
166 // CHECK:      @_ZTV6Test3b = linkonce_odr unnamed_addr constant
167 // CHECK-LATE: @_ZTS6Test3b = linkonce_odr constant
168 // CHECK-LATE: @_ZTI6Test3b = linkonce_odr unnamed_addr constant
169 
170 // This defines the key function.
171 inline void Test3b::foo() {}
172 
173 /*** Test3c ******************************************************************/
174 
175 struct Test3c {
176   Test3c();
177   virtual void foo();
178   virtual void bar();
179 };
180 
181 // This defines the key function.
182 inline void Test3c::bar() {}
183 inline void Test3c::foo() {}
184 
185 // V-table should be defined with weak linkage.
186 Test3c::Test3c() { use(typeid(Test3c)); }
187 // CHECK: @_ZTV6Test3c = linkonce_odr unnamed_addr constant
188 // CHECK: @_ZTS6Test3c = linkonce_odr constant
189 // CHECK: @_ZTI6Test3c = linkonce_odr unnamed_addr constant
190