annotate clang/test/Modules/odr_hash.mm @ 266:00f31e85ec16 default tip

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