comparison clang/test/Modules/odr_hash.mm @ 150:1d019706d866

LLVM10
author anatofuz
date Thu, 13 Feb 2020 15:10:13 +0900
parents
children c4bab56944e8
comparison
equal deleted inserted replaced
147:c2174574ed3a 150:1d019706d866
1 // Clear and create directories
2 // RUN: rm -rf %t
3 // RUN: mkdir %t
4 // RUN: mkdir %t/cache
5 // RUN: mkdir %t/Inputs
6
7 // Build first header file
8 // RUN: echo "#define FIRST" >> %t/Inputs/first.h
9 // RUN: cat %s >> %t/Inputs/first.h
10
11 // Build second header file
12 // RUN: echo "#define SECOND" >> %t/Inputs/second.h
13 // RUN: cat %s >> %t/Inputs/second.h
14
15 // Test that each header can compile
16 // RUN: %clang_cc1 -fsyntax-only -x objective-c++ %t/Inputs/first.h -fblocks -fobjc-arc
17 // RUN: %clang_cc1 -fsyntax-only -x objective-c++ %t/Inputs/second.h -fblocks -fobjc-arc
18
19 // Build module map file
20 // RUN: echo "module FirstModule {" >> %t/Inputs/module.map
21 // RUN: echo " header \"first.h\"" >> %t/Inputs/module.map
22 // RUN: echo "}" >> %t/Inputs/module.map
23 // RUN: echo "module SecondModule {" >> %t/Inputs/module.map
24 // RUN: echo " header \"second.h\"" >> %t/Inputs/module.map
25 // RUN: echo "}" >> %t/Inputs/module.map
26
27 // Run test
28 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -x objective-c++ -I%t/Inputs -verify %s -fblocks -fobjc-arc
29
30 #if !defined(FIRST) && !defined(SECOND)
31 #include "first.h"
32 #include "second.h"
33 #endif
34
35 #if defined(FIRST) || defined(SECOND)
36 @protocol P1
37 @end
38
39 @protocol P2
40 @end
41
42 @interface I1
43 @end
44
45 @interface I2 : I1
46 @end
47
48 @interface Interface1 <T : I1 *> {
49 @public
50 T<P1> x;
51 }
52 @end
53
54 @interface Interface2 <T : I1 *>
55 @end
56
57 @interface Interface3 <T : I1 *>
58 @end
59
60 @interface EmptySelectorSlot
61 - (void)method:(int)arg;
62 - (void)method:(int)arg :(int)empty;
63
64 - (void)multiple:(int)arg1 args:(int)arg2 :(int)arg3;
65 - (void)multiple:(int)arg1 :(int)arg2 args:(int)arg3;
66 @end
67
68 #endif
69
70 #if defined(FIRST)
71 struct S {
72 Interface1 *I;
73 decltype(I->x) x;
74 int y;
75 };
76 #elif defined(SECOND)
77 struct S {
78 Interface1 *I;
79 decltype(I->x) x;
80 bool y;
81 };
82 #else
83 S s;
84 // expected-error@second.h:* {{'S::y' from module 'SecondModule' is not present in definition of 'S' in module 'FirstModule'}}
85 // expected-note@first.h:* {{declaration of 'y' does not match}}
86 #endif
87
88 namespace Types {
89 namespace Attributed {
90 #if defined(FIRST)
91 void invalid1() {
92 static double __attribute((objc_gc(strong))) *x;
93 }
94 void invalid2() {
95 static int __attribute((objc_gc(strong))) *x;
96 }
97 void valid() {
98 static int __attribute((objc_gc(strong))) *x;
99 }
100 #elif defined(SECOND)
101 void invalid1() {
102 static int __attribute((objc_gc(strong))) *x;
103 }
104 void invalid2() {
105 static int __attribute((objc_gc(weak))) *x;
106 }
107 void valid() {
108 static int __attribute((objc_gc(strong))) *x;
109 }
110 #else
111 auto function1 = invalid1;
112 // expected-error@second.h:* {{Types::Attributed::invalid1' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
113 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
114 auto function2 = invalid2;
115 // expected-error@second.h:* {{'Types::Attributed::invalid2' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
116 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
117 auto function3 = valid;
118 #endif
119 } // namespace Attributed
120
121 namespace BlockPointer {
122 #if defined(FIRST)
123 void invalid1() {
124 void (^x)(int);
125 }
126 void invalid2() {
127 void (^x)(int);
128 }
129 void invalid3() {
130 void (^x)(int);
131 }
132 void invalid4() {
133 void (^x)(int);
134 }
135 void valid() {
136 void (^x1)(int);
137 int (^x2)(int);
138 void (^x3)(int, int);
139 void (^x4)(short);
140 }
141 #elif defined(SECOND)
142 void invalid1() {
143 void (^x)();
144 }
145 void invalid2() {
146 void (^x)(int, int);
147 }
148 void invalid3() {
149 int (^x)(int);
150 }
151 void invalid4() {
152 void (^x)(float);
153 }
154 void valid() {
155 void (^x1)(int);
156 int (^x2)(int);
157 void (^x3)(int, int);
158 void (^x4)(short);
159 }
160 #else
161 auto function1 = invalid1;
162 // expected-error@second.h:* {{'Types::BlockPointer::invalid1' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
163 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
164 auto function2 = invalid2;
165 // expected-error@second.h:* {{'Types::BlockPointer::invalid2' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
166 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
167 auto function3 = invalid3;
168 // expected-error@second.h:* {{'Types::BlockPointer::invalid3' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
169 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
170 auto function4 = invalid4;
171 // expected-error@second.h:* {{'Types::BlockPointer::invalid4' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
172 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
173 auto function5 = valid;
174 #endif
175 } // namespace BlockPointer
176
177 namespace ObjCObject {
178 #if defined(FIRST)
179 struct Invalid1 {
180 using T = Interface2<I1*>;
181 };
182 struct Invalid2 {
183 using T = Interface2<I1*>;
184 };
185 struct Invalid3 {
186 using T = Interface2<P1, P1>;
187 };
188 struct Invalid4 {
189 using T = Interface2<P1>;
190 };
191 struct Valid {
192 using T1 = Interface2<I1*>;
193 using T2 = Interface3<I1*>;
194 using T3 = Interface2<P1>;
195 using T4 = Interface3<P1, P2>;
196 using T5 = __kindof Interface2;
197 };
198 #elif defined(SECOND)
199 struct Invalid1 {
200 using T = Interface3<I1*>;
201 };
202 struct Invalid2 {
203 using T = Interface2<I2*>;
204 };
205 struct Invalid3 {
206 using T = Interface2<P1>;
207 };
208 struct Invalid4 {
209 using T = Interface2<P2>;
210 };
211 struct Valid {
212 using T1 = Interface2<I1*>;
213 using T2 = Interface3<I1*>;
214 using T3 = Interface2<P1>;
215 using T4 = Interface3<P1, P2>;
216 using T5 = __kindof Interface2;
217 };
218 #else
219 Invalid1 i1;
220 // expected-error@first.h:* {{'Types::ObjCObject::Invalid1::T' from module 'FirstModule' is not present in definition of 'Types::ObjCObject::Invalid1' in module 'SecondModule'}}
221 // expected-note@second.h:* {{declaration of 'T' does not match}}
222 Invalid2 i2;
223 // expected-error@first.h:* {{'Types::ObjCObject::Invalid2::T' from module 'FirstModule' is not present in definition of 'Types::ObjCObject::Invalid2' in module 'SecondModule'}}
224 // expected-note@second.h:* {{declaration of 'T' does not match}}
225 Invalid3 i3;
226 // expected-error@second.h:* {{'Types::ObjCObject::Invalid3' has different definitions in different modules; first difference is definition in module 'SecondModule' found type alias 'T' with underlying type 'Interface2<P1>'}}
227 // expected-note@first.h:* {{but in 'FirstModule' found type alias 'T' with different underlying type 'Interface2<P1,P1>'}}
228 Invalid4 i4;
229 // expected-error@first.h:* {{'Types::ObjCObject::Invalid4::T' from module 'FirstModule' is not present in definition of 'Types::ObjCObject::Invalid4' in module 'SecondModule'}}
230 // expected-note@second.h:* {{declaration of 'T' does not match}}
231 Valid v;
232 #endif
233 } // namespace VisitObjCObject
234 } // namespace Types
235
236 #if defined(FIRST)
237 @interface Interface4 <T : I1 *> {
238 @public
239 T<P1> x;
240 }
241 @end
242 @interface Interface5 <T : I1 *> {
243 @public
244 T<P1> x;
245 }
246 @end
247 @interface Interface6 <T1 : I1 *, T2 : I2 *> {
248 @public
249 T1 x;
250 }
251 @end
252 #elif defined(SECOND)
253 @interface Interface4 <T : I1 *> {
254 @public
255 T<P2> x;
256 }
257 @end
258 @interface Interface5 <T : I1 *> {
259 @public
260 T<P1, P2> x;
261 }
262 @end
263 @interface Interface6 <T1 : I1 *, T2 : I2 *> {
264 @public
265 T2 x;
266 }
267 @end
268 #endif
269
270 namespace Types {
271 namespace ObjCTypeParam {
272 #if defined(FIRST) || defined(SECOND)
273 struct Invalid1 {
274 Interface4 *I;
275 decltype(I->x) x;
276 };
277 struct Invalid2 {
278 Interface5 *I;
279 decltype(I->x) x;
280 };
281 struct Invalid3 {
282 Interface6 *I;
283 decltype(I->x) x;
284 };
285 #else
286 Invalid1 i1;
287 // expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid1::x' from module 'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid1' in module 'SecondModule'}}
288 // expected-note@second.h:* {{declaration of 'x' does not match}}
289 Invalid2 i2;
290 // expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid2::x' from module 'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid2' in module 'SecondModule'}}
291 // expected-note@second.h:* {{declaration of 'x' does not match}}
292 Invalid3 i3;
293 // expected-error@first.h:* {{'Types::ObjCTypeParam::Invalid3::x' from module 'FirstModule' is not present in definition of 'Types::ObjCTypeParam::Invalid3' in module 'SecondModule'}}
294 // expected-note@second.h:* {{declaration of 'x' does not match}}
295 #endif
296
297 } // namespace ObjCTypeParam
298 } // namespace Types
299
300 namespace CallMethods {
301 #if defined(FIRST)
302 void invalid1(EmptySelectorSlot *obj) {
303 [obj method:0];
304 }
305 void invalid2(EmptySelectorSlot *obj) {
306 [obj multiple:0 args:0 :0];
307 }
308 #elif defined(SECOND)
309 void invalid1(EmptySelectorSlot *obj) {
310 [obj method:0 :0];
311 }
312 void invalid2(EmptySelectorSlot *obj) {
313 [obj multiple:0 :0 args:0];
314 }
315 #endif
316 // expected-error@second.h:* {{'CallMethods::invalid1' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
317 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
318
319 // expected-error@second.h:* {{'CallMethods::invalid2' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
320 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
321 } // namespace CallMethods
322
323 // Keep macros contained to one file.
324 #ifdef FIRST
325 #undef FIRST
326 #endif
327
328 #ifdef SECOND
329 #undef SECOND
330 #endif