[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / Modules / odr_hash.cpp
blobfa8b2c81ab46e1b5fa34188a7973e25743ed26b2
1 // Clear and create directories
2 // RUN: rm -rf %t
3 // RUN: mkdir %t
4 // RUN: mkdir %t/cache
5 // RUN: mkdir %t/Inputs
7 // Build first header file
8 // RUN: echo "#define FIRST" >> %t/Inputs/first.h
9 // RUN: cat %s >> %t/Inputs/first.h
11 // Build second header file
12 // RUN: echo "#define SECOND" >> %t/Inputs/second.h
13 // RUN: cat %s >> %t/Inputs/second.h
15 // Test that each header can compile
16 // RUN: %clang_cc1 -fsyntax-only -x c++ -std=c++20 %t/Inputs/first.h
17 // RUN: %clang_cc1 -fsyntax-only -x c++ -std=c++20 %t/Inputs/second.h
19 // Build module map file
20 // RUN: echo "module FirstModule {" >> %t/Inputs/module.modulemap
21 // RUN: echo " header \"first.h\"" >> %t/Inputs/module.modulemap
22 // RUN: echo "}" >> %t/Inputs/module.modulemap
23 // RUN: echo "module SecondModule {" >> %t/Inputs/module.modulemap
24 // RUN: echo " header \"second.h\"" >> %t/Inputs/module.modulemap
25 // RUN: echo "}" >> %t/Inputs/module.modulemap
27 // Run test
28 // RUN: %clang_cc1 -triple x86_64-linux-gnu -x c++ -std=c++20 \
29 // RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache \
30 // RUN: -I%t/Inputs -verify %s
32 #if !defined(FIRST) && !defined(SECOND)
33 #include "first.h"
34 #include "second.h"
35 #endif
37 // Used for testing
38 #if defined(FIRST)
39 #define ACCESS public:
40 #elif defined(SECOND)
41 #define ACCESS private:
42 #endif
44 namespace AccessSpecifiers {
45 #if defined(FIRST)
46 struct S1 {
48 #elif defined(SECOND)
49 struct S1 {
50 private:
52 #else
53 S1 s1;
54 // expected-error@second.h:* {{'AccessSpecifiers::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
55 // expected-note@first.h:* {{but in 'FirstModule' found end of class}}
56 #endif
58 #if defined(FIRST)
59 struct S2 {
60 public:
62 #elif defined(SECOND)
63 struct S2 {
64 protected:
66 #else
67 S2 s2;
68 // expected-error@second.h:* {{'AccessSpecifiers::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found protected access specifier}}
69 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
70 #endif
72 #define DECLS \
73 public: \
74 private: \
75 protected:
77 #if defined(FIRST) || defined(SECOND)
78 struct Valid1 {
79 DECLS
81 #else
82 Valid1 v1;
83 #endif
85 #if defined(FIRST) || defined(SECOND)
86 struct Invalid1 {
87 DECLS
88 ACCESS
90 #else
91 Invalid1 i1;
92 // expected-error@second.h:* {{'AccessSpecifiers::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
93 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
94 #endif
96 #undef DECLS
97 } // namespace AccessSpecifiers
99 namespace StaticAssert {
100 #if defined(FIRST)
101 struct S1 {
102 static_assert(1 == 1, "First");
104 #elif defined(SECOND)
105 struct S1 {
106 static_assert(1 == 1, "Second");
108 #else
109 S1 s1;
110 // expected-error@second.h:* {{'StaticAssert::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found static assert with message}}
111 // expected-note@first.h:* {{but in 'FirstModule' found static assert with different message}}
112 #endif
114 #if defined(FIRST)
115 struct S2 {
116 static_assert(2 == 2, "Message");
118 #elif defined(SECOND)
119 struct S2 {
120 static_assert(2 == 2);
122 #else
123 S2 s2;
124 // expected-error@second.h:* {{'StaticAssert::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found static assert with no message}}
125 // expected-note@first.h:* {{but in 'FirstModule' found static assert with message}}
126 #endif
128 #if defined(FIRST)
129 struct S3 {
130 static_assert(3 == 3, "Message");
132 #elif defined(SECOND)
133 struct S3 {
134 static_assert(3 != 4, "Message");
136 #else
137 S3 s3;
138 // expected-error@second.h:* {{'StaticAssert::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found static assert with condition}}
139 // expected-note@first.h:* {{but in 'FirstModule' found static assert with different condition}}
140 #endif
142 #if defined(FIRST)
143 struct S4 {
144 static_assert(4 == 4, "Message");
146 #elif defined(SECOND)
147 struct S4 {
148 public:
150 #else
151 S4 s4;
152 // expected-error@second.h:* {{'StaticAssert::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}}
153 // expected-note@first.h:* {{but in 'FirstModule' found static assert}}
154 #endif
156 #define DECLS \
157 static_assert(4 == 4, "Message"); \
158 static_assert(5 == 5);
160 #if defined(FIRST) || defined(SECOND)
161 struct Valid1 {
162 DECLS
164 #else
165 Valid1 v1;
166 #endif
168 #if defined(FIRST) || defined(SECOND)
169 struct Invalid1 {
170 DECLS
171 ACCESS
173 #else
174 Invalid1 i1;
175 // expected-error@second.h:* {{'StaticAssert::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
176 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
177 #endif
178 #undef DECLS
179 } // namespace StaticAssert
181 namespace Field {
182 #if defined(FIRST)
183 struct S1 {
184 int x;
185 private:
186 int y;
188 #elif defined(SECOND)
189 struct S1 {
190 int x;
191 int y;
193 #else
194 S1 s1;
195 // expected-error@second.h:* {{'Field::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found field}}
196 // expected-note@first.h:* {{but in 'FirstModule' found private access specifier}}
197 #endif
199 #if defined(FIRST)
200 struct S2 {
201 int x;
202 int y;
204 #elif defined(SECOND)
205 struct S2 {
206 int y;
207 int x;
209 #else
210 S2 s2;
211 // expected-error@second.h:* {{'Field::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'y'}}
212 // expected-note@first.h:* {{but in 'FirstModule' found field 'x'}}
213 #endif
215 #if defined(FIRST)
216 struct S3 {
217 double x;
219 #elif defined(SECOND)
220 struct S3 {
221 int x;
223 #else
224 S3 s3;
225 // expected-error@first.h:* {{'Field::S3::x' from module 'FirstModule' is not present in definition of 'Field::S3' in module 'SecondModule'}}
226 // expected-note@second.h:* {{declaration of 'x' does not match}}
227 #endif
229 #if defined(FIRST)
230 typedef int A;
231 struct S4 {
232 A x;
235 struct S5 {
236 A x;
238 #elif defined(SECOND)
239 typedef int B;
240 struct S4 {
241 B x;
244 struct S5 {
245 int x;
247 #else
248 S4 s4;
249 // expected-error@second.h:* {{'Field::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'B' (aka 'int')}}
250 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'A' (aka 'int')}}
252 S5 s5;
253 // expected-error@second.h:* {{'Field::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'int'}}
254 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'A' (aka 'int')}}
255 #endif
257 #if defined(FIRST)
258 struct S6 {
259 unsigned x;
261 #elif defined(SECOND)
262 struct S6 {
263 unsigned x : 1;
265 #else
266 S6 s6;
267 // expected-error@second.h:* {{'Field::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found bitfield 'x'}}
268 // expected-note@first.h:* {{but in 'FirstModule' found non-bitfield 'x'}}
269 #endif
271 #if defined(FIRST)
272 struct S7 {
273 unsigned x : 2;
275 #elif defined(SECOND)
276 struct S7 {
277 unsigned x : 1;
279 #else
280 S7 s7;
281 // expected-error@second.h:* {{'Field::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found bitfield 'x' with one width expression}}
282 // expected-note@first.h:* {{but in 'FirstModule' found bitfield 'x' with different width expression}}
283 #endif
285 #if defined(FIRST)
286 struct S8 {
287 unsigned x : 2;
289 #elif defined(SECOND)
290 struct S8 {
291 unsigned x : 1 + 1;
293 #else
294 S8 s8;
295 // expected-error@second.h:* {{'Field::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found bitfield 'x' with one width expression}}
296 // expected-note@first.h:* {{but in 'FirstModule' found bitfield 'x' with different width expression}}
297 #endif
299 #if defined(FIRST)
300 struct S9 {
301 mutable int x;
303 #elif defined(SECOND)
304 struct S9 {
305 int x;
307 #else
308 S9 s9;
309 // expected-error@second.h:* {{'Field::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found non-mutable field 'x'}}
310 // expected-note@first.h:* {{but in 'FirstModule' found mutable field 'x'}}
311 #endif
313 #if defined(FIRST)
314 struct S9b {
315 mutable int x : 2;
317 #elif defined(SECOND)
318 struct S9b {
319 int x : 2;
321 #else
322 S9b s9b;
323 // expected-error@second.h:* {{'Field::S9b' has different definitions in different modules; first difference is definition in module 'SecondModule' found non-mutable field 'x'}}
324 // expected-note@first.h:* {{but in 'FirstModule' found mutable field 'x'}}
325 #endif
327 #if defined(FIRST)
328 struct S10 {
329 unsigned x = 5;
331 #elif defined(SECOND)
332 struct S10 {
333 unsigned x;
335 #else
336 S10 s10;
337 // expected-error@second.h:* {{'Field::S10' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with no initializer}}
338 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with an initializer}}
339 #endif
341 #if defined(FIRST)
342 struct S11 {
343 unsigned x = 5;
345 #elif defined(SECOND)
346 struct S11 {
347 unsigned x = 7;
349 #else
350 S11 s11;
351 // expected-error@second.h:* {{'Field::S11' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with an initializer}}
352 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with a different initializer}}
353 #endif
355 #if defined(FIRST)
356 struct S12 {
357 unsigned x[5];
359 #elif defined(SECOND)
360 struct S12 {
361 unsigned x[7];
363 #else
364 S12 s12;
365 // expected-error@first.h:* {{'Field::S12::x' from module 'FirstModule' is not present in definition of 'Field::S12' in module 'SecondModule'}}
366 // expected-note@second.h:* {{declaration of 'x' does not match}}
367 #endif
369 #if defined(FIRST)
370 struct S13 {
371 unsigned x[7];
373 #elif defined(SECOND)
374 struct S13 {
375 double x[7];
377 #else
378 S13 s13;
379 // expected-error@first.h:* {{'Field::S13::x' from module 'FirstModule' is not present in definition of 'Field::S13' in module 'SecondModule'}}
380 // expected-note@second.h:* {{declaration of 'x' does not match}}
381 #endif
383 #define DECLS \
384 int a; \
385 int b : 3; \
386 unsigned c : 1 + 2; \
387 s d; \
388 double e = 1.0; \
389 long f[5]; \
390 mutable int g; \
391 mutable int h : 5;
393 #if defined(FIRST) || defined(SECOND)
394 typedef short s;
395 #endif
397 #if defined(FIRST) || defined(SECOND)
398 struct Valid1 {
399 DECLS
401 #else
402 Valid1 v1;
403 #endif
405 #if defined(FIRST) || defined(SECOND)
406 struct Invalid1 {
407 DECLS
408 ACCESS
410 #else
411 Invalid1 i1;
412 // expected-error@second.h:* {{'Field::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
413 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
414 #endif
415 #undef DECLS
416 } // namespace Field
418 namespace Method {
419 #if defined(FIRST)
420 struct S1 {
421 void A() {}
423 #elif defined(SECOND)
424 struct S1 {
425 private:
426 void A() {}
428 #else
429 S1 s1;
430 // expected-error@second.h:* {{'Method::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
431 // expected-note@first.h:* {{but in 'FirstModule' found method}}
432 #endif
434 #if defined(FIRST)
435 struct S2 {
436 void A() {}
437 void B() {}
439 #elif defined(SECOND)
440 struct S2 {
441 void B() {}
442 void A() {}
444 #else
445 S2 s2;
446 // expected-error@second.h:* {{'Method::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'B'}}
447 // expected-note@first.h:* {{but in 'FirstModule' found method 'A'}}
448 #endif
450 #if defined(FIRST)
451 struct S3 {
452 static void A() {}
453 void A(int) {}
455 #elif defined(SECOND)
456 struct S3 {
457 void A(int) {}
458 static void A() {}
460 #else
461 S3 s3;
462 // expected-error@second.h:* {{'Method::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' is not static}}
463 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is static}}
464 #endif
466 #if defined(FIRST)
467 struct S4 {
468 virtual void A() {}
469 void B() {}
471 #elif defined(SECOND)
472 struct S4 {
473 void A() {}
474 virtual void B() {}
476 #else
477 S4 s4;
478 // expected-error@second.h:* {{'Method::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' is not virtual}}
479 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is virtual}}
480 #endif
482 #if defined(FIRST)
483 struct S5 {
484 virtual void A() = 0;
485 virtual void B() {};
487 #elif defined(SECOND)
488 struct S5 {
489 virtual void A() {}
490 virtual void B() = 0;
492 #else
493 S5 *s5;
494 // expected-error@second.h:* {{'Method::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' is virtual}}
495 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is pure virtual}}
496 #endif
498 #if defined(FIRST)
499 struct S6 {
500 inline void A() {}
502 #elif defined(SECOND)
503 struct S6 {
504 void A() {}
506 #else
507 S6 s6;
508 // expected-error@second.h:* {{'Method::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' is not inline}}
509 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is inline}}
510 #endif
512 #if defined(FIRST)
513 struct S7 {
514 void A() volatile {}
515 void A() {}
517 #elif defined(SECOND)
518 struct S7 {
519 void A() {}
520 void A() volatile {}
522 #else
523 S7 s7;
524 // expected-error@second.h:* {{'Method::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' is not volatile}}
525 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is volatile}}
526 #endif
528 #if defined(FIRST)
529 struct S8 {
530 void A() const {}
531 void A() {}
533 #elif defined(SECOND)
534 struct S8 {
535 void A() {}
536 void A() const {}
538 #else
539 S8 s8;
540 // expected-error@second.h:* {{'Method::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' is not const}}
541 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is const}}
542 #endif
544 #if defined(FIRST)
545 struct S9 {
546 void A(int x) {}
547 void A(int x, int y) {}
549 #elif defined(SECOND)
550 struct S9 {
551 void A(int x, int y) {}
552 void A(int x) {}
554 #else
555 S9 s9;
556 // expected-error@second.h:* {{'Method::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' that has 2 parameters}}
557 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' that has 1 parameter}}
558 #endif
560 #if defined(FIRST)
561 struct S10 {
562 void A(int x) {}
563 void A(float x) {}
565 #elif defined(SECOND)
566 struct S10 {
567 void A(float x) {}
568 void A(int x) {}
570 #else
571 S10 s10;
572 // expected-error@second.h:* {{'Method::S10' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter of type 'float'}}
573 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter of type 'int'}}
574 #endif
576 #if defined(FIRST)
577 struct S11 {
578 void A(int x);
580 #elif defined(SECOND)
581 struct S11 {
582 void A(int y);
584 #else
585 S11 s11;
586 // expected-error@second.h:* {{'Method::S11' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter named 'y'}}
587 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter named 'x'}}
588 #endif
590 #if defined(FIRST)
591 struct S12 {
592 void A(int x);
594 #elif defined(SECOND)
595 struct S12 {
596 void A(int x = 1);
598 #else
599 S12 s12;
600 // expected-error@second.h:* {{'Method::S12' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter without a default argument}}
601 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter with a default argument}}
602 #endif
604 #if defined(FIRST)
605 struct S13 {
606 void A(int x = 1 + 0);
608 #elif defined(SECOND)
609 struct S13 {
610 void A(int x = 1);
612 #else
613 S13 s13;
614 // expected-error@second.h:* {{'Method::S13' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter with a default argument}}
615 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter with a different default argument}}
616 #endif
618 #if defined(FIRST)
619 struct S14 {
620 void A(int x[2]);
622 #elif defined(SECOND)
623 struct S14 {
624 void A(int x[3]);
626 #else
627 S14 s14;
628 // expected-error@second.h:* {{'Method::S14' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' with 1st parameter of type 'int *' decayed from 'int[3]'}}
629 // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter of type 'int *' decayed from 'int[2]'}}
630 #endif
632 #if defined(FIRST)
633 struct S15 {
634 int A() { return 0; }
636 #elif defined(SECOND)
637 struct S15 {
638 long A() { return 0; }
640 #else
641 S15 s15;
642 // expected-error@first.h:* {{'Method::S15::A' from module 'FirstModule' is not present in definition of 'Method::S15' in module 'SecondModule'}}
643 // expected-note@second.h:* {{declaration of 'A' does not match}}
644 #endif
646 #define DECLS \
647 void A(); \
648 static void B(); \
649 virtual void C(); \
650 virtual void D() = 0; \
651 inline void E(); \
652 void F() const; \
653 void G() volatile; \
654 void H(int x); \
655 void I(int x = 5 + 5); \
656 void J(int); \
657 void K(int x[2]); \
658 int L();
660 #if defined(FIRST) || defined(SECOND)
661 struct Valid1 {
662 DECLS
664 #else
665 Valid1* v1;
666 #endif
668 #if defined(FIRST) || defined(SECOND)
669 struct Invalid1 {
670 DECLS
671 ACCESS
673 #else
674 Invalid1* i1;
675 // expected-error@second.h:* {{'Method::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
676 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
677 #endif
678 #undef DECLS
679 } // namespace Method
681 namespace MethodBody {
682 #if defined(FIRST)
683 struct S1 {
684 int A() { return 0; }
686 #elif defined(SECOND)
687 struct S1 {
688 int A() { return 0; }
690 #else
691 S1 s1;
692 #endif
694 #if defined(FIRST)
695 struct S2 {
696 int BothBodies() { return 0; }
698 #elif defined(SECOND)
699 struct S2 {
700 int BothBodies() { return 1; }
702 #else
703 S2 s2;
704 // expected-error@first.h:* {{'MethodBody::S2' has different definitions in different modules; first difference is definition in module 'FirstModule' found method 'BothBodies' with body}}
705 // expected-note@second.h:* {{but in 'SecondModule' found method 'BothBodies' with different body}}
706 #endif
708 #if defined(FIRST)
709 struct S3 {
710 int FirstBody() { return 0; }
712 #elif defined(SECOND)
713 struct S3 {
714 int FirstBody();
716 #else
717 S3 s3;
718 // expected-error@first.h:* {{'MethodBody::S3' has different definitions in different modules; first difference is definition in module 'FirstModule' found method 'FirstBody' with body}}
719 // expected-note@second.h:* {{but in 'SecondModule' found method 'FirstBody' with no body}}
720 #endif
722 #if defined(FIRST)
723 struct S4 {
724 int SecondBody();
726 #elif defined(SECOND)
727 struct S4 {
728 int SecondBody() { return 0; }
730 #else
731 S4 s4;
732 // expected-error@first.h:* {{'MethodBody::S4' has different definitions in different modules; first difference is definition in module 'FirstModule' found method 'SecondBody' with no body}}
733 // expected-note@second.h:* {{but in 'SecondModule' found method 'SecondBody' with body}}
734 #endif
736 #if defined(FIRST)
737 struct S5 {
738 int FirstBodySecondOutOfLine() { return 0; }
740 #elif defined(SECOND)
741 struct S5 {
742 int FirstBodySecondOutOfLine();
744 int S5::FirstBodySecondOutOfLine() { return 0; }
745 #else
746 S5 s5;
747 // expected-error@second.h:* {{'MethodBody::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'FirstBodySecondOutOfLine' with no body}}
748 // expected-note@first.h:* {{but in 'FirstModule' found method 'FirstBodySecondOutOfLine' with body}}
749 #endif
751 #if defined(FIRST)
752 struct S6 {
753 int FirstOutOfLineSecondBody();
755 int S6::FirstOutOfLineSecondBody() { return 0; }
756 #elif defined(SECOND)
757 struct S6 {
758 int FirstOutOfLineSecondBody() { return 0; }
760 #else
761 S6 s6;
762 // expected-error@first.h:* {{'MethodBody::S6' has different definitions in different modules; first difference is definition in module 'FirstModule' found method 'FirstOutOfLineSecondBody' with no body}}
763 // expected-note@second.h:* {{but in 'SecondModule' found method 'FirstOutOfLineSecondBody' with body}}
764 #endif
766 #if defined(FIRST)
767 struct S7 {
768 int BothOutOfLine();
770 int S7::BothOutOfLine() { return 1; }
771 #elif defined(SECOND)
772 struct S7 {
773 int BothOutOfLine();
775 int S7::BothOutOfLine() { return 0; }
776 #else
777 S7 s7;
778 // expected-error@second.h:* {{'MethodBody::S7::BothOutOfLine' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
779 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
780 #endif
782 #if defined(FIRST)
783 struct S8 {
784 int FirstBodySecondOutOfLine() { return 0; }
786 #elif defined(SECOND)
787 struct S8 {
788 int FirstBodySecondOutOfLine();
790 int S8::FirstBodySecondOutOfLine() { return 1; }
791 #else
792 S8 s8;
793 // expected-error@second.h:* {{'MethodBody::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'FirstBodySecondOutOfLine' with no body}}
794 // expected-note@first.h:* {{but in 'FirstModule' found method 'FirstBodySecondOutOfLine' with body}}
795 #endif
797 #if defined(FIRST)
798 struct S9 {
799 int FirstOutOfLineSecondBody();
801 int S9::FirstOutOfLineSecondBody() { return 1; }
802 #elif defined(SECOND)
803 struct S9 {
804 int FirstOutOfLineSecondBody() { return 0; }
806 #else
807 S9 s9;
808 // expected-error@first.h:* {{'MethodBody::S9' has different definitions in different modules; first difference is definition in module 'FirstModule' found method 'FirstOutOfLineSecondBody' with no body}}
809 // expected-note@second.h:* {{but in 'SecondModule' found method 'FirstOutOfLineSecondBody' with body}}
810 #endif
812 #if defined(FIRST)
813 struct S10 {
814 S10(int);
815 S10() = delete;
817 #elif defined(SECOND)
818 struct S10 {
819 S10(int);
820 S10();
822 #else
823 S10 s10(10);
824 // expected-error@first.h:* {{'MethodBody::S10' has different definitions in different modules; first difference is definition in module 'FirstModule' found constructor is deleted}}
825 // expected-note@second.h:* {{but in 'SecondModule' found constructor is not deleted}}
826 #endif
828 #if defined(FIRST)
829 struct S11 {
830 S11() = default;
832 #elif defined(SECOND)
833 struct S11 {
834 S11();
836 #else
837 S11 s11;
838 // expected-error@first.h:* {{'MethodBody::S11' has different definitions in different modules; first difference is definition in module 'FirstModule' found constructor is defaulted}}
839 // expected-note@second.h:* {{but in 'SecondModule' found constructor is not defaulted}}
840 #endif
842 #define DECLS(CLASSNAME) \
843 CLASSNAME() = default; \
844 ~CLASSNAME() = delete; \
845 void A(); \
846 void B() { return; }; \
847 void C(); \
848 void D();
850 #define OUTOFLINEDEFS(CLASSNAME) \
851 void CLASSNAME::C() {} \
852 void CLASSNAME::D() { return; }
854 #if defined(FIRST) || defined(SECOND)
855 struct Valid1 {
856 DECLS(Valid1)
858 OUTOFLINEDEFS(Valid1)
859 #else
860 Valid1* v1;
861 #endif
863 #if defined(FIRST) || defined(SECOND)
864 struct Invalid1 {
865 DECLS(Invalid1)
866 ACCESS
868 OUTOFLINEDEFS(Invalid1)
869 #else
870 Invalid1* i1;
871 // expected-error@first.h:* {{'MethodBody::Invalid1' has different definitions in different modules; first difference is definition in module 'FirstModule' found public access specifier}}
872 // expected-note@second.h:* {{but in 'SecondModule' found private access specifier}}
873 #endif
874 #undef DECLS
875 } // namespace MethodBody
877 namespace Constructor {
878 #if defined(FIRST)
879 struct S1 {
880 S1() {}
881 void foo() {}
883 #elif defined(SECOND)
884 struct S1 {
885 void foo() {}
886 S1() {}
888 #else
889 S1 s1;
890 // expected-error@second.h:* {{'Constructor::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'foo'}}
891 // expected-note@first.h:* {{but in 'FirstModule' found constructor}}
892 #endif
894 #if defined(FIRST)
895 struct S2 {
896 S2(int) {}
897 S2(int, int) {}
899 #elif defined(SECOND)
900 struct S2 {
901 S2(int, int) {}
902 S2(int) {}
904 #else
905 S2* s2;
906 // expected-error@second.h:* {{'Constructor::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found constructor that has 2 parameters}}
907 // expected-note@first.h:* {{but in 'FirstModule' found constructor that has 1 parameter}}
908 #endif
910 #define DECLS(CLASS) \
911 CLASS(int); \
912 CLASS(double); \
913 CLASS(int, int);
915 #if defined(FIRST) || defined(SECOND)
916 struct Valid1 {
917 DECLS(Valid1)
919 #else
920 Valid1* v1;
921 #endif
923 #if defined(FIRST) || defined(SECOND)
924 struct Invalid1 {
925 DECLS(Invalid1)
926 ACCESS
928 #else
929 Invalid1* i1;
930 // expected-error@second.h:* {{'Constructor::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
931 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
932 #endif
933 #undef DECLS
934 } // namespace Constructor
936 namespace Destructor {
937 #if defined(FIRST)
938 struct S1 {
939 ~S1() {}
940 S1() {}
942 #elif defined(SECOND)
943 struct S1 {
944 S1() {}
945 ~S1() {}
947 #else
948 S1 s1;
949 // expected-error@second.h:* {{'Destructor::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found constructor}}
950 // expected-note@first.h:* {{but in 'FirstModule' found destructor}}
951 #endif
953 #if defined(FIRST)
954 struct S2 {
955 virtual ~S2() {}
956 void foo() {}
958 #elif defined(SECOND)
959 struct S2 {
960 ~S2() {}
961 virtual void foo() {}
963 #else
964 S2 s2;
965 // expected-error@second.h:* {{'Destructor::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found destructor is not virtual}}
966 // expected-note@first.h:* {{but in 'FirstModule' found destructor is virtual}}
967 #endif
969 #if defined(FIRST) || defined(SECOND)
970 struct Valid1 {
971 ~Valid1();
973 #else
974 Valid1 v1;
975 #endif
977 #if defined(FIRST) || defined(SECOND)
978 struct Invalid1 {
979 ~Invalid1();
980 ACCESS
982 #else
983 Invalid1 i1;
984 // expected-error@second.h:* {{'Destructor::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
985 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
986 #endif
988 #if defined(FIRST) || defined(SECOND)
989 struct Valid2 {
990 virtual ~Valid2();
992 #else
993 Valid2 v2;
994 #endif
996 #if defined(FIRST) || defined(SECOND)
997 struct Invalid2 {
998 virtual ~Invalid2();
999 ACCESS
1001 #else
1002 Invalid2 i2;
1003 // expected-error@second.h:* {{'Destructor::Invalid2' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1004 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1005 #endif
1006 } // namespace Destructor
1008 namespace TypeDef {
1009 #if defined(FIRST)
1010 struct S1 {
1011 typedef int a;
1013 #elif defined(SECOND)
1014 struct S1 {
1015 typedef double a;
1017 #else
1018 S1 s1;
1019 // expected-error@first.h:* {{'TypeDef::S1::a' from module 'FirstModule' is not present in definition of 'TypeDef::S1' in module 'SecondModule'}}
1020 // expected-note@second.h:* {{declaration of 'a' does not match}}
1021 #endif
1023 #if defined(FIRST)
1024 struct S2 {
1025 typedef int a;
1027 #elif defined(SECOND)
1028 struct S2 {
1029 typedef int b;
1031 #else
1032 S2 s2;
1033 // expected-error@first.h:* {{'TypeDef::S2::a' from module 'FirstModule' is not present in definition of 'TypeDef::S2' in module 'SecondModule'}}
1034 // expected-note@second.h:* {{definition has no member 'a'}}
1035 #endif
1037 #if defined(FIRST)
1038 typedef int T;
1039 struct S3 {
1040 typedef T a;
1042 #elif defined(SECOND)
1043 typedef double T;
1044 struct S3 {
1045 typedef T a;
1047 #else
1048 S3 s3;
1049 // FIXME: We should reject the merge of `S3` due to the inconsistent definition of `T`.
1050 #endif
1052 #if defined(FIRST)
1053 struct S4 {
1054 typedef int a;
1055 typedef int b;
1057 #elif defined(SECOND)
1058 struct S4 {
1059 typedef int b;
1060 typedef int a;
1062 #else
1063 S4 s4;
1064 // expected-error@second.h:* {{'TypeDef::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found typedef name 'b'}}
1065 // expected-note@first.h:* {{but in 'FirstModule' found typedef name 'a'}}
1066 #endif
1068 #if defined(FIRST)
1069 struct S5 {
1070 typedef int a;
1071 typedef int b;
1072 int x;
1074 #elif defined(SECOND)
1075 struct S5 {
1076 int x;
1077 typedef int b;
1078 typedef int a;
1080 #else
1081 S5 s5;
1082 // expected-error@second.h:* {{'TypeDef::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found field}}
1083 // expected-note@first.h:* {{but in 'FirstModule' found typedef}}
1084 #endif
1086 #if defined(FIRST)
1087 typedef float F;
1088 struct S6 {
1089 typedef int a;
1090 typedef F b;
1092 #elif defined(SECOND)
1093 struct S6 {
1094 typedef int a;
1095 typedef float b;
1097 #else
1098 S6 s6;
1099 // expected-error@second.h:* {{'TypeDef::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found typedef 'b' with underlying type 'float'}}
1100 // expected-note@first.h:* {{but in 'FirstModule' found typedef 'b' with different underlying type 'F' (aka 'float')}}
1101 #endif
1103 #define DECLS \
1104 typedef int A; \
1105 typedef double B; \
1106 typedef I C;
1108 #if defined(FIRST) || defined(SECOND)
1109 typedef int I;
1110 #endif
1112 #if defined(FIRST) || defined(SECOND)
1113 struct Valid1 {
1114 DECLS
1116 #else
1117 Valid1 v1;
1118 #endif
1120 #if defined(FIRST) || defined(SECOND)
1121 struct Invalid1 {
1122 DECLS
1123 ACCESS
1125 #else
1126 Invalid1 i1;
1127 // expected-error@second.h:* {{'TypeDef::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1128 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1129 #endif
1130 #undef DECLS
1131 } // namespace TypeDef
1133 namespace Using {
1134 #if defined(FIRST)
1135 struct S1 {
1136 using a = int;
1138 #elif defined(SECOND)
1139 struct S1 {
1140 using a = double;
1142 #else
1143 S1 s1;
1144 // expected-error@first.h:* {{'Using::S1::a' from module 'FirstModule' is not present in definition of 'Using::S1' in module 'SecondModule'}}
1145 // expected-note@second.h:* {{declaration of 'a' does not match}}
1146 #endif
1148 #if defined(FIRST)
1149 struct S2 {
1150 using a = int;
1152 #elif defined(SECOND)
1153 struct S2 {
1154 using b = int;
1156 #else
1157 S2 s2;
1158 // expected-error@first.h:* {{'Using::S2::a' from module 'FirstModule' is not present in definition of 'Using::S2' in module 'SecondModule'}}
1159 // expected-note@second.h:* {{definition has no member 'a'}}
1160 #endif
1162 #if defined(FIRST)
1163 typedef int T;
1164 struct S3 {
1165 using a = T;
1167 #elif defined(SECOND)
1168 typedef double T;
1169 struct S3 {
1170 using a = T;
1172 #else
1173 S3 s3;
1174 // FIXME: We should reject the merge of `S3` due to the inconsistent definition of `T`.
1175 #endif
1177 #if defined(FIRST)
1178 struct S4 {
1179 using a = int;
1180 using b = int;
1182 #elif defined(SECOND)
1183 struct S4 {
1184 using b = int;
1185 using a = int;
1187 #else
1188 S4 s4;
1189 // expected-error@second.h:* {{'Using::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found type alias name 'b'}}
1190 // expected-note@first.h:* {{but in 'FirstModule' found type alias name 'a'}}
1191 #endif
1193 #if defined(FIRST)
1194 struct S5 {
1195 using a = int;
1196 using b = int;
1197 int x;
1199 #elif defined(SECOND)
1200 struct S5 {
1201 int x;
1202 using b = int;
1203 using a = int;
1205 #else
1206 S5 s5;
1207 // expected-error@second.h:* {{'Using::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found field}}
1208 // expected-note@first.h:* {{but in 'FirstModule' found type alias}}
1209 #endif
1211 #if defined(FIRST)
1212 typedef float F;
1213 struct S6 {
1214 using a = int;
1215 using b = F;
1217 #elif defined(SECOND)
1218 struct S6 {
1219 using a = int;
1220 using b = float;
1222 #else
1223 S6 s6;
1224 // expected-error@second.h:* {{'Using::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found type alias 'b' with underlying type 'float'}}
1225 // expected-note@first.h:* {{but in 'FirstModule' found type alias 'b' with different underlying type 'F' (aka 'float')}}
1226 #endif
1228 #if defined(FIRST) || defined(SECOND)
1229 using I = int;
1230 #endif
1232 #define DECLS \
1233 using A = int; \
1234 using B = double; \
1235 using C = I;
1237 #if defined(FIRST) || defined(SECOND)
1238 struct Valid1 {
1239 DECLS
1241 #else
1242 Valid1 v1;
1243 #endif
1245 #if defined(FIRST) || defined(SECOND)
1246 struct Invalid1 {
1247 DECLS
1248 ACCESS
1250 #else
1251 Invalid1 i1;
1252 // expected-error@second.h:* {{'Using::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1253 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1254 #endif
1255 #undef DECLS
1256 } // namespace Using
1258 namespace RecordType {
1259 #if defined(FIRST)
1260 struct B1 {};
1261 struct S1 {
1262 B1 x;
1264 #elif defined(SECOND)
1265 struct A1 {};
1266 struct S1 {
1267 A1 x;
1269 #else
1270 S1 s1;
1271 // expected-error@first.h:* {{'RecordType::S1::x' from module 'FirstModule' is not present in definition of 'RecordType::S1' in module 'SecondModule'}}
1272 // expected-note@second.h:* {{declaration of 'x' does not match}}
1273 #endif
1275 #define DECLS \
1276 Foo F;
1278 #if defined(FIRST) || defined(SECOND)
1279 struct Foo {};
1280 #endif
1282 #if defined(FIRST) || defined(SECOND)
1283 struct Valid1 {
1284 DECLS
1286 #else
1287 Valid1 v1;
1288 #endif
1290 #if defined(FIRST) || defined(SECOND)
1291 struct Invalid1 {
1292 DECLS
1293 ACCESS
1295 #else
1296 Invalid1 i1;
1297 // expected-error@second.h:* {{'RecordType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1298 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1299 #endif
1300 #undef DECLS
1301 } // namespace RecordType
1303 namespace DependentType {
1304 #if defined(FIRST)
1305 template <class T>
1306 class S1 {
1307 typename T::typeA x;
1309 #elif defined(SECOND)
1310 template <class T>
1311 class S1 {
1312 typename T::typeB x;
1314 #else
1315 template<class T>
1316 using U1 = S1<T>;
1317 // expected-error@first.h:* {{'DependentType::S1::x' from module 'FirstModule' is not present in definition of 'S1<T>' in module 'SecondModule'}}
1318 // expected-note@second.h:* {{declaration of 'x' does not match}}
1319 #endif
1321 #define DECLS \
1322 typename T::typeA x;
1324 #if defined(FIRST) || defined(SECOND)
1325 template <class T>
1326 struct Valid1 {
1327 DECLS
1329 #else
1330 template <class T>
1331 using V1 = Valid1<T>;
1332 #endif
1334 #if defined(FIRST) || defined(SECOND)
1335 template <class T>
1336 struct Invalid1 {
1337 DECLS
1338 ACCESS
1340 #else
1341 template <class T>
1342 using I1 = Invalid1<T>;
1343 // expected-error@second.h:* {{'DependentType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1344 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1345 #endif
1346 #undef DECLS
1347 } // namespace DependentType
1349 namespace ElaboratedType {
1350 #if defined(FIRST)
1351 namespace N1 { using type = double; }
1352 struct S1 {
1353 N1::type x;
1355 #elif defined(SECOND)
1356 namespace N1 { using type = int; }
1357 struct S1 {
1358 N1::type x;
1360 #else
1361 S1 s1;
1362 #endif
1364 #define DECLS \
1365 NS::type x;
1367 #if defined(FIRST) || defined(SECOND)
1368 namespace NS { using type = float; }
1369 #endif
1371 #if defined(FIRST) || defined(SECOND)
1372 struct Valid1 {
1373 DECLS
1375 #else
1376 Valid1 v1;
1377 #endif
1379 #if defined(FIRST) || defined(SECOND)
1380 struct Invalid1 {
1381 DECLS
1382 ACCESS
1384 #else
1385 Invalid1 i1;
1386 // expected-error@second.h:* {{'ElaboratedType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1387 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1388 #endif
1389 #undef DECLS
1390 } // namespace ElaboratedType
1392 namespace Enum {
1393 #if defined(FIRST)
1394 enum A1 {};
1395 struct S1 {
1396 A1 x;
1398 #elif defined(SECOND)
1399 enum A2 {};
1400 struct S1 {
1401 A2 x;
1403 #else
1404 S1 s1;
1405 // expected-error@first.h:* {{'Enum::S1::x' from module 'FirstModule' is not present in definition of 'Enum::S1' in module 'SecondModule'}}
1406 // expected-note@second.h:* {{declaration of 'x' does not match}}
1407 #endif
1409 #define DECLS \
1410 E e = E1;
1412 #if defined(FIRST) || defined(SECOND)
1413 enum E { E1, E2 };
1414 #endif
1416 #if defined(FIRST) || defined(SECOND)
1417 struct Valid1 {
1418 DECLS
1420 #else
1421 Valid1 v1;
1422 #endif
1424 #if defined(FIRST) || defined(SECOND)
1425 struct Invalid1 {
1426 DECLS
1427 ACCESS
1429 #else
1430 Invalid1 i1;
1431 // expected-error@second.h:* {{'Enum::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1432 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1433 #endif
1434 #undef DECLS
1437 namespace NestedNamespaceSpecifier {
1438 #if defined(FIRST)
1439 namespace LevelA1 {
1440 using Type = int;
1443 struct S1 {
1444 LevelA1::Type x;
1446 # elif defined(SECOND)
1447 namespace LevelB1 {
1448 namespace LevelC1 {
1449 using Type = int;
1453 struct S1 {
1454 LevelB1::LevelC1::Type x;
1456 #else
1457 S1 s1;
1458 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'LevelB1::LevelC1::Type' (aka 'int')}}
1459 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'LevelA1::Type' (aka 'int')}}
1460 #endif
1462 #if defined(FIRST)
1463 namespace LevelA2 { using Type = int; }
1464 struct S2 {
1465 LevelA2::Type x;
1467 # elif defined(SECOND)
1468 struct S2 {
1469 int x;
1471 #else
1472 S2 s2;
1473 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'int'}}
1474 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'LevelA2::Type' (aka 'int')}}
1475 #endif
1477 namespace LevelA3 { using Type = int; }
1478 namespace LevelB3 { using Type = int; }
1479 #if defined(FIRST)
1480 struct S3 {
1481 LevelA3::Type x;
1483 # elif defined(SECOND)
1484 struct S3 {
1485 LevelB3::Type x;
1487 #else
1488 S3 s3;
1489 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'LevelB3::Type' (aka 'int')}}
1490 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'LevelA3::Type' (aka 'int')}}
1491 #endif
1493 #if defined(FIRST)
1494 struct TA4 { using Type = int; };
1495 struct S4 {
1496 TA4::Type x;
1498 # elif defined(SECOND)
1499 struct TB4 { using Type = int; };
1500 struct S4 {
1501 TB4::Type x;
1503 #else
1504 S4 s4;
1505 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'TB4::Type' (aka 'int')}}
1506 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'TA4::Type' (aka 'int')}}
1507 #endif
1509 #if defined(FIRST)
1510 struct T5 { using Type = int; };
1511 struct S5 {
1512 T5::Type x;
1514 # elif defined(SECOND)
1515 namespace T5 { using Type = int; };
1516 struct S5 {
1517 T5::Type x;
1519 #else
1520 S5 s5;
1521 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'T5::Type' (aka 'int')}}
1522 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'T5::Type' (aka 'int')}}
1523 #endif
1525 #if defined(FIRST)
1526 namespace N6 {using I = int;}
1527 struct S6 {
1528 NestedNamespaceSpecifier::N6::I x;
1530 # elif defined(SECOND)
1531 using I = int;
1532 struct S6 {
1533 ::NestedNamespaceSpecifier::I x;
1535 #else
1536 S6 s6;
1537 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type '::NestedNamespaceSpecifier::I' (aka 'int')}}
1538 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'NestedNamespaceSpecifier::N6::I' (aka 'int')}}
1539 #endif
1541 #if defined(FIRST)
1542 template <class T, class U>
1543 class S7 {
1544 typename T::type *x = {};
1545 int z = x->T::foo();
1547 #elif defined(SECOND)
1548 template <class T, class U>
1549 class S7 {
1550 typename T::type *x = {};
1551 int z = x->U::foo();
1553 #else
1554 template <class T, class U>
1555 using U7 = S7<T, U>;
1556 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'z' with an initializer}}
1557 // expected-note@first.h:* {{but in 'FirstModule' found field 'z' with a different initializer}}
1558 #endif
1560 #if defined(FIRST)
1561 template <class T>
1562 class S8 {
1563 int x = T::template X<int>::value;
1565 #elif defined(SECOND)
1566 template <class T>
1567 class S8 {
1568 int x = T::template Y<int>::value;
1570 #else
1571 template <class T>
1572 using U8 = S8<T>;
1573 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with an initializer}}
1574 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with a different initializer}}
1575 #endif
1577 #if defined(FIRST)
1578 namespace N9 { using I = int; }
1579 namespace O9 = N9;
1580 struct S9 {
1581 O9::I x;
1583 #elif defined(SECOND)
1584 namespace N9 { using I = int; }
1585 namespace P9 = N9;
1586 struct S9 {
1587 P9::I x;
1589 #else
1590 S9 s9;
1591 // expected-error@second.h:* {{'NestedNamespaceSpecifier::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'P9::I' (aka 'int')}}
1592 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'O9::I' (aka 'int')}}
1593 #endif
1595 namespace N10 {
1596 #if defined(FIRST)
1597 inline namespace A { struct X {}; }
1598 struct S10 {
1599 A::X x;
1601 #elif defined(SECOND)
1602 inline namespace B { struct X {}; }
1603 struct S10 {
1604 B::X x;
1606 #else
1607 S10 s10;
1608 // expected-error@second.h:* {{'NestedNamespaceSpecifier::N10::S10::x' from module 'SecondModule' is not present in definition of 'NestedNamespaceSpecifier::N10::S10' in module 'FirstModule'}}
1609 // expected-note@first.h:* {{declaration of 'x' does not match}}
1610 #endif
1613 #define DECLS \
1614 NS1::Type a; \
1615 NS1::NS2::Type b; \
1616 NS1::S c; \
1617 NS3::Type d;
1619 #if defined(FIRST) || defined(SECOND)
1620 namespace NS1 {
1621 using Type = int;
1622 namespace NS2 {
1623 using Type = double;
1625 struct S {};
1627 namespace NS3 = NS1;
1628 #endif
1630 #if defined(FIRST) || defined(SECOND)
1631 struct Valid1 {
1632 DECLS
1634 #else
1635 Valid1 v1;
1636 #endif
1638 #if defined(FIRST) || defined(SECOND)
1639 struct Invalid1 {
1640 DECLS
1641 ACCESS
1643 #else
1644 Invalid1 i1;
1645 // expected-error@second.h:* {{'NestedNamespaceSpecifier::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1646 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1647 #endif
1648 #undef DECLS
1650 #define DECLS \
1651 typename T::type *x = {}; \
1652 int y = x->T::foo(); \
1653 int z = U::template X<int>::value;
1655 #if defined(FIRST) || defined(SECOND)
1656 template <class T, class U>
1657 struct Valid2 {
1658 DECLS
1660 #else
1661 template <class T, class U>
1662 using V2 = Valid2<T, U>;
1663 #endif
1665 #if defined(FIRST) || defined(SECOND)
1666 template <class T, class U>
1667 struct Invalid2 {
1668 DECLS
1669 ACCESS
1671 #else
1672 template <class T, class U>
1673 using I2 = Invalid2<T, U>;
1674 // expected-error@second.h:* {{'NestedNamespaceSpecifier::Invalid2' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1675 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1676 #endif
1677 #undef DECLS
1678 } // namespace NestedNamespaceSpecifier
1680 namespace TemplateSpecializationType {
1681 #if defined(FIRST)
1682 template <class T1> struct U1 {};
1683 struct S1 {
1684 U1<int> u;
1686 #elif defined(SECOND)
1687 template <class T1, class T2> struct U1 {};
1688 struct S1 {
1689 U1<int, int> u;
1691 #else
1692 S1 s1;
1693 // expected-error@first.h:* {{'TemplateSpecializationType::S1::u' from module 'FirstModule' is not present in definition of 'TemplateSpecializationType::S1' in module 'SecondModule'}}
1694 // expected-note@second.h:* {{declaration of 'u' does not match}}
1695 #endif
1697 #if defined(FIRST)
1698 template <class T1> struct U2 {};
1699 struct S2 {
1700 U2<int> u;
1702 #elif defined(SECOND)
1703 template <class T1> struct V1 {};
1704 struct S2 {
1705 V1<int> u;
1707 #else
1708 S2 s2;
1709 // expected-error@first.h:* {{'TemplateSpecializationType::S2::u' from module 'FirstModule' is not present in definition of 'TemplateSpecializationType::S2' in module 'SecondModule'}}
1710 // expected-note@second.h:* {{declaration of 'u' does not match}}
1711 #endif
1713 #define DECLS \
1714 OneTemplateArg<int> x; \
1715 OneTemplateArg<double> y; \
1716 OneTemplateArg<char *> z; \
1717 TwoTemplateArgs<int, int> a; \
1718 TwoTemplateArgs<double, float> b; \
1719 TwoTemplateArgs<short *, char> c;
1721 #if defined(FIRST) || defined(SECOND)
1722 template <class T> struct OneTemplateArg {};
1723 template <class T, class U> struct TwoTemplateArgs {};
1724 #endif
1726 #if defined(FIRST) || defined(SECOND)
1727 struct Valid1 {
1728 DECLS
1730 #else
1731 Valid1 v1;
1732 #endif
1734 #if defined(FIRST) || defined(SECOND)
1735 struct Invalid1 {
1736 DECLS
1737 ACCESS
1739 #else
1740 Invalid1 i1;
1741 // expected-error@second.h:* {{'TemplateSpecializationType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
1742 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
1743 #endif
1744 #undef DECLS
1745 } // namespace TemplateSpecializationType
1747 namespace TemplateArgument {
1748 #if defined(FIRST)
1749 template <class> struct U1{};
1750 struct S1 {
1751 U1<int> x;
1753 #elif defined(SECOND)
1754 template <int> struct U1{};
1755 struct S1 {
1756 U1<1> x;
1758 #else
1759 S1 s1;
1760 // expected-error@first.h:* {{'TemplateArgument::S1::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S1' in module 'SecondModule'}}
1761 // expected-note@second.h:* {{declaration of 'x' does not match}}
1762 #endif
1764 #if defined(FIRST)
1765 template <int> struct U2{};
1766 struct S2 {
1767 using T = U2<2>;
1769 #elif defined(SECOND)
1770 template <int> struct U2{};
1771 struct S2 {
1772 using T = U2<(2)>;
1774 #else
1775 S2 s2;
1776 // expected-error@second.h:* {{'TemplateArgument::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found type alias 'T' with underlying type 'U2<(2)>'}}
1777 // expected-note@first.h:* {{but in 'FirstModule' found type alias 'T' with different underlying type 'U2<2>'}}
1778 #endif
1780 #if defined(FIRST)
1781 template <int> struct U3{};
1782 struct S3 {
1783 using T = U3<2>;
1785 #elif defined(SECOND)
1786 template <int> struct U3{};
1787 struct S3 {
1788 using T = U3<1 + 1>;
1790 #else
1791 S3 s3;
1792 // expected-error@second.h:* {{'TemplateArgument::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found type alias 'T' with underlying type 'U3<1 + 1>'}}
1793 // expected-note@first.h:* {{but in 'FirstModule' found type alias 'T' with different underlying type 'U3<2>'}}
1794 #endif
1796 #if defined(FIRST)
1797 template<class> struct T4a {};
1798 template <template <class> class T> struct U4 {};
1799 struct S4 {
1800 U4<T4a> x;
1802 #elif defined(SECOND)
1803 template<class> struct T4b {};
1804 template <template <class> class T> struct U4 {};
1805 struct S4 {
1806 U4<T4b> x;
1808 #else
1809 S4 s4;
1810 // expected-error@first.h:* {{'TemplateArgument::S4::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S4' in module 'SecondModule'}}
1811 // expected-note@second.h:* {{declaration of 'x' does not match}}
1812 #endif
1814 #if defined(FIRST)
1815 template <class T> struct U5 {};
1816 struct S5 {
1817 U5<int> x;
1819 #elif defined(SECOND)
1820 template <class T> struct U5 {};
1821 struct S5 {
1822 U5<short> x;
1824 #else
1825 S5 s5;
1826 // expected-error@first.h:* {{'TemplateArgument::S5::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S5' in module 'SecondModule'}}
1827 // expected-note@second.h:* {{declaration of 'x' does not match}}
1828 #endif
1830 #if defined(FIRST)
1831 template <class T> struct U6 {};
1832 struct S6 {
1833 U6<int> x;
1834 U6<short> y;
1836 #elif defined(SECOND)
1837 template <class T> struct U6 {};
1838 struct S6 {
1839 U6<short> y;
1840 U6<int> x;
1842 #else
1843 S6 s6;
1844 // expected-error@second.h:* {{'TemplateArgument::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'y'}}
1845 // expected-note@first.h:* {{but in 'FirstModule' found field 'x'}}
1846 #endif
1848 #if defined(FIRST)
1849 struct S7 {
1850 template<int> void run() {}
1851 template<> void run<1>() {}
1853 #elif defined(SECOND)
1854 struct S7 {
1855 template<int> void run() {}
1856 void run() {}
1858 #else
1859 S7 s7;
1860 // expected-error@second.h:* {{'TemplateArgument::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'run' with no template arguments}}
1861 // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with template arguments}}
1862 #endif
1864 #if defined(FIRST)
1865 struct S8 {
1866 static int a, b;
1867 template<int&> void run() {}
1868 template<int&, int&> void run() {}
1869 template<> void run<a>() {}
1871 #elif defined(SECOND)
1872 struct S8 {
1873 static int a, b;
1874 template<int&> void run() {}
1875 template<int&, int&> void run() {}
1876 template<> void run<a, b>() {}
1878 #else
1879 S8 s8;
1880 // expected-error@second.h:* {{'TemplateArgument::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'run' with 2 template arguments}}
1881 // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with 1 template argument}}
1882 #endif
1884 #if defined(FIRST)
1885 struct S9 {
1886 static int a, b;
1887 template<int&> void run() {}
1888 template<> void run<a>() {}
1890 #elif defined(SECOND)
1891 struct S9 {
1892 static int a, b;
1893 template<int&> void run() {}
1894 template<> void run<b>() {}
1896 #else
1897 S9 s9;
1898 // expected-error@second.h:* {{'TemplateArgument::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'run' with 'b' for 1st template argument}}
1899 // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with 'a' for 1st template argument}}
1900 #endif
1902 #if defined(FIRST)
1903 struct S10 {
1904 static int a, b;
1905 template<int, int&...> void run() {}
1906 template<> void run<1, a>() {}
1908 #elif defined(SECOND)
1909 struct S10 {
1910 static int a, b;
1911 template<int, int&...> void run() {}
1912 template<> void run<1, b>() {}
1914 #else
1915 S10 s10;
1916 // expected-error@second.h:* {{'TemplateArgument::S10' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'run' with 'b' for 2nd template argument}}
1917 // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with 'a' for 2nd template argument}}
1918 #endif
1920 #if defined(FIRST)
1921 struct S11 {
1922 static int a, b;
1923 template<int, int&...> void run() {}
1924 template<> void run<1, a>() {}
1926 #elif defined(SECOND)
1927 struct S11 {
1928 static int a, b;
1929 template<int, int&...> void run() {}
1930 template<> void run<1, a, a>() {}
1932 #else
1933 S11 s11;
1934 // expected-error@second.h:* {{'TemplateArgument::S11' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'run' with 3 template arguments}}
1935 // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with 2 template arguments}}
1936 #endif
1938 #if defined(FIRST)
1939 struct S12 {
1940 template <int> void f(){};
1941 template <> void f<1>(){};
1943 #elif defined(SECOND)
1944 struct S12 {
1945 template <int> void f(){};
1946 template <> void f<2>(){};
1948 #else
1949 S12 s12;
1950 // expected-error@second.h:* {{'TemplateArgument::S12' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with 2 for 1st template argument}}
1951 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with 1 for 1st template argument}}
1952 #endif
1954 #if defined(FIRST)
1955 struct S13 {
1956 template <int> void f(){};
1957 template <> void f<10>(){};
1959 #elif defined(SECOND)
1960 struct S13 {
1961 template <int> void f(){};
1962 template <> void f<10>(){};
1964 #else
1965 S13 s13;
1966 #endif
1968 #if defined(FIRST)
1969 struct S14 {
1970 template <bool, bool> void f(){};
1971 template <> void f<true, false>(){};
1973 #elif defined(SECOND)
1974 struct S14 {
1975 template <bool, bool> void f(){};
1976 template <> void f<false, true>(){};
1978 #else
1979 S14 s14;
1980 // expected-error@second.h:* {{'TemplateArgument::S14' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with 0 for 1st template argument}}
1981 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with 1 for 1st template argument}}
1982 #endif
1984 #if defined(FIRST)
1985 struct S15 {
1986 template <bool, bool> void f(){};
1987 template <> void f<true, true>(){};
1989 #elif defined(SECOND)
1990 struct S15 {
1991 template <bool, bool> void f(){};
1992 template <> void f<true, true>(){};
1994 #else
1995 S15 s15;
1996 #endif
1998 #if defined(FIRST)
1999 struct S16 {
2000 template <int *> void f(){};
2001 template <> void f<nullptr>(){};
2003 #elif defined(SECOND)
2004 struct S16 {
2005 template <int *> void f(){};
2006 template <> void f<nullptr>(){};
2008 #else
2009 S16 s16;
2010 #endif
2012 #if defined(FIRST)
2013 struct S17 {
2014 static int x;
2015 template <int *> void f(){};
2016 template <> void f<&x>(){};
2018 #elif defined(SECOND)
2019 struct S17 {
2020 static int x;
2021 template <int *> void f(){};
2022 template <> void f<nullptr>(){};
2024 #else
2025 S17 s17;
2026 // expected-error@second.h:* {{'TemplateArgument::S17' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with nullptr for 1st template argument}}
2027 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with 'x' for 1st template argument}}
2028 #endif
2030 #if defined(FIRST)
2031 struct S18 {
2032 static int x;
2033 template <int *> void f(){};
2034 template <> void f<&x>(){};
2036 #elif defined(SECOND)
2037 struct S18 {
2038 static int x;
2039 template <int *> void f(){};
2040 template <> void f<&x>(){};
2042 #else
2043 S18 s18;
2044 #endif
2046 #if defined(FIRST)
2047 struct S19 {
2048 static constexpr _BitInt(128) x = static_cast<_BitInt(128)>((unsigned long long)-1);
2049 template <_BitInt(128)> void f(){};
2050 template <> void f<x + x>(){};
2052 #elif defined(SECOND)
2053 struct S19 {
2054 static constexpr _BitInt(128) x = static_cast<_BitInt(128)>((unsigned long long)-1);
2055 template <_BitInt(128)> void f(){};
2056 template <> void f<x + x>(){};
2058 #else
2059 S19 s19;
2060 #endif
2062 #if defined(FIRST)
2063 struct S20 {
2064 static constexpr _BitInt(128) x = static_cast<_BitInt(128)>((unsigned long long)-1);
2065 template <_BitInt(128)> void f(){};
2066 template <> void f<x + x>(){};
2068 #elif defined(SECOND)
2069 struct S20 {
2070 static constexpr _BitInt(128) x = static_cast<_BitInt(128)>((unsigned long long)-1);
2071 template <_BitInt(128)> void f(){};
2072 template <> void f<x>(){};
2074 #else
2075 S20 s20;
2076 // expected-error@second.h:* {{'TemplateArgument::S20' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with 18446744073709551615 for 1st template argument}}
2077 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with 36893488147419103230 for 1st template argument}}
2078 #endif
2080 #if defined(FIRST)
2081 struct S21 {
2082 static constexpr _BitInt(128) x = static_cast<_BitInt(128)>((unsigned long long)-1);
2083 template <_BitInt(128)> void f(){};
2084 template <> void f<x + 0>(){};
2086 #elif defined(SECOND)
2087 struct S21 {
2088 static constexpr _BitInt(128) x = static_cast<_BitInt(128)>((unsigned long long)-1);
2089 template <_BitInt(128)> void f(){};
2090 template <> void f<(unsigned long long)-1>(){};
2092 #else
2093 S21 s21;
2094 #endif
2096 #if defined(FIRST)
2097 struct S22 {
2098 template <double> void f(){};
2099 template <> void f<1.5>(){};
2101 #elif defined(SECOND)
2102 struct S22 {
2103 template <double> void f(){};
2104 template <> void f<1.7>(){};
2106 #else
2107 S22 s22;
2108 // expected-error@second.h:* {{'TemplateArgument::S22' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with 1.700000e+00 for 1st template argument}}
2109 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with 1.500000e+00 for 1st template argument}}
2110 #endif
2112 #if defined(FIRST)
2113 struct S23 {
2114 template <double> void f(){};
2115 template <> void f<2.7>(){};
2117 #elif defined(SECOND)
2118 struct S23 {
2119 template <double> void f(){};
2120 template <> void f<2.7>(){};
2122 #else
2123 S23 s23;
2124 #endif
2126 #if defined(FIRST) || defined(SECOND)
2127 struct Composite {
2128 int n1[4];
2129 int n2[4];
2131 extern Composite composite;
2132 #endif
2134 #if defined(FIRST)
2135 struct S24 {
2136 template <int&> void f(){};
2137 template <> void f<composite.n1[1]>(){};
2139 #elif defined(SECOND)
2140 struct S24 {
2141 template <int&> void f(){};
2142 template <> void f<composite.n1[2]>(){};
2144 #else
2145 S24 s24;
2146 // expected-error@second.h:* {{'TemplateArgument::S24' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with composite.n1[2] for 1st template argument}}
2147 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with composite.n1[1] for 1st template argument}}
2148 #endif
2150 #if defined(FIRST) || defined(SECOND)
2151 struct S25 {
2152 template <int&> void f();
2153 template <> void f<composite.n1[2]>();
2155 #else
2156 S25 s25;
2157 #endif
2159 #if defined(FIRST)
2160 struct S26 {
2161 template <int*> void f(){};
2162 template <> void f<&composite.n1[4]>(){}; // Past-the-end pointer.
2164 #elif defined(SECOND)
2165 struct S26 {
2166 template <int*> void f(){};
2167 template <> void f<&composite.n2[0]>(){};
2169 #else
2170 S26 s26;
2171 // expected-error@second.h:* {{'TemplateArgument::S26' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with &composite.n2[0] for 1st template argument}}
2172 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with &composite.n1[4] for 1st template argument}}
2173 #endif
2175 #if defined(FIRST) || defined(SECOND)
2176 union Union {
2177 int i1;
2178 int i2;
2180 extern Union u;
2181 #endif
2183 #if defined(FIRST)
2184 struct S27 {
2185 template <int&> void f(){};
2186 template <> void f<u.i1>(){};
2188 #elif defined(SECOND)
2189 struct S27 {
2190 template <int&> void f(){};
2191 template <> void f<u.i2>(){};
2193 #else
2194 S27 s27;
2195 // expected-error@second.h:* {{'TemplateArgument::S27' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with u.i2 for 1st template argument}}
2196 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with u.i1 for 1st template argument}}
2197 #endif
2199 #if defined(FIRST) || defined(SECOND)
2200 struct S28 {
2201 template <int&> void f(){};
2202 template <> void f<u.i1>(){};
2204 #else
2205 S28 s28;
2206 #endif
2208 #if defined(FIRST) || defined(SECOND)
2209 struct A {
2210 int a;
2212 struct B : A {};
2213 struct C : A {};
2214 struct D : B, C {};
2215 #endif
2217 #if defined(FIRST)
2218 struct S29 {
2219 template <int D::*> void f(){};
2220 template <> void f<(int D::*)(int B::*)&A::a>(){};
2222 #elif defined(SECOND)
2223 struct S29 {
2224 template <int D::*> void f(){};
2225 template <> void f<(int D::*)(int C::*)&A::a>(){};
2227 #else
2228 S29 s29;
2229 // expected-error@second.h:* {{'TemplateArgument::S29' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with &A::a for 1st template argument}}
2230 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with &A::a for 1st template argument}}
2231 #endif
2233 #if defined(FIRST) || defined(SECOND)
2234 struct S30 {
2235 template <int D::*> void f(){};
2236 template <> void f<(int D::*)(int B::*)&A::a>(){};
2238 #else
2239 S30 s30;
2240 #endif
2242 #if defined(FIRST)
2243 struct S31 {
2244 template <auto*> void f(){};
2245 template <> void f<&composite.n1[2]>(){};
2247 #elif defined(SECOND)
2248 struct S31 {
2249 template <auto*> void f(){};
2250 template <> void f<(void*)&composite.n1[2]>(){};
2252 #else
2253 S31 s31;
2254 // expected-error@second.h:* {{'TemplateArgument::S31' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with &composite.n1[2] for 1st template argument}}
2255 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with &composite.n1[2] for 1st template argument}}
2256 #endif
2258 #if defined(FIRST)
2259 struct S32 {
2260 template <int*> void f(){};
2261 template <> void f<__builtin_constant_p(0) ? (int*)1 : (int*)1>(){};
2263 #elif defined(SECOND)
2264 struct S32 {
2265 template <int*> void f(){};
2266 template <> void f<__builtin_constant_p(0) ? (int*)2 : (int*)2>(){};
2268 #else
2269 S32 s32;
2270 // expected-error@second.h:* {{'TemplateArgument::S32' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'f' with (int *)2 for 1st template argument}}
2271 // expected-note@first.h:* {{but in 'FirstModule' found method 'f' with (int *)1 for 1st template argument}}
2272 #endif
2274 #if defined(FIRST) || defined(SECOND)
2275 struct S33 {
2276 template <int*> void f(){};
2277 template <> void f<__builtin_constant_p(0) ? (int*)1 : (int*)1>(){};
2279 #else
2280 S33 s33;
2281 #endif
2283 #define DECLS \
2284 OneClass<int> a; \
2285 OneInt<1> b; \
2286 using c = OneClass<float>; \
2287 using d = OneInt<2>; \
2288 using e = OneInt<2 + 2>; \
2289 OneTemplateClass<OneClass> f; \
2290 OneTemplateInt<OneInt> g; \
2291 static int i1, i2; \
2292 template <int &> \
2293 void Function() {} \
2294 template <int &, int &> \
2295 void Function() {} \
2296 template <> \
2297 void Function<i1>() {} \
2298 template <> \
2299 void Function<i2>() {} \
2300 template <> \
2301 void Function<i1, i2>() {} \
2302 template <> \
2303 void Function<i2, i1>() {}
2305 #if defined(FIRST) || defined(SECOND)
2306 template <class> struct OneClass{};
2307 template <int> struct OneInt{};
2308 template <template <class> class> struct OneTemplateClass{};
2309 template <template <int> class> struct OneTemplateInt{};
2310 #endif
2312 #if defined(FIRST) || defined(SECOND)
2313 struct Valid1 {
2314 DECLS
2316 #else
2317 Valid1 v1;
2318 #endif
2320 #if defined(FIRST) || defined(SECOND)
2321 struct Invalid1 {
2322 DECLS
2323 ACCESS
2325 #else
2326 Invalid1 i1;
2327 // expected-error@second.h:* {{'TemplateArgument::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
2328 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
2329 #endif
2330 #undef DECLS
2331 } // namespace TemplateArgument
2333 namespace TemplateTypeParmType {
2334 #if defined(FIRST)
2335 template <class T1, class T2>
2336 struct S1 {
2337 T1 x;
2339 #elif defined(SECOND)
2340 template <class T1, class T2>
2341 struct S1 {
2342 T2 x;
2344 #else
2345 using TemplateTypeParmType::S1;
2346 // expected-error@first.h:* {{'TemplateTypeParmType::S1::x' from module 'FirstModule' is not present in definition of 'S1<T1, T2>' in module 'SecondModule'}}
2347 // expected-note@second.h:* {{declaration of 'x' does not match}}
2348 #endif
2350 #if defined(FIRST)
2351 template <int ...Ts>
2352 struct U2 {};
2353 template <int T, int U>
2354 class S2 {
2355 typedef U2<U, T> type;
2356 type x;
2358 #elif defined(SECOND)
2359 template <int ...Ts>
2360 struct U2 {};
2361 template <int T, int U>
2362 class S2 {
2363 typedef U2<T, U> type;
2364 type x;
2366 #else
2367 using TemplateTypeParmType::S2;
2368 // expected-error@first.h:* {{'TemplateTypeParmType::S2::x' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}}
2369 // expected-note@second.h:* {{declaration of 'x' does not match}}
2370 // expected-error@first.h:* {{'TemplateTypeParmType::S2::type' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}}
2371 // expected-note@second.h:* {{declaration of 'type' does not match}}
2372 #endif
2374 #define DECLS \
2375 T t; \
2376 U u; \
2377 ParameterPack<T> a; \
2378 ParameterPack<T, U> b; \
2379 ParameterPack<U> c; \
2380 ParameterPack<U, T> d;
2382 #if defined(FIRST) || defined(SECOND)
2383 template <class ...Ts> struct ParameterPack {};
2384 #endif
2386 #if defined(FIRST) || defined(SECOND)
2387 template <class T, class U>
2388 struct Valid1 {
2389 DECLS
2391 #else
2392 using TemplateTypeParmType::Valid1;
2393 #endif
2395 #if defined(FIRST) || defined(SECOND)
2396 template <class T, class U>
2397 struct Invalid1 {
2398 DECLS
2399 ACCESS
2401 #else
2402 using TemplateTypeParmType::Invalid1;
2403 // expected-error@second.h:* {{'TemplateTypeParmType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
2404 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
2405 #endif
2406 #undef DECLS
2407 } // namespace TemplateTypeParmType
2409 namespace VarDecl {
2410 #if defined(FIRST)
2411 struct S1 {
2412 static int x;
2413 static int y;
2415 #elif defined(SECOND)
2416 struct S1 {
2417 static int y;
2418 static int x;
2420 #else
2421 S1 s1;
2422 // expected-error@second.h:* {{'VarDecl::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found data member with name 'y'}}
2423 // expected-note@first.h:* {{but in 'FirstModule' found data member with name 'x'}}
2424 #endif
2426 #if defined(FIRST)
2427 struct S2 {
2428 static int x;
2430 #elif defined(SECOND)
2431 using I = int;
2432 struct S2 {
2433 static I x;
2435 #else
2436 S2 s2;
2437 // expected-error@second.h:* {{'VarDecl::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found data member 'x' with type 'I' (aka 'int')}}
2438 // expected-note@first.h:* {{but in 'FirstModule' found data member 'x' with different type 'int'}}
2439 #endif
2441 #if defined(FIRST)
2442 struct S3 {
2443 static const int x = 1;
2445 #elif defined(SECOND)
2446 struct S3 {
2447 static const int x;
2449 #else
2450 S3 s3;
2451 // expected-error@second.h:* {{'VarDecl::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found data member 'x' with an initializer}}
2452 // expected-note@first.h:* {{but in 'FirstModule' found data member 'x' without an initializer}}
2453 #endif
2455 #if defined(FIRST)
2456 struct S4 {
2457 static const int x = 1;
2459 #elif defined(SECOND)
2460 struct S4 {
2461 static const int x = 2;
2463 #else
2464 S4 s4;
2465 // expected-error@second.h:* {{'VarDecl::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found data member 'x' with an initializer}}
2466 // expected-note@first.h:* {{but in 'FirstModule' found data member 'x' with a different initializer}}
2467 #endif
2469 #if defined(FIRST)
2470 struct S5 {
2471 static const int x = 1;
2473 #elif defined(SECOND)
2474 struct S5 {
2475 static constexpr int x = 1;
2477 #else
2478 S5 s5;
2479 // expected-error@second.h:* {{'VarDecl::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found data member 'x' is not constexpr}}
2480 // expected-note@first.h:* {{but in 'FirstModule' found data member 'x' is constexpr}}
2481 #endif
2483 #if defined(FIRST)
2484 struct S6 {
2485 static const int x = 1;
2487 #elif defined(SECOND)
2488 struct S6 {
2489 static const int y = 1;
2491 #else
2492 S6 s6;
2493 // expected-error@first.h:* {{'VarDecl::S6::x' from module 'FirstModule' is not present in definition of 'VarDecl::S6' in module 'SecondModule'}}
2494 // expected-note@second.h:* {{definition has no member 'x'}}
2495 #endif
2497 #if defined(FIRST)
2498 struct S7 {
2499 static const int x = 1;
2501 #elif defined(SECOND)
2502 struct S7 {
2503 static const unsigned x = 1;
2505 #else
2506 S7 s7;
2507 // expected-error@first.h:* {{'VarDecl::S7::x' from module 'FirstModule' is not present in definition of 'VarDecl::S7' in module 'SecondModule'}}
2508 // expected-note@second.h:* {{declaration of 'x' does not match}}
2509 #endif
2511 #if defined(FIRST)
2512 struct S8 {
2513 public:
2514 static const int x = 1;
2516 #elif defined(SECOND)
2517 struct S8 {
2518 static const int x = 1;
2519 public:
2521 #else
2522 S8 s8;
2523 // expected-error@second.h:* {{'VarDecl::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found data member}}
2524 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
2525 #endif
2527 #if defined(FIRST)
2528 struct S9 {
2529 static const int x = 1;
2531 #elif defined(SECOND)
2532 struct S9 {
2533 static int x;
2535 #else
2536 S9 s9;
2537 // expected-error@first.h:* {{'VarDecl::S9::x' from module 'FirstModule' is not present in definition of 'VarDecl::S9' in module 'SecondModule'}}
2538 // expected-note@second.h:* {{declaration of 'x' does not match}}
2539 #endif
2541 #define DECLS \
2542 static int a; \
2543 static I b; \
2544 static const int c = 1; \
2545 static constexpr int d = 5;
2547 #if defined(FIRST) || defined(SECOND)
2548 using I = int;
2549 #endif
2551 #if defined(FIRST) || defined(SECOND)
2552 struct Valid1 {
2553 DECLS
2555 #else
2556 Valid1 v1;
2557 #endif
2559 #if defined(FIRST) || defined(SECOND)
2560 struct Invalid1 {
2561 DECLS
2562 ACCESS
2564 #else
2565 Invalid1 i1;
2566 // expected-error@second.h:* {{'VarDecl::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
2567 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
2568 #endif
2569 #undef DECLS
2570 } // namespace VarDecl
2572 namespace Friend {
2573 #if defined(FIRST)
2574 struct T1 {};
2575 struct S1 {
2576 friend class T1;
2578 #elif defined(SECOND)
2579 struct T1 {};
2580 struct S1 {
2581 friend T1;
2583 #else
2584 S1 s1;
2585 // expected-error@second.h:* {{'Friend::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'T1'}}
2586 // expected-note@first.h:* {{but in 'FirstModule' found friend 'class T1'}}
2587 #endif
2589 #if defined(FIRST)
2590 struct T2 {};
2591 struct S2 {
2592 friend class T2;
2594 #elif defined(SECOND)
2595 struct T2 {};
2596 struct S2 {
2597 friend struct T2;
2599 #else
2600 S2 s2;
2601 // expected-error@second.h:* {{'Friend::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'struct T2'}}
2602 // expected-note@first.h:* {{but in 'FirstModule' found friend 'class T2'}}
2603 #endif
2605 #if defined(FIRST)
2606 struct T4 {};
2607 struct S4 {
2608 friend T4;
2610 #elif defined(SECOND)
2611 struct S4 {
2612 friend void T4();
2614 #else
2615 S4 s4;
2616 // expected-error@second.h:* {{'Friend::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend function}}
2617 // expected-note@first.h:* {{but in 'FirstModule' found friend class}}
2618 #endif
2620 #if defined(FIRST)
2621 struct S5 {
2622 friend void T5a();
2624 #elif defined(SECOND)
2625 struct S5 {
2626 friend void T5b();
2628 #else
2629 S5 s5;
2630 // expected-error@second.h:* {{'Friend::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend function 'T5b'}}
2631 // expected-note@first.h:* {{but in 'FirstModule' found friend function 'T5a'}}
2632 #endif
2634 #define DECLS \
2635 friend class FriendA; \
2636 friend struct FriendB; \
2637 friend FriendC; \
2638 friend void Function();
2640 #if defined(FIRST) || defined(SECOND)
2641 class FriendA {};
2642 class FriendB {};
2643 class FriendC {};
2644 #endif
2646 #if defined(FIRST) || defined(SECOND)
2647 struct Valid1 {
2648 DECLS
2650 #else
2651 Valid1 v1;
2652 #endif
2654 #if defined(FIRST) || defined(SECOND)
2655 struct Invalid1 {
2656 DECLS
2657 ACCESS
2659 #else
2660 Invalid1 i1;
2661 // expected-error@second.h:* {{'Friend::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
2662 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
2663 #endif
2664 #undef DECLS
2665 } // namespace Friend
2667 namespace TemplateParameters {
2668 #if defined(FIRST)
2669 template <class A>
2670 struct S1 {};
2671 #elif defined(SECOND)
2672 template <class B>
2673 struct S1 {};
2674 #else
2675 using TemplateParameters::S1;
2676 // expected-error@second.h:* {{'TemplateParameters::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found template parameter 'B'}}
2677 // expected-note@first.h:* {{but in 'FirstModule' found template parameter 'A'}}
2678 #endif
2680 #if defined(FIRST)
2681 template <class A = double>
2682 struct S2 {};
2683 #elif defined(SECOND)
2684 template <class A = int>
2685 struct S2 {};
2686 #else
2687 using TemplateParameters::S2;
2688 // expected-error@second.h:* {{'TemplateParameters::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found template parameter with default argument}}
2689 // expected-note@first.h:* {{but in 'FirstModule' found template parameter with different default argument}}
2690 #endif
2692 #if defined(FIRST)
2693 template <class A = int>
2694 struct S3 {};
2695 #elif defined(SECOND)
2696 template <class A>
2697 struct S3 {};
2698 #else
2699 using TemplateParameters::S3;
2700 // expected-error@second.h:* {{'TemplateParameters::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found template parameter with no default argument}}
2701 // expected-note@first.h:* {{but in 'FirstModule' found template parameter with default argument}}
2702 #endif
2704 #if defined(FIRST)
2705 template <int A>
2706 struct S4 {};
2707 #elif defined(SECOND)
2708 template <int A = 2>
2709 struct S4 {};
2710 #else
2711 using TemplateParameters::S4;
2712 // expected-error@second.h:* {{'TemplateParameters::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found template parameter with default argument}}
2713 // expected-note@first.h:* {{but in 'FirstModule' found template parameter with no default argument}}
2714 #endif
2716 #if defined(FIRST)
2717 template <int> class S5_first {};
2718 template <template<int> class A = S5_first>
2719 struct S5 {};
2720 #elif defined(SECOND)
2721 template <int> class S5_second {};
2722 template <template<int> class A = S5_second>
2723 struct S5 {};
2724 #else
2725 using TemplateParameters::S5;
2726 // expected-error@second.h:* {{'TemplateParameters::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found template parameter with default argument}}
2727 // expected-note@first.h:* {{but in 'FirstModule' found template parameter with different default argument}}
2728 #endif
2730 #if defined(FIRST)
2731 template <class A>
2732 struct S6 {};
2733 #elif defined(SECOND)
2734 template <class>
2735 struct S6 {};
2736 #else
2737 using TemplateParameters::S6;
2738 // expected-error@second.h:* {{'TemplateParameters::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found unnamed template parameter}}
2739 // expected-note@first.h:* {{but in 'FirstModule' found template parameter 'A'}}
2740 #endif
2742 #if defined(FIRST)
2743 template <int A = 7>
2744 struct S7 {};
2745 #elif defined(SECOND)
2746 template <int A = 8>
2747 struct S7 {};
2748 #else
2749 using TemplateParameters::S7;
2750 // expected-error@second.h:* {{'TemplateParameters::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found template parameter with default argument}}
2751 // expected-note@first.h:* {{but in 'FirstModule' found template parameter with different default argument}}
2752 #endif
2754 #if defined(FIRST)
2755 template <int* A = nullptr>
2756 struct S8 {};
2757 #elif defined(SECOND)
2758 inline int S8_default_arg = 0x12345;
2759 template <int* A = &S8_default_arg>
2760 struct S8 {};
2761 #else
2762 using TemplateParameters::S8;
2763 // expected-error@second.h:* {{'TemplateParameters::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found template parameter with default argument}}
2764 // expected-note@first.h:* {{but in 'FirstModule' found template parameter with different default argument}}
2765 #endif
2767 #if defined(FIRST)
2768 template <int A = 43>
2769 struct S9 {};
2770 #elif defined(SECOND)
2771 template <int A = 43>
2772 struct S9 {};
2773 #else
2774 using TemplateParameters::S9;
2775 #endif
2777 #if defined(FIRST)
2778 template <class A = double>
2779 struct S10 {};
2780 #elif defined(SECOND)
2781 template <class A = double>
2782 struct S10 {};
2783 #else
2784 using TemplateParameters::S10;
2785 #endif
2787 #if defined(FIRST)
2788 template <template<int> class A = S9>
2789 struct S11 {};
2790 #elif defined(SECOND)
2791 template <template<int> class A = S9>
2792 struct S11 {};
2793 #else
2794 using TemplateParameters::S11;
2795 #endif
2797 // FIXME: It looks like we didn't implement ODR check for template variables.
2798 // S12, S13 and S14 show this.
2799 #if defined(FIRST)
2800 template <int A = 43>
2801 int S12 {};
2802 #elif defined(SECOND)
2803 template <int A = 44>
2804 int S12 {};
2805 #else
2806 using TemplateParameters::S12;
2807 #endif
2809 #if defined(FIRST)
2810 template <class A = double>
2811 int S13 {};
2812 #elif defined(SECOND)
2813 template <class A = int>
2814 int S13 {};
2815 #else
2816 using TemplateParameters::S13;
2817 #endif
2819 #if defined(FIRST)
2820 template <class A>
2821 int S14 {};
2822 #elif defined(SECOND)
2823 template <class B>
2824 int S14 {};
2825 #else
2826 using TemplateParameters::S14;
2827 #endif
2829 #define DECLS
2831 #if defined(FIRST) || defined(SECOND)
2832 template <class> class DefaultArg;
2833 #endif
2835 #if defined(FIRST) || defined(SECOND)
2836 template <int, class, template <class> class,
2837 int A, class B, template <int> class C,
2838 int D = 1, class E = int, template <class F> class = DefaultArg>
2839 struct Valid1 {
2840 DECLS
2842 #else
2843 using TemplateParameters::Valid1;
2844 #endif
2846 #if defined(FIRST) || defined(SECOND)
2847 template <int, class, template <class> class,
2848 int A, class B, template <int> class C,
2849 int D = 1, class E = int, template <class F> class = DefaultArg>
2850 struct Invalid1 {
2851 DECLS
2852 ACCESS
2854 #else
2855 using TemplateParameters::Invalid1;
2856 // expected-error@second.h:* {{'TemplateParameters::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
2857 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
2858 #endif
2859 #undef DECLS
2860 } // namespace TemplateParameters
2862 namespace BaseClass {
2863 #if defined(FIRST)
2864 struct B1 {};
2865 struct S1 : B1 {};
2866 #elif defined(SECOND)
2867 struct S1 {};
2868 #else
2869 S1 s1;
2870 // expected-error@second.h:* {{'BaseClass::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found 0 base classes}}
2871 // expected-note@first.h:* {{but in 'FirstModule' found 1 base class}}
2872 #endif
2874 #if defined(FIRST)
2875 struct S2 {};
2876 #elif defined(SECOND)
2877 struct B2 {};
2878 struct S2 : virtual B2 {};
2879 #else
2880 S2 s2;
2881 // expected-error@second.h:* {{'BaseClass::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1 base class}}
2882 // expected-note@first.h:* {{but in 'FirstModule' found 0 base classes}}
2883 #endif
2885 #if defined(FIRST)
2886 struct B3a {};
2887 struct S3 : B3a {};
2888 #elif defined(SECOND)
2889 struct B3b {};
2890 struct S3 : virtual B3b {};
2891 #else
2892 S3 s3;
2893 // expected-error@second.h:* {{'BaseClass::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1 virtual base class}}
2894 // expected-note@first.h:* {{but in 'FirstModule' found 0 virtual base classes}}
2895 #endif
2897 #if defined(FIRST)
2898 struct B4a {};
2899 struct S4 : B4a {};
2900 #elif defined(SECOND)
2901 struct B4b {};
2902 struct S4 : B4b {};
2903 #else
2904 S4 s4;
2905 // expected-error@second.h:* {{'BaseClass::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class with type 'B4b'}}
2906 // expected-note@first.h:* {{but in 'FirstModule' found 1st base class with different type 'B4a'}}
2907 #endif
2909 #if defined(FIRST)
2910 struct B5a {};
2911 struct S5 : virtual B5a {};
2912 #elif defined(SECOND)
2913 struct B5a {};
2914 struct S5 : B5a {};
2915 #else
2916 S5 s5;
2917 // expected-error@second.h:* {{'BaseClass::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found 0 virtual base classes}}
2918 // expected-note@first.h:* {{but in 'FirstModule' found 1 virtual base class}}
2919 #endif
2921 #if defined(FIRST)
2922 struct B6a {};
2923 struct S6 : B6a {};
2924 #elif defined(SECOND)
2925 struct B6a {};
2926 struct S6 : virtual B6a {};
2927 #else
2928 S6 s6;
2929 // expected-error@second.h:* {{'BaseClass::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1 virtual base class}}
2930 // expected-note@first.h:* {{but in 'FirstModule' found 0 virtual base classes}}
2931 #endif
2933 #if defined(FIRST)
2934 struct B7a {};
2935 struct S7 : protected B7a {};
2936 #elif defined(SECOND)
2937 struct B7a {};
2938 struct S7 : B7a {};
2939 #else
2940 S7 s7;
2941 // expected-error@second.h:* {{'BaseClass::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class 'B7a' with no access specifier}}
2942 // expected-note@first.h:* {{but in 'FirstModule' found 1st base class 'B7a' with protected access specifier}}
2943 #endif
2945 #if defined(FIRST)
2946 struct B8a {};
2947 struct S8 : public B8a {};
2948 #elif defined(SECOND)
2949 struct B8a {};
2950 struct S8 : private B8a {};
2951 #else
2952 S8 s8;
2953 // expected-error@second.h:* {{'BaseClass::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class 'B8a' with private access specifier}}
2954 // expected-note@first.h:* {{but in 'FirstModule' found 1st base class 'B8a' with public access specifier}}
2955 #endif
2957 #if defined(FIRST)
2958 struct B9a {};
2959 struct S9 : private B9a {};
2960 #elif defined(SECOND)
2961 struct B9a {};
2962 struct S9 : public B9a {};
2963 #else
2964 S9 s9;
2965 // expected-error@second.h:* {{'BaseClass::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class 'B9a' with public access specifier}}
2966 // expected-note@first.h:* {{but in 'FirstModule' found 1st base class 'B9a' with private access specifier}}
2967 #endif
2969 #if defined(FIRST)
2970 struct B10a {};
2971 struct S10 : B10a {};
2972 #elif defined(SECOND)
2973 struct B10a {};
2974 struct S10 : protected B10a {};
2975 #else
2976 S10 s10;
2977 // expected-error@second.h:* {{'BaseClass::S10' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class 'B10a' with protected access specifier}}
2978 // expected-note@first.h:* {{but in 'FirstModule' found 1st base class 'B10a' with no access specifier}}
2979 #endif
2981 #define DECLS
2983 #if defined(FIRST) || defined(SECOND)
2984 struct Base1 {};
2985 struct Base2 {};
2986 struct Base3 {};
2987 struct Base4 {};
2988 struct Base5 {};
2989 #endif
2991 #if defined(FIRST) || defined(SECOND)
2992 struct Valid1 :
2993 Base1, virtual Base2, protected Base3, public Base4, private Base5 {
2995 DECLS
2997 #else
2998 Valid1 v1;
2999 #endif
3001 #if defined(FIRST) || defined(SECOND)
3002 struct Invalid1 :
3003 Base1, virtual Base2, protected Base3, public Base4, private Base5 {
3005 DECLS
3006 ACCESS
3008 #else
3009 Invalid1 i1;
3010 // expected-error@second.h:* {{'BaseClass::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
3011 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
3012 #endif
3013 #undef DECLS
3014 } // namespace BaseClass
3016 namespace PointersAndReferences {
3017 #if defined(FIRST) || defined(SECOND)
3018 template<typename> struct Wrapper{};
3019 #endif
3021 #if defined(FIRST)
3022 struct S1 {
3023 Wrapper<int*> x;
3025 #elif defined(SECOND)
3026 struct S1 {
3027 Wrapper<float*> x;
3029 #else
3030 S1 s1;
3031 // expected-error@first.h:* {{PointersAndReferences::S1::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S1' in module 'SecondModule'}}
3032 // expected-note@second.h:* {{declaration of 'x' does not match}}
3033 #endif
3035 #if defined(FIRST)
3036 struct S2 {
3037 Wrapper<int &&> x;
3039 #elif defined(SECOND)
3040 struct S2 {
3041 Wrapper<float &&> x;
3043 #else
3044 S2 s2;
3045 // expected-error@first.h:* {{PointersAndReferences::S2::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S2' in module 'SecondModule'}}
3046 // expected-note@second.h:* {{declaration of 'x' does not match}}
3047 #endif
3049 #if defined(FIRST)
3050 struct S3 {
3051 Wrapper<int *> x;
3053 #elif defined(SECOND)
3054 struct S3 {
3055 Wrapper<float *> x;
3057 #else
3058 S3 s3;
3059 // expected-error@first.h:* {{PointersAndReferences::S3::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S3' in module 'SecondModule'}}
3060 // expected-note@second.h:* {{declaration of 'x' does not match}}
3061 #endif
3063 #if defined(FIRST)
3064 struct S4 {
3065 Wrapper<int &> x;
3067 #elif defined(SECOND)
3068 struct S4 {
3069 Wrapper<float &> x;
3071 #else
3072 S4 s4;
3073 // expected-error@first.h:* {{PointersAndReferences::S4::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S4' in module 'SecondModule'}}
3074 // expected-note@second.h:* {{declaration of 'x' does not match}}
3075 #endif
3077 #if defined(FIRST)
3078 struct S5 {
3079 Wrapper<S5 *> x;
3081 #elif defined(SECOND)
3082 struct S5 {
3083 Wrapper<const S5 *> x;
3085 #else
3086 S5 s5;
3087 // expected-error@second.h:* {{'PointersAndReferences::S5::x' from module 'SecondModule' is not present in definition of 'PointersAndReferences::S5' in module 'FirstModule'}}
3088 // expected-note@first.h:* {{declaration of 'x' does not match}}
3089 #endif
3091 #if defined(FIRST)
3092 struct S6 {
3093 Wrapper<int &> x;
3095 #elif defined(SECOND)
3096 struct S6 {
3097 Wrapper<const int &> x;
3099 #else
3100 S6 s6;
3101 // expected-error@first.h:* {{PointersAndReferences::S6::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S6' in module 'SecondModule'}}
3102 // expected-note@second.h:* {{declaration of 'x' does not match}}
3103 #endif
3105 #define DECLS \
3106 Wrapper<int *> x1; \
3107 Wrapper<float *> x2; \
3108 Wrapper<const float *> x3; \
3109 Wrapper<int &> x4; \
3110 Wrapper<int &&> x5; \
3111 Wrapper<const int &> x6; \
3112 Wrapper<S1 *> x7; \
3113 Wrapper<S1 &> x8; \
3114 Wrapper<S1 &&> x9;
3116 #if defined(FIRST) || defined(SECOND)
3117 struct Valid1 {
3118 DECLS
3120 #else
3121 Valid1 v1;
3122 #endif
3124 #if defined(FIRST) || defined(SECOND)
3125 struct Invalid1 {
3126 DECLS
3127 ACCESS
3129 #else
3130 Invalid1 i1;
3131 // expected-error@second.h:* {{'PointersAndReferences::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
3132 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
3133 #endif
3134 #undef DECLS
3135 } // namespace PointersAndReferences
3137 namespace FunctionTemplate {
3138 #if defined(FIRST)
3139 struct S1 {
3140 template <int, int> void foo();
3142 #elif defined(SECOND)
3143 struct S1 {
3144 template <int> void foo();
3146 #else
3147 S1 s1;
3148 // expected-error@first.h:* {{'FunctionTemplate::S1::foo' from module 'FirstModule' is not present in definition of 'FunctionTemplate::S1' in module 'SecondModule'}}
3149 // expected-note@second.h:* {{declaration of 'foo' does not match}}
3150 #endif
3152 #if defined(FIRST)
3153 struct S2 {
3154 template <char> void foo();
3156 #elif defined(SECOND)
3157 struct S2 {
3158 template <int> void foo();
3160 #else
3161 S2 s2;
3162 // expected-error@first.h:* {{'FunctionTemplate::S2::foo' from module 'FirstModule' is not present in definition of 'FunctionTemplate::S2' in module 'SecondModule'}}
3163 // expected-note@second.h:* {{declaration of 'foo' does not match}}
3164 #endif
3166 #if defined(FIRST)
3167 struct S3 {
3168 template <int x> void foo();
3170 #elif defined(SECOND)
3171 struct S3 {
3172 template <int y> void foo();
3174 #else
3175 S3 s3;
3176 // expected-error@second.h:* {{'FunctionTemplate::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter named 'y'}}
3177 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter named 'x'}}
3178 #endif
3180 #if defined(FIRST)
3181 struct S4 {
3182 template <int x> void foo();
3184 #elif defined(SECOND)
3185 struct S4 {
3186 template <int x> void bar();
3188 #else
3189 S4 s4;
3190 // expected-error@first.h:* {{'FunctionTemplate::S4::foo' from module 'FirstModule' is not present in definition of 'FunctionTemplate::S4' in module 'SecondModule'}}
3191 // expected-note@second.h:* {{definition has no member 'foo'}}
3192 #endif
3194 #if defined(FIRST)
3195 struct S5 {
3196 template <int x> void foo();
3198 #elif defined(SECOND)
3199 struct S5 {
3200 public:
3201 template <int x> void foo();
3203 #else
3204 S5 s5;
3205 // expected-error@second.h:* {{'FunctionTemplate::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}}
3206 // expected-note@first.h:* {{but in 'FirstModule' found function template}}
3207 #endif
3209 #if defined(FIRST)
3210 struct S6 {
3211 template <typename x = int> void foo();
3213 #elif defined(SECOND)
3214 struct S6 {
3215 template <typename x> void foo();
3217 #else
3218 S6 s6;
3219 // expected-error@second.h:* {{'FunctionTemplate::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with no default argument}}
3220 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument}}
3221 #endif
3223 #if defined(FIRST)
3224 struct S7 {
3225 template <typename x = void> void foo();
3227 #elif defined(SECOND)
3228 struct S7 {
3229 template <typename x = int> void foo();
3231 #else
3232 S7 s7;
3233 // expected-error@second.h:* {{'FunctionTemplate::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with default argument 'int'}}
3234 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument 'void'}}
3235 #endif
3237 #if defined(FIRST)
3238 template <int>
3239 struct U8 {};
3240 struct S8 {
3241 template <template<int> class x = U8> void foo();
3243 #elif defined(SECOND)
3244 template <int>
3245 struct T8 {};
3246 struct S8{
3247 template <template<int> class x = T8> void foo();
3249 #else
3250 S8 s8;
3251 // expected-error@second.h:* {{'FunctionTemplate::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with default argument 'T8'}}
3252 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument 'U8'}}
3253 #endif
3255 #if defined(FIRST)
3256 template <int>
3257 struct U9 {};
3258 struct S9 { S9();
3259 template <template<int> class x = U9> void foo();
3261 #elif defined(SECOND)
3262 struct S9 { S9();
3263 template <template<int> class x> void foo();
3265 #else
3266 S9 s9;
3267 // expected-error@second.h:* {{'FunctionTemplate::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with no default argument}}
3268 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument}}
3269 #endif
3271 #if defined(FIRST)
3272 struct S10 {
3273 template <template<int> class x> void foo();
3274 template <template<typename> class x> void foo();
3276 #elif defined(SECOND)
3277 struct S10 {
3278 template <template<typename> class x> void foo();
3279 template <template<int> class x> void foo();
3281 #else
3282 S10 s10;
3283 // expected-error@second.h:* {{'FunctionTemplate::S10' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with one type}}
3284 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with different type}}
3285 #endif
3287 #if defined(FIRST)
3288 struct S11 {
3289 template <template<int> class x> void foo();
3291 #elif defined(SECOND)
3292 struct S11 {
3293 template <template<int> class> void foo();
3295 #else
3296 S11 s11;
3297 // expected-error@second.h:* {{'FunctionTemplate::S11' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with no name}}
3298 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter named 'x'}}
3299 #endif
3301 #if defined(FIRST)
3302 struct S12 {
3303 template <class> void foo();
3304 template <class, class> void foo();
3306 #elif defined(SECOND)
3307 struct S12 {
3308 template <class, class> void foo();
3309 template <class> void foo();
3311 #else
3312 S12 s12;
3313 // expected-error@second.h:* {{'FunctionTemplate::S12' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 2 template parameters}}
3314 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1 template parameter}}
3315 #endif
3317 #if defined(FIRST)
3318 struct S13 {
3319 template <class = int> void foo();
3321 #elif defined(SECOND)
3322 struct S13 {
3323 template <class = void> void foo();
3325 #else
3326 S13 s13;
3327 // expected-error@second.h:* {{'FunctionTemplate::S13' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with default argument 'void'}}
3328 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument 'int'}}
3329 #endif
3331 #if defined(FIRST)
3332 struct S14 {
3333 template <class = void> void foo();
3335 #elif defined(SECOND)
3336 struct S14 {
3337 template <class> void foo();
3339 #else
3340 S14 s14;
3341 // expected-error@second.h:* {{'FunctionTemplate::S14' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with no default argument}}
3342 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument}}
3343 #endif
3345 #if defined(FIRST)
3346 struct S15 {
3347 template <class> void foo();
3349 #elif defined(SECOND)
3350 struct S15 {
3351 template <class = void> void foo();
3353 #else
3354 S15 s15;
3355 // expected-error@second.h:* {{'FunctionTemplate::S15' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with default argument}}
3356 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with no default argument}}
3357 #endif
3359 #if defined(FIRST)
3360 struct S16 {
3361 template <short> void foo();
3363 #elif defined(SECOND)
3364 struct S16 {
3365 template <short = 1> void foo();
3367 #else
3368 S16 s16;
3369 // expected-error@second.h:* {{'FunctionTemplate::S16' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with default argument}}
3370 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with no default argument}}
3371 #endif
3373 #if defined(FIRST)
3374 struct S17 {
3375 template <short = 2> void foo();
3377 #elif defined(SECOND)
3378 struct S17 {
3379 template <short = 1 + 1> void foo();
3381 #else
3382 S17 s17;
3383 // expected-error@second.h:* {{'FunctionTemplate::S17' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with default argument 1 + 1}}
3384 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument 2}}
3385 #endif
3387 #if defined(FIRST)
3388 struct S18 {
3389 template <short> void foo();
3390 template <int> void foo();
3392 #elif defined(SECOND)
3393 struct S18 {
3394 template <int> void foo();
3395 template <short> void foo();
3397 #else
3398 S18 s18;
3399 // expected-error@second.h:* {{'FunctionTemplate::S18' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter with one type}}
3400 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with different type}}
3401 #endif
3403 #if defined(FIRST)
3404 struct S19 {
3405 template <short> void foo();
3406 template <short...> void foo();
3408 #elif defined(SECOND)
3409 struct S19 {
3410 template <short...> void foo();
3411 template <short> void foo();
3413 #else
3414 S19 s19;
3415 // expected-error@second.h:* {{'FunctionTemplate::S19' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter being a template parameter pack}}
3416 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter not being a template parameter pack}}
3417 #endif
3419 #if defined(FIRST)
3420 struct S20 {
3421 template <class> void foo();
3422 template <class...> void foo();
3424 #elif defined(SECOND)
3425 struct S20 {
3426 template <class...> void foo();
3427 template <class> void foo();
3429 #else
3430 S20 s20;
3431 // expected-error@second.h:* {{'FunctionTemplate::S20' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter being a template parameter pack}}
3432 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter not being a template parameter pack}}
3433 #endif
3435 #if defined(FIRST)
3436 struct S21 {
3437 template <template<class> class...> void foo();
3438 template <template<class> class> void foo();
3440 #elif defined(SECOND)
3441 struct S21 {
3442 template <template<class> class> void foo();
3443 template <template<class> class...> void foo();
3445 #else
3446 S21 s21;
3447 // expected-error@second.h:* {{'FunctionTemplate::S21' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter not being a template parameter pack}}
3448 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter being a template parameter pack}}
3449 #endif
3451 #if defined(FIRST)
3452 struct S22 {
3453 template <template<class> class> void foo();
3454 template <class> void foo();
3455 template <int> void foo();
3457 #elif defined(SECOND)
3458 struct S22 {
3459 template <class> void foo();
3460 template <int> void foo();
3461 template <template<class> class> void foo();
3463 #else
3464 S22 s22;
3465 // expected-error@second.h:* {{'FunctionTemplate::S22' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter being a type template parameter}}
3466 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template paramter being a template template parameter}}
3467 #endif
3469 #if defined(FIRST)
3470 struct S23 {
3471 template <class> void foo();
3472 template <int> void foo();
3473 template <template<class> class> void foo();
3475 #elif defined(SECOND)
3476 struct S23 {
3477 template <int> void foo();
3478 template <template<class> class> void foo();
3479 template <class> void foo();
3481 #else
3482 S23 s23;
3483 // expected-error@second.h:* {{'FunctionTemplate::S23' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter being a non-type template parameter}}
3484 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template paramter being a type template parameter}}
3485 #endif
3487 #if defined(FIRST)
3488 struct S24 {
3489 template <int> void foo();
3490 template <template<class> class> void foo();
3491 template <class> void foo();
3493 #elif defined(SECOND)
3494 struct S24 {
3495 template <template<class> class> void foo();
3496 template <class> void foo();
3497 template <int> void foo();
3499 #else
3500 S24 s24;
3501 // expected-error@second.h:* {{'FunctionTemplate::S24' has different definitions in different modules; first difference is definition in module 'SecondModule' found function template 'foo' with 1st template parameter being a template template parameter}}
3502 // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template paramter being a non-type template parameter}}
3503 #endif
3505 #if defined(FIRST)
3506 struct S25 {
3507 template <int> void foo();
3509 #elif defined(SECOND)
3510 struct S25 {
3511 public:
3512 template <int> void foo();
3514 #else
3515 S25 s25;
3516 // expected-error@second.h:* {{'FunctionTemplate::S25' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}}
3517 // expected-note@first.h:* {{but in 'FirstModule' found function template}}
3518 #endif
3520 #define DECLS \
3521 template <int> \
3522 void nontype1(); \
3523 template <int x> \
3524 void nontype2(); \
3525 template <int, int> \
3526 void nontype3(); \
3527 template <int x = 5> \
3528 void nontype4(); \
3529 template <int... x> \
3530 void nontype5(); \
3532 template <class> \
3533 void type1(); \
3534 template <class x> \
3535 void type2(); \
3536 template <class, class> \
3537 void type3(); \
3538 template <class x = int> \
3539 void type4(); \
3540 template <class... x> \
3541 void type5(); \
3543 template <template <int> class> \
3544 void template1(); \
3545 template <template <int> class x> \
3546 void template2(); \
3547 template <template <int> class, template <int> class> \
3548 void template3(); \
3549 template <template <int> class x = U> \
3550 void template4(); \
3551 template <template <int> class... x> \
3552 void template5();
3554 #if defined(FIRST) || defined(SECOND)
3555 template<int>
3556 struct U {};
3557 struct Valid1 {
3558 DECLS
3560 #else
3561 Valid1 v1;
3562 #endif
3564 #if defined(FIRST) || defined(SECOND)
3565 struct Invalid1 {
3566 DECLS
3567 ACCESS
3569 #else
3570 Invalid1 i1;
3571 // expected-error@second.h:* {{'FunctionTemplate::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
3572 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
3573 #endif
3574 #undef DECLS
3577 namespace Enums {
3578 #if defined(FIRST)
3579 enum E1 { x11 };
3580 #elif defined(SECOND)
3581 enum E1 {};
3582 #else
3583 E1 e1;
3584 // expected-error@first.h:* {{'Enums::x11' from module 'FirstModule' is not present in definition of 'Enums::E1' in module 'SecondModule'}}
3585 // expected-note@second.h:* {{definition has no member 'x11'}}
3586 #endif
3588 #if defined(FIRST)
3589 enum E2 {};
3590 #elif defined(SECOND)
3591 enum E2 { x21 };
3592 #else
3593 E2 e2;
3594 // expected-error@second.h:* {{'Enums::E2' has different definitions in different modules; definition in module 'SecondModule' first difference is enum with 1 element}}
3595 // expected-note@first.h:* {{but in 'FirstModule' found enum with 0 elements}}
3596 #endif
3598 #if defined(FIRST)
3599 enum E3 { x31 };
3600 #elif defined(SECOND)
3601 enum E3 { x32 };
3602 #else
3603 E3 e3;
3604 // expected-error@first.h:* {{'Enums::x31' from module 'FirstModule' is not present in definition of 'Enums::E3' in module 'SecondModule'}}
3605 // expected-note@second.h:* {{definition has no member 'x31'}}
3606 #endif
3608 #if defined(FIRST)
3609 enum E4 { x41 };
3610 #elif defined(SECOND)
3611 enum E4 { x41, x42 };
3612 #else
3613 E4 e4;
3614 // expected-error@second.h:* {{'Enums::E4' has different definitions in different modules; definition in module 'SecondModule' first difference is enum with 2 elements}}
3615 // expected-note@first.h:* {{but in 'FirstModule' found enum with 1 element}}
3616 #endif
3618 #if defined(FIRST)
3619 enum E5 { x51, x52 };
3620 #elif defined(SECOND)
3621 enum E5 { x51 };
3622 #else
3623 E5 e5;
3624 // expected-error@first.h:* {{'Enums::x52' from module 'FirstModule' is not present in definition of 'Enums::E5' in module 'SecondModule'}}
3625 // expected-note@second.h:* {{definition has no member 'x52'}}
3626 #endif
3628 #if defined(FIRST)
3629 enum E6 { x61, x62 };
3630 #elif defined(SECOND)
3631 enum E6 { x62, x61 };
3632 #else
3633 E6 e6;
3634 // expected-error@second.h:* {{'Enums::E6' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st element has name 'x62'}}
3635 // expected-note@first.h:* {{but in 'FirstModule' found 1st element has name 'x61'}}
3636 #endif
3638 #if defined(FIRST)
3639 enum E7 { x71 = 0 };
3640 #elif defined(SECOND)
3641 enum E7 { x71 };
3642 #else
3643 E7 e7;
3644 // expected-error@second.h:* {{'Enums::E7' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st element 'x71' has an initializer}}
3645 // expected-note@first.h:* {{but in 'FirstModule' found 1st element 'x71' does not have an initializer}}
3646 #endif
3648 #if defined(FIRST)
3649 enum E8 { x81 };
3650 #elif defined(SECOND)
3651 enum E8 { x81 = 0 };
3652 #else
3653 E8 e8;
3654 // expected-error@second.h:* {{'Enums::E8' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st element 'x81' does not have an initializer}}
3655 // expected-note@first.h:* {{but in 'FirstModule' found 1st element 'x81' has an initializer}}
3656 #endif
3658 #if defined(FIRST)
3659 enum E9 { x91 = 0, x92 = 1 };
3660 #elif defined(SECOND)
3661 enum E9 { x91 = 0, x92 = 2 - 1 };
3662 #else
3663 E9 e9;
3664 // expected-error@second.h:* {{'Enums::E9' has different definitions in different modules; definition in module 'SecondModule' first difference is 2nd element 'x92' has an initializer}}
3665 // expected-note@first.h:* {{but in 'FirstModule' found 2nd element 'x92' has different initializer}}
3666 #endif
3668 #if defined(FIRST)
3669 enum class E10 : int {};
3670 #elif defined(SECOND)
3671 enum class E10 {};
3672 #else
3673 E10 e10;
3674 // expected-error@second.h:* {{'Enums::E10' has different definitions in different modules; definition in module 'SecondModule' first difference is enum without specified type}}
3675 // expected-note@first.h:* {{but in 'FirstModule' found enum with specified type}}
3676 #endif
3678 #if defined(FIRST)
3679 enum E11 {};
3680 #elif defined(SECOND)
3681 enum E11 : int {};
3682 #else
3683 E11 e11;
3684 // expected-error@second.h:* {{'Enums::E11' has different definitions in different modules; definition in module 'SecondModule' first difference is enum with specified type}}
3685 // expected-note@first.h:* {{but in 'FirstModule' found enum without specified type}}
3686 #endif
3688 #if defined(FIRST)
3689 enum struct E12 : long {};
3690 #elif defined(SECOND)
3691 enum struct E12 : int {};
3692 #else
3693 E12 e12;
3694 // expected-error@second.h:* {{'Enums::E12' has different definitions in different modules; definition in module 'SecondModule' first difference is enum with specified type 'int'}}
3695 // expected-note@first.h:* {{but in 'FirstModule' found enum with specified type 'long'}}
3696 #endif
3698 #if defined(FIRST)
3699 enum struct E13 {};
3700 #elif defined(SECOND)
3701 enum E13 {};
3702 #else
3703 E13 e13;
3704 // expected-error@second.h:* {{'Enums::E13' has different definitions in different modules; definition in module 'SecondModule' first difference is enum that is not scoped}}
3705 // expected-note@first.h:* {{but in 'FirstModule' found enum that is scoped}}
3706 #endif
3708 #if defined(FIRST)
3709 enum E14 {};
3710 #elif defined(SECOND)
3711 enum struct E14 {};
3712 #else
3713 E14 e14;
3714 // expected-error@second.h:* {{'Enums::E14' has different definitions in different modules; definition in module 'SecondModule' first difference is enum that is scoped}}
3715 // expected-note@first.h:* {{but in 'FirstModule' found enum that is not scoped}}
3716 #endif
3718 #if defined(FIRST)
3719 enum class E15 {};
3720 #elif defined(SECOND)
3721 enum struct E15 {};
3722 #else
3723 E15 e15;
3724 // expected-error@second.h:* {{'Enums::E15' has different definitions in different modules; definition in module 'SecondModule' first difference is enum scoped with keyword struct}}
3725 // expected-note@first.h:* {{but in 'FirstModule' found enum scoped with keyword class}}
3726 #endif
3728 #if defined(FIRST)
3729 enum struct E16 {};
3730 #elif defined(SECOND)
3731 enum class E16 {};
3732 #else
3733 E16 e16;
3734 // expected-error@second.h:* {{'Enums::E16' has different definitions in different modules; definition in module 'SecondModule' first difference is enum scoped with keyword class}}
3735 // expected-note@first.h:* {{but in 'FirstModule' found enum scoped with keyword struct}}
3736 #endif
3738 #if defined(FIRST)
3739 enum Valid { v1 = (struct S*)0 == (struct S*)0 };
3740 #elif defined(SECOND)
3741 struct S {};
3742 enum Valid { v1 = (struct S*)0 == (struct S*)0 };
3743 #else
3744 Valid V;
3745 #endif
3746 } // namespace Enums
3748 namespace Types {
3749 namespace Complex {
3750 #if defined(FIRST)
3751 void invalid() {
3752 _Complex float x;
3754 void valid() {
3755 _Complex float x;
3757 #elif defined(SECOND)
3758 void invalid() {
3759 _Complex double x;
3761 void valid() {
3762 _Complex float x;
3764 #else
3765 auto function1 = invalid;
3766 // expected-error@second.h:* {{'Types::Complex::invalid' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
3767 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
3768 auto function2 = valid;
3769 #endif
3770 } // namespace Complex
3772 namespace Decltype {
3773 #if defined(FIRST)
3774 void invalid1() {
3775 decltype(1 + 1) x;
3777 int global;
3778 void invalid2() {
3779 decltype(global) x;
3781 void valid() {
3782 decltype(1.5) x;
3783 decltype(x) y;
3785 #elif defined(SECOND)
3786 void invalid1() {
3787 decltype(2) x;
3789 float global;
3790 void invalid2() {
3791 decltype(global) x;
3793 void valid() {
3794 decltype(1.5) x;
3795 decltype(x) y;
3797 #else
3798 auto function1 = invalid1;
3799 // expected-error@second.h:* {{'Types::Decltype::invalid1' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
3800 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
3801 auto function2 = invalid2;
3802 // FIXME: We should reject the merge of `invalid2` and diagnose about the
3803 // inconsistent definition of `global`.
3804 auto function3 = valid;
3805 #endif
3806 } // namespace Decltype
3808 namespace Auto {
3809 #if defined(FIRST)
3810 void invalid1() {
3811 decltype(auto) x = 1;
3813 void invalid2() {
3814 auto x = 1;
3816 void invalid3() {
3817 __auto_type x = 1;
3819 void valid() {
3820 decltype(auto) x = 1;
3821 auto y = 1;
3822 __auto_type z = 1;
3824 #elif defined(SECOND)
3825 void invalid1() {
3826 auto x = 1;
3828 void invalid2() {
3829 __auto_type x = 1;
3831 void invalid3() {
3832 decltype(auto) x = 1;
3834 void valid() {
3835 decltype(auto) x = 1;
3836 auto y = 1;
3837 __auto_type z = 1;
3839 #else
3840 auto function1 = invalid1;
3841 // expected-error@second.h:* {{'Types::Auto::invalid1' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
3842 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
3843 auto function2 = invalid3;
3844 // expected-error@second.h:* {{'Types::Auto::invalid2' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
3845 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
3846 auto function3 = invalid2;
3847 // expected-error@second.h:* {{'Types::Auto::invalid3' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
3848 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
3849 auto function4 = valid;
3850 #endif
3851 } // namespace Auto
3853 namespace DeducedTemplateSpecialization {
3854 #if defined(FIRST)
3855 template<typename T> struct A {};
3856 A() -> A<int>;
3857 template<typename T> struct B {};
3858 B() -> B<int>;
3860 void invalid1() {
3861 A a{};
3863 void invalid2() {
3864 A a{};
3866 void valid() {
3867 B b{};
3869 #elif defined(SECOND)
3870 template<typename T> struct A {};
3871 A() -> A<float>;
3872 template<typename T> struct B {};
3873 B() -> B<int>;
3875 void invalid1() {
3876 A a{};
3878 void invalid2() {
3879 B a{};
3881 void valid() {
3882 B b{};
3884 #else
3885 auto function1 = invalid1;
3886 // FIXME: We should reject the merge of `invalid1` due to the inconsistent definition.
3887 auto function2 = invalid2;
3888 // expected-error@second.h:* {{'Types::DeducedTemplateSpecialization::invalid2' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
3889 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
3890 auto function3 = valid;
3891 #endif
3892 } // namespace DeducedTemplateSpecialization
3894 namespace DependentAddressSpace {
3895 #if defined(FIRST)
3896 template <int A1, int A2>
3897 void invalid1() {
3898 using type = int __attribute__((address_space(A1)));
3900 template <int A1>
3901 void invalid2() {
3902 using type = float __attribute__((address_space(A1)));
3904 template <int A1, int A2>
3905 void valid() {
3906 using type1 = float __attribute__((address_space(A1)));
3907 using type2 = int __attribute__((address_space(A2)));
3908 using type3 = int __attribute__((address_space(A1 + A2)));
3910 #elif defined(SECOND)
3911 template <int A1, int A2>
3912 void invalid1() {
3913 using type = int __attribute__((address_space(A2)));
3915 template <int A1>
3916 void invalid2() {
3917 using type = int __attribute__((address_space(A1)));
3919 template <int A1, int A2>
3920 void valid() {
3921 using type1 = float __attribute__((address_space(A1)));
3922 using type2 = int __attribute__((address_space(A2)));
3923 using type3 = int __attribute__((address_space(A1 + A2)));
3925 #else
3926 template <int A, int B>
3927 class S {
3928 static auto function1 = invalid1<A, B>;
3929 // expected-error@first.h:* {{'Types::DependentAddressSpace::invalid1' has different definitions in different modules; definition in module 'FirstModule' first difference is function body}}
3930 // expected-note@second.h:* {{but in 'SecondModule' found a different body}}
3931 static auto function2 = invalid2<B>;
3932 // expected-error@first.h:* {{'Types::DependentAddressSpace::invalid2' has different definitions in different modules; definition in module 'FirstModule' first difference is function body}}
3933 // expected-note@second.h:* {{but in 'SecondModule' found a different body}}
3934 static auto function3 = valid<A, B>;
3936 #endif
3937 } // namespace DependentAddressSpace
3939 namespace DependentSizedExtVector {
3940 #if defined(FIRST)
3941 template<int Size>
3942 void invalid1() {
3943 typedef int __attribute__((ext_vector_type(Size))) type;
3945 template<int Size>
3946 void invalid2() {
3947 typedef int __attribute__((ext_vector_type(Size + 0))) type;
3949 template<int Size>
3950 void valid() {
3951 typedef int __attribute__((ext_vector_type(Size))) type;
3953 #elif defined(SECOND)
3954 template<int Size>
3955 void invalid1() {
3956 typedef float __attribute__((ext_vector_type(Size))) type;
3958 template<int Size>
3959 void invalid2() {
3960 typedef int __attribute__((ext_vector_type(Size + 1))) type;
3962 template<int Size>
3963 void valid() {
3964 typedef int __attribute__((ext_vector_type(Size))) type;
3966 #else
3967 template <int Num>
3968 class S {
3969 static auto Function1 = invalid1<Num>;
3970 // expected-error@first.h:* {{'Types::DependentSizedExtVector::invalid1' has different definitions in different modules; definition in module 'FirstModule' first difference is function body}}
3971 // expected-note@second.h:* {{but in 'SecondModule' found a different body}}
3972 static auto Function2 = invalid2<Num>;
3973 // expected-error@first.h:* {{'Types::DependentSizedExtVector::invalid2' has different definitions in different modules; definition in module 'FirstModule' first difference is function body}}
3974 // expected-note@second.h:* {{but in 'SecondModule' found a different body}}
3975 static auto Function3 = valid<Num>;
3977 #endif
3978 } // namespace DependentSizedExtVector
3980 namespace InjectedClassName {
3981 #if defined(FIRST)
3982 struct Invalid {
3983 template <int>
3984 struct L2 {
3985 template <int>
3986 struct L3 {
3987 L3 *x;
3991 struct Valid {
3992 template <int>
3993 struct L2 {
3994 template <int>
3995 struct L3 {
3996 L2 *x;
3997 L3 *y;
4001 #elif defined(SECOND)
4002 struct Invalid {
4003 template <int>
4004 struct L2 {
4005 template <int>
4006 struct L3 {
4007 L2 *x;
4011 struct Valid {
4012 template <int>
4013 struct L2 {
4014 template <int>
4015 struct L3 {
4016 L2 *x;
4017 L3 *y;
4021 #else
4022 Invalid::L2<1>::L3<1> invalid;
4023 // expected-error@second.h:* {{'Types::InjectedClassName::Invalid::L2::L3::x' from module 'SecondModule' is not present in definition of 'L3<>' in module 'FirstModule'}}
4024 // expected-note@first.h:* {{declaration of 'x' does not match}}
4025 Valid::L2<1>::L3<1> valid;
4026 #endif
4027 } // namespace InjectedClassName
4029 namespace MemberPointer {
4030 #if defined(FIRST)
4031 struct A {};
4032 struct B {};
4034 void Invalid1() {
4035 int A::*x;
4037 void Invalid2() {
4038 int A::*x;
4040 void Invalid3() {
4041 int (A::*x)(int);
4043 void Valid() {
4044 int A::*x;
4045 float A::*y;
4046 bool B::*z;
4047 void (A::*fun1)();
4048 int (A::*fun2)();
4049 void (B::*fun3)(int);
4050 void (B::*fun4)(bool*, int);
4052 #elif defined(SECOND)
4053 struct A {};
4054 struct B {};
4056 void Invalid1() {
4057 float A::*x;
4059 void Invalid2() {
4060 int B::*x;
4062 void Invalid3() {
4063 int (A::*x)(int, int);
4065 void Valid() {
4066 int A::*x;
4067 float A::*y;
4068 bool B::*z;
4069 void (A::*fun1)();
4070 int (A::*fun2)();
4071 void (B::*fun3)(int);
4072 void (B::*fun4)(bool*, int);
4074 #else
4075 auto function1 = Invalid1;
4076 // expected-error@second.h:* {{'Types::MemberPointer::Invalid1' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
4077 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
4078 auto function2 = Invalid2;
4079 // expected-error@second.h:* {{'Types::MemberPointer::Invalid2' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
4080 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
4081 auto function3 = Invalid3;
4082 // expected-error@second.h:* {{'Types::MemberPointer::Invalid3' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
4083 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
4084 auto function4 = Valid;
4085 #endif
4087 } // namespace MemberPointer
4089 namespace PackExpansion {
4090 #if defined(FIRST)
4091 struct Invalid {
4092 template <class... A>
4093 struct L2 {
4094 template <class... B>
4095 struct L3 {
4096 void run(A...);
4097 void run(B...);
4101 struct Valid {
4102 template <class... A>
4103 struct L2 {
4104 template <class... B>
4105 struct L3 {
4106 void run(A...);
4107 void run(B...);
4111 #elif defined(SECOND)
4112 struct Invalid {
4113 template <class... A>
4114 struct L2 {
4115 template <class... B>
4116 struct L3 {
4117 void run(B...);
4118 void run(A...);
4122 struct Valid {
4123 template <class... A>
4124 struct L2 {
4125 template <class... B>
4126 struct L3 {
4127 void run(A...);
4128 void run(B...);
4132 #else
4133 Invalid::L2<int>::L3<short, bool> invalid;
4134 // expected-error@first.h:* {{'Types::PackExpansion::Invalid::L2::L3' has different definitions in different modules; first difference is definition in module 'FirstModule' found method 'run' with 1st parameter of type 'A...'}}
4135 // expected-note@second.h:* {{but in 'SecondModule' found method 'run' with 1st parameter of type 'B...'}}
4136 Valid::L2<int>::L3<short, bool> valid;
4137 #endif
4139 } // namespace PackExpansion
4141 namespace Paren {
4142 #if defined(FIRST)
4143 void invalid() {
4144 int (*x);
4146 void valid() {
4147 int (*x);
4149 #elif defined(SECOND)
4150 void invalid() {
4151 float (*x);
4153 void valid() {
4154 int (*x);
4156 #else
4157 auto function1 = invalid;
4158 // expected-error@second.h:* {{'Types::Paren::invalid' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
4159 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
4160 auto function2 = valid;
4161 #endif
4162 } // namespace Paren
4164 namespace SubstTemplateTypeParm {
4165 #if defined(FIRST)
4166 template <class> struct wrapper {};
4167 template <class, class, class> struct triple {};
4168 struct Valid {
4169 template <class T,
4170 template <class _T, class _U, class = wrapper<_T>> class A = triple>
4171 struct L2 {
4172 A<T, T> x;
4175 #elif defined(SECOND)
4176 template <class> struct wrapper {};
4177 template <class, class, class> struct triple {};
4178 struct Valid {
4179 template <class T,
4180 template <class _T, class _U, class = wrapper<_T>> class A = triple>
4181 struct L2 {
4182 A<T, T> x;
4185 #else
4186 template <class T,
4187 template <class _T, class _U, class = wrapper<_T>> class A = triple>
4188 using V = Valid::L2<T, A>;
4189 #endif
4190 } // namespace SubstTemplateTypeParm
4192 namespace SubstTemplateTypeParmPack {
4193 } // namespace SubstTemplateTypeParmPack
4195 namespace UnaryTransform {
4196 #if defined(FIRST)
4197 enum class E1a : unsigned {};
4198 struct Invalid1 {
4199 __underlying_type(E1a) x;
4201 enum E2a : unsigned {};
4202 struct Invalid2 {
4203 __underlying_type(E2a) x;
4205 enum E3a {};
4206 struct Invalid3 {
4207 __underlying_type(E3a) x;
4209 enum E4a {};
4210 struct Invalid4 {
4211 __underlying_type(E4a) x;
4213 enum E1 {};
4214 struct Valid1 {
4215 __underlying_type(E1) x;
4217 enum E2 : unsigned {};
4218 struct Valid2 {
4219 __underlying_type(E2) x;
4221 enum class E3 {};
4222 struct Valid3 {
4223 __underlying_type(E3) x;
4225 #elif defined(SECOND)
4226 enum class E1b : signed {};
4227 struct Invalid1 {
4228 __underlying_type(E1b) x;
4230 enum class E2b : unsigned {};
4231 struct Invalid2 {
4232 __underlying_type(E2b) x;
4234 enum E3b : int {};
4235 struct Invalid3 {
4236 __underlying_type(E3b) x;
4238 enum E4b {};
4239 struct Invalid4 {
4240 __underlying_type(E4b) x;
4242 #else
4243 Invalid1 i1;
4244 // expected-error@first.h:* {{'Types::UnaryTransform::Invalid1::x' from module 'FirstModule' is not present in definition of 'Types::UnaryTransform::Invalid1' in module 'SecondModule'}}
4245 // expected-note@second.h:* {{declaration of 'x' does not match}}
4246 Invalid2 i2;
4247 // expected-error@second.h:* {{'Types::UnaryTransform::Invalid2' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type '__underlying_type(E2b)' (aka 'unsigned int')}}
4248 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type '__underlying_type(E2a)' (aka 'unsigned int')}}
4249 Invalid3 i3;
4250 // expected-error@first.h:* {{'Types::UnaryTransform::Invalid3::x' from module 'FirstModule' is not present in definition of 'Types::UnaryTransform::Invalid3' in module 'SecondModule'}}
4251 // expected-note@second.h:* {{declaration of 'x' does not match}}
4252 Invalid4 i4;
4253 // expected-error@second.h:* {{'Types::UnaryTransform::Invalid4' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type '__underlying_type(E4b)' (aka 'unsigned int')}}
4254 // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type '__underlying_type(E4a)' (aka 'unsigned int')}}
4255 Valid1 v1;
4256 Valid2 v2;
4257 Valid3 v3;
4258 #endif
4259 } // namespace UnaryTransform
4261 namespace UnresolvedUsing {
4262 #if defined(FIRST)
4263 template <class T> struct wrapper {};
4264 template <class T>
4265 struct Invalid {
4266 using typename wrapper<T>::T1;
4267 using typename wrapper<T>::T2;
4268 T1 x;
4270 template <class T>
4271 struct Valid {
4272 using typename wrapper<T>::T1;
4273 using typename wrapper<T>::T2;
4274 T1 x;
4275 T2 y;
4277 #elif defined(SECOND)
4278 template <class T> struct wrapper {};
4279 template <class T>
4280 struct Invalid {
4281 using typename wrapper<T>::T1;
4282 using typename wrapper<T>::T2;
4283 T2 x;
4285 template <class T>
4286 struct Valid {
4287 using typename wrapper<T>::T1;
4288 using typename wrapper<T>::T2;
4289 T1 x;
4290 T2 y;
4292 #else
4293 template <class T> using I = Invalid<T>;
4294 // expected-error@first.h:* {{'Types::UnresolvedUsing::Invalid::x' from module 'FirstModule' is not present in definition of 'Invalid<T>' in module 'SecondModule'}}
4295 // expected-note@second.h:* {{declaration of 'x' does not match}}
4297 template <class T> using V = Valid<T>;
4298 #endif
4300 } // namespace UnresolvedUsing
4302 // Vector
4303 // void invalid1() {
4304 // __attribute((vector_size(8))) int *x1;
4307 } // namespace Types
4309 // Collection of interesting cases below.
4311 // Naive parsing of AST can lead to cycles in processing. Ensure
4312 // self-references don't trigger an endless cycles of AST node processing.
4313 namespace SelfReference {
4314 #if defined(FIRST)
4315 template <template <int> class T> class Wrapper {};
4317 template <int N> class S {
4318 S(Wrapper<::SelfReference::S> &Ref) {}
4321 struct Xx {
4322 struct Yy {
4326 Xx::Xx::Xx::Yy yy;
4328 namespace NNS {
4329 template <typename> struct Foo;
4330 template <template <class> class T = NNS::Foo>
4331 struct NestedNamespaceSpecifier {};
4333 #endif
4334 } // namespace SelfReference
4336 namespace FriendFunction {
4337 #if defined(FIRST)
4338 void F(int = 0);
4339 struct S { friend void F(int); };
4340 #elif defined(SECOND)
4341 void F(int);
4342 struct S { friend void F(int); };
4343 #else
4344 S s;
4345 #endif
4347 #if defined(FIRST)
4348 void G(int = 0);
4349 struct T {
4350 friend void G(int);
4352 private:
4354 #elif defined(SECOND)
4355 void G(int);
4356 struct T {
4357 friend void G(int);
4359 public:
4361 #else
4362 T t;
4363 // expected-error@second.h:* {{'FriendFunction::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}}
4364 // expected-note@first.h:* {{but in 'FirstModule' found private access specifier}}
4365 #endif
4366 } // namespace FriendFunction
4368 namespace ImplicitDecl {
4369 #if defined(FIRST)
4370 struct S { };
4371 void S_Constructors() {
4372 // Trigger creation of implicit contructors
4373 S foo;
4374 S bar = foo;
4375 S baz(bar);
4377 #elif defined(SECOND)
4378 struct S { };
4379 #else
4380 S s;
4381 #endif
4383 #if defined(FIRST)
4384 struct T {
4385 private:
4387 void T_Constructors() {
4388 // Trigger creation of implicit contructors
4389 T foo;
4390 T bar = foo;
4391 T baz(bar);
4393 #elif defined(SECOND)
4394 struct T {
4395 public:
4397 #else
4398 T t;
4399 // expected-error@first.h:* {{'ImplicitDecl::T' has different definitions in different modules; first difference is definition in module 'FirstModule' found private access specifier}}
4400 // expected-note@second.h:* {{but in 'SecondModule' found public access specifier}}
4401 #endif
4403 } // namespace ImplicitDecl
4405 namespace TemplatedClass {
4406 #if defined(FIRST)
4407 template <class>
4408 struct S {};
4409 #elif defined(SECOND)
4410 template <class>
4411 struct S {};
4412 #else
4413 S<int> s;
4414 #endif
4416 #if defined(FIRST)
4417 template <class>
4418 struct T {
4419 private:
4421 #elif defined(SECOND)
4422 template <class>
4423 struct T {
4424 public:
4426 #else
4427 T<int> t;
4428 // expected-error@second.h:* {{'TemplatedClass::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}}
4429 // expected-note@first.h:* {{but in 'FirstModule' found private access specifier}}
4430 #endif
4431 } // namespace TemplatedClass
4433 namespace TemplateClassWithField {
4434 #if defined(FIRST)
4435 template <class A>
4436 struct S {
4437 A a;
4439 #elif defined(SECOND)
4440 template <class A>
4441 struct S {
4442 A a;
4444 #else
4445 S<int> s;
4446 #endif
4448 #if defined(FIRST)
4449 template <class A>
4450 struct T {
4451 A a;
4453 private:
4455 #elif defined(SECOND)
4456 template <class A>
4457 struct T {
4458 A a;
4460 public:
4462 #else
4463 T<int> t;
4464 // expected-error@second.h:* {{'TemplateClassWithField::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}}
4465 // expected-note@first.h:* {{but in 'FirstModule' found private access specifier}}
4466 #endif
4467 } // namespace TemplateClassWithField
4469 namespace TemplateClassWithTemplateField {
4470 #if defined(FIRST)
4471 template <class A>
4472 class WrapperS;
4473 template <class A>
4474 struct S {
4475 WrapperS<A> a;
4477 #elif defined(SECOND)
4478 template <class A>
4479 class WrapperS;
4480 template <class A>
4481 struct S {
4482 WrapperS<A> a;
4484 #else
4485 template <class A>
4486 class WrapperS{};
4487 S<int> s;
4488 #endif
4490 #if defined(FIRST)
4491 template <class A>
4492 class WrapperT;
4493 template <class A>
4494 struct T {
4495 WrapperT<A> a;
4497 public:
4499 #elif defined(SECOND)
4500 template <class A>
4501 class WrapperT;
4502 template <class A>
4503 struct T {
4504 WrapperT<A> a;
4506 private:
4508 #else
4509 template <class A>
4510 class WrapperT{};
4511 T<int> t;
4512 // expected-error@second.h:* {{'TemplateClassWithTemplateField::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
4513 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
4514 #endif
4515 } // namespace TemplateClassWithTemplateField
4517 namespace EnumWithForwardDeclaration {
4518 #if defined(FIRST)
4519 enum E : int;
4520 struct S {
4521 void get(E) {}
4523 #elif defined(SECOND)
4524 enum E : int { A, B };
4525 struct S {
4526 void get(E) {}
4528 #else
4529 S s;
4530 #endif
4532 #if defined(FIRST)
4533 struct T {
4534 void get(E) {}
4535 public:
4537 #elif defined(SECOND)
4538 struct T {
4539 void get(E) {}
4540 private:
4542 #else
4543 T t;
4544 // expected-error@second.h:* {{'EnumWithForwardDeclaration::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
4545 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
4546 #endif
4547 } // namespace EnumWithForwardDeclaration
4549 namespace StructWithForwardDeclaration {
4550 #if defined(FIRST)
4551 struct P {};
4552 struct S {
4553 struct P *ptr;
4555 #elif defined(SECOND)
4556 struct S {
4557 struct P *ptr;
4559 #else
4560 S s;
4561 #endif
4563 #if defined(FIRST)
4564 struct Q {};
4565 struct T {
4566 struct Q *ptr;
4567 public:
4569 #elif defined(SECOND)
4570 struct T {
4571 struct Q *ptr;
4572 private:
4574 #else
4575 T t;
4576 // expected-error@second.h:* {{'StructWithForwardDeclaration::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
4577 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
4578 #endif
4579 } // namespace StructWithForwardDeclaration
4581 namespace StructWithForwardDeclarationNoDefinition {
4582 #if defined(FIRST)
4583 struct P;
4584 struct S {
4585 struct P *ptr;
4587 #elif defined(SECOND)
4588 struct S {
4589 struct P *ptr;
4591 #else
4592 S s;
4593 #endif
4595 #if defined(FIRST)
4596 struct Q;
4597 struct T {
4598 struct Q *ptr;
4600 public:
4602 #elif defined(SECOND)
4603 struct T {
4604 struct Q *ptr;
4606 private:
4608 #else
4609 T t;
4610 // expected-error@second.h:* {{'StructWithForwardDeclarationNoDefinition::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}}
4611 // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}}
4612 #endif
4613 } // namespace StructWithForwardDeclarationNoDefinition
4615 namespace LateParsedDefaultArgument {
4616 #if defined(FIRST)
4617 template <typename T>
4618 struct S {
4619 struct R {
4620 void foo(T x = 0) {}
4623 #elif defined(SECOND)
4624 #else
4625 void run() {
4626 S<int>::R().foo();
4628 #endif
4629 } // namespace LateParsedDefaultArgument
4631 namespace LateParsedDefaultArgument {
4632 #if defined(FIRST)
4633 template <typename alpha> struct Bravo {
4634 void charlie(bool delta = false) {}
4636 typedef Bravo<char> echo;
4637 echo foxtrot;
4639 Bravo<char> golf;
4640 #elif defined(SECOND)
4641 #else
4642 #endif
4643 } // LateParsedDefaultArgument
4645 namespace DifferentParameterNameInTemplate {
4646 #if defined(FIRST) || defined(SECOND)
4647 template <typename T>
4648 struct S {
4649 typedef T Type;
4651 static void Run(const Type *name_one);
4654 template <typename T>
4655 void S<T>::Run(const T *name_two) {}
4657 template <typename T>
4658 struct Foo {
4659 ~Foo() { Handler::Run(nullptr); }
4660 Foo() {}
4662 class Handler : public S<T> {};
4664 void Get(typename Handler::Type *x = nullptr) {}
4665 void Add() { Handler::Run(nullptr); }
4667 #endif
4669 #if defined(FIRST)
4670 struct Beta;
4672 struct Alpha {
4673 Alpha();
4674 void Go() { betas.Get(); }
4675 Foo<Beta> betas;
4678 #elif defined(SECOND)
4679 struct Beta {};
4681 struct BetaHelper {
4682 void add_Beta() { betas.Add(); }
4683 Foo<Beta> betas;
4686 #else
4687 Alpha::Alpha() {}
4688 #endif
4689 } // DifferentParameterNameInTemplate
4691 namespace ParameterTest {
4692 #if defined(FIRST)
4693 class X {};
4694 template <typename G>
4695 class S {
4696 public:
4697 typedef G Type;
4698 static inline G *Foo(const G *a, int * = nullptr);
4701 template<typename G>
4702 G* S<G>::Foo(const G* aaaa, int*) {}
4703 #elif defined(SECOND)
4704 template <typename G>
4705 class S {
4706 public:
4707 typedef G Type;
4708 static inline G *Foo(const G *a, int * = nullptr);
4711 template<typename G>
4712 G* S<G>::Foo(const G* asdf, int*) {}
4713 #else
4714 S<X> s;
4715 // expected-error@first.h:* {{'ParameterTest::S::Foo' has different definitions in different modules; definition in module 'FirstModule' first difference is 1st parameter with name 'aaaa'}}
4716 // expected-note@second.h:* {{but in 'SecondModule' found 1st parameter with name 'asdf'}}
4717 #endif
4718 } // ParameterTest
4720 namespace MultipleTypedefs {
4721 #if defined(FIRST)
4722 typedef int B1;
4723 typedef B1 A1;
4724 struct S1 {
4725 A1 x;
4727 #elif defined(SECOND)
4728 typedef int A1;
4729 struct S1 {
4730 A1 x;
4732 #else
4733 S1 s1;
4734 #endif
4736 #if defined(FIRST)
4737 struct T2 { int x; };
4738 typedef T2 B2;
4739 typedef B2 A2;
4740 struct S2 {
4741 T2 x;
4743 #elif defined(SECOND)
4744 struct T2 { int x; };
4745 typedef T2 A2;
4746 struct S2 {
4747 T2 x;
4749 #else
4750 S2 s2;
4751 #endif
4753 #if defined(FIRST)
4754 using A3 = const int;
4755 using B3 = volatile A3;
4756 struct S3 {
4757 B3 x = 1;
4759 #elif defined(SECOND)
4760 using A3 = volatile const int;
4761 using B3 = A3;
4762 struct S3 {
4763 B3 x = 1;
4765 #else
4766 S3 s3;
4767 #endif
4769 #if defined(FIRST)
4770 using A4 = int;
4771 using B4 = A4;
4772 struct S4 {
4773 B4 x;
4775 #elif defined(SECOND)
4776 using A4 = int;
4777 using B4 = ::MultipleTypedefs::A4;
4778 struct S4 {
4779 B4 x;
4781 #else
4782 S4 s4;
4783 #endif
4785 #if defined(FIRST)
4786 using A5 = int;
4787 using B5 = MultipleTypedefs::A5;
4788 struct S5 {
4789 B5 x;
4791 #elif defined(SECOND)
4792 using A5 = int;
4793 using B5 = ::MultipleTypedefs::A5;
4794 struct S5 {
4795 B5 x;
4797 #else
4798 S5 s5;
4799 #endif
4800 } // MultipleTypedefs
4802 namespace DefaultArguments {
4803 #if defined(FIRST)
4804 template <typename T>
4805 struct S {
4806 struct R {
4807 void foo(T x = 0);
4810 #elif defined(SECOND)
4811 template <typename T>
4812 struct S {
4813 struct R {
4814 void foo(T x = 1);
4817 #else
4818 void run() {
4819 S<int>::R().foo();
4821 // expected-error@second.h:* {{'DefaultArguments::S::R' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'foo' with 1st parameter with a default argument}}
4822 // expected-note@first.h:* {{but in 'FirstModule' found method 'foo' with 1st parameter with a different default argument}}
4823 #endif
4825 #if defined(FIRST)
4826 template <typename alpha> struct Bravo {
4827 void charlie(bool delta = false);
4829 typedef Bravo<char> echo;
4830 echo foxtrot;
4831 #elif defined(SECOND)
4832 template <typename alpha> struct Bravo {
4833 void charlie(bool delta = (false));
4835 typedef Bravo<char> echo;
4836 echo foxtrot;
4837 #else
4838 Bravo<char> golf;
4839 // expected-error@second.h:* {{'DefaultArguments::Bravo' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'charlie' with 1st parameter with a default argument}}
4840 // expected-note@first.h:* {{but in 'FirstModule' found method 'charlie' with 1st parameter with a different default argument}}
4841 #endif
4842 } // namespace DefaultArguments
4844 namespace FunctionDecl {
4845 #if defined(FIRST)
4846 struct S1 {};
4847 S1 s1a;
4848 #elif defined(SECOND)
4849 struct S1 {};
4850 #else
4851 S1 s1;
4852 #endif
4854 #if defined(FIRST)
4855 struct S2 {
4856 S2() = default;
4858 S2 s2a = S2();
4859 #elif defined(SECOND)
4860 struct S2 {
4861 S2() = default;
4863 #else
4864 S2 s2;
4865 #endif
4867 #if defined(FIRST)
4868 struct S3 {
4869 S3() = delete;
4871 S3* s3c;
4872 #elif defined(SECOND)
4873 struct S3 {
4874 S3() = delete;
4876 #else
4877 S3* s3;
4878 #endif
4880 #if defined(FIRST) || defined(SECOND)
4881 int F1(int x, float y = 2.7) { return 1; }
4882 #else
4883 int I1 = F1(1);
4884 #endif
4886 #if defined(FIRST)
4887 int F2() { return 1; }
4888 #elif defined(SECOND)
4889 double F2() { return 1; }
4890 #else
4891 int I2 = F2();
4892 // expected-error@-1 {{call to 'F2' is ambiguous}}
4893 // expected-note@first.h:* {{candidate function}}
4894 // expected-note@second.h:* {{candidate function}}
4895 #endif
4897 #if defined(FIRST)
4898 int F3(float) { return 1; }
4899 #elif defined(SECOND)
4900 int F3(double) { return 1; }
4901 #else
4902 int I3 = F3(1);
4903 // expected-error@-1 {{call to 'F3' is ambiguous}}
4904 // expected-note@first.h:* {{candidate function}}
4905 // expected-note@second.h:* {{candidate function}}
4906 #endif
4908 #if defined(FIRST)
4909 int F4(int x) { return 1; }
4910 #elif defined(SECOND)
4911 int F4(int y) { return 1; }
4912 #else
4913 int I4 = F4(1);
4914 // expected-error@second.h:* {{'FunctionDecl::F4' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st parameter with name 'y'}}
4915 // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with name 'x'}}
4916 #endif
4918 #if defined(FIRST)
4919 int F5(int x) { return 1; }
4920 #elif defined(SECOND)
4921 int F5(int x = 1) { return 1; }
4922 #else
4923 int I5 = F6(1);
4924 // expected-error@second.h:* {{'FunctionDecl::F5' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st parameter without a default argument}}
4925 // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with a default argument}}
4926 #endif
4928 #if defined(FIRST)
4929 int F6(int x = 2) { return 1; }
4930 #elif defined(SECOND)
4931 int F6(int x = 1) { return 1; }
4932 #else
4933 int I6 = F6(1);
4934 // expected-error@second.h:* {{'FunctionDecl::F6' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st parameter with a default argument}}
4935 // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with a different default argument}}
4936 #endif
4938 using I = int;
4939 #if defined(FIRST)
4940 I F7() { return 0; }
4941 #elif defined(SECOND)
4942 int F7() { return 0; }
4943 #else
4944 int I7 = F7();
4945 // expected-error@second.h:* {{'FunctionDecl::F7' has different definitions in different modules; definition in module 'SecondModule' first difference is return type is 'int'}}
4946 // expected-note@first.h:* {{but in 'FirstModule' found different return type 'I' (aka 'int')}}
4947 #endif
4949 #if defined(FIRST)
4950 int F8(int) { return 0; }
4951 #elif defined(SECOND)
4952 int F8(I) { return 0; }
4953 #else
4954 int I8 = F8(1);
4955 // expected-error@second.h:* {{'FunctionDecl::F8' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st parameter with type 'I' (aka 'int')}}
4956 // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with type 'int'}}
4957 #endif
4959 #if defined(FIRST)
4960 int F9(int[1]) { return 0; }
4961 #elif defined(SECOND)
4962 int F9(int[2]) { return 0; }
4963 #else
4964 int I9 = F9(nullptr);
4965 // expected-error@second.h:* {{'FunctionDecl::F9' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st parameter with type 'int *' decayed from 'int[2]'}}
4966 // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with type 'int *' decayed from 'int[1]'}}
4967 #endif
4969 #if defined(FIRST)
4970 int F10() { return 1; }
4971 #elif defined(SECOND)
4972 int F10() { return 2; }
4973 #else
4974 int I10 = F10();
4975 #endif
4976 // expected-error@second.h:* {{'FunctionDecl::F10' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
4977 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
4979 #if defined(FIRST)
4980 struct S11 {
4981 template <int> void foo();
4983 #elif defined(SECOND)
4984 struct S11 {
4985 template <int> void foo();
4987 template <int> void S11::foo() {}
4988 #else
4989 S11 s11;
4990 #endif
4992 #if defined(FIRST)
4993 struct S12 {
4994 void foo(int x);
4996 #elif defined(SECOND)
4997 struct S12 {
4998 void foo(int x);
5000 void S12::foo(int y) {}
5001 #else
5002 S12 s12;
5003 #endif
5005 #if defined(FIRST)
5006 struct S13 {
5007 void foo(int x);
5009 void S13::foo(int y) {}
5010 #elif defined(SECOND)
5011 struct S13 {
5012 void foo(int x);
5014 void S13::foo(int y) {}
5015 #else
5016 S13 s13;
5017 #endif
5018 } // namespace FunctionDecl
5020 namespace DeclTemplateArguments {
5021 #if defined(FIRST)
5022 int foo() { return 1; }
5023 int bar() { return foo(); }
5024 #elif defined(SECOND)
5025 template <class T = int>
5026 int foo() { return 2; }
5027 int bar() { return foo<>(); }
5028 #else
5029 int num = bar();
5030 // expected-error@second.h:* {{'DeclTemplateArguments::bar' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}}
5031 // expected-note@first.h:* {{but in 'FirstModule' found a different body}}
5032 #endif
5035 namespace FunctionProtoTypeDecay {
5036 #if defined(FIRST)
5037 struct S1 {
5038 struct X {};
5039 using Y = X(X());
5041 #elif defined(SECOND)
5042 struct S1 {
5043 struct X {};
5044 using Y = X(X(X()));
5046 #else
5047 S1 s1;
5048 // expected-error@first.h:* {{'FunctionProtoTypeDecay::S1::Y' from module 'FirstModule' is not present in definition of 'FunctionProtoTypeDecay::S1' in module 'SecondModule'}}
5049 // expected-note@second.h:* {{declaration of 'Y' does not match}}
5050 #endif
5052 #if defined(FIRST)
5053 struct S2 {
5054 struct X {};
5055 using Y =
5056 X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(
5057 X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(
5058 X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(
5059 X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(X(
5060 ))))))))))))))))
5061 ))))))))))))))))
5062 ))))))))))))))))
5063 ))))))))))))))));
5065 #elif defined(SECOND)
5066 #else
5067 S2 s2;
5068 #endif
5071 namespace TypedefStruct {
5072 #if defined(FIRST)
5073 struct T1;
5074 class S1 {
5075 T1* t;
5077 #elif defined(SECOND)
5078 typedef struct T1 {} T1;
5079 class S1 {
5080 T1* t;
5082 #else
5083 S1 s1;
5084 #endif
5086 #if defined(FIRST)
5087 struct T2;
5088 class S2 {
5089 const T2* t = nullptr;
5091 #elif defined(SECOND)
5092 typedef struct T2 {} T2;
5093 class S2 {
5094 const T2* t = nullptr;
5096 #else
5097 S2 s2;
5098 #endif
5100 #if defined(FIRST)
5101 struct T3;
5102 class S3 {
5103 T3* const t = nullptr;
5105 #elif defined(SECOND)
5106 typedef struct T3 {} T3;
5107 class S3 {
5108 T3* const t = nullptr;
5110 #else
5111 S3 s3;
5112 #endif
5114 #if defined(FIRST)
5115 namespace NS4 {
5116 struct T4;
5117 } // namespace NS4
5118 class S4 {
5119 NS4::T4* t = 0;
5121 #elif defined(SECOND)
5122 namespace NS4 {
5123 typedef struct T4 {} T4;
5124 } // namespace NS4
5125 class S4 {
5126 NS4::T4* t = 0;
5128 #else
5129 S4 s4;
5130 #endif
5132 #if defined(FIRST)
5133 namespace NS5 {
5134 struct T5;
5135 } // namespace NS5
5136 class S5 {
5137 NS5::T5* t = 0;
5139 #elif defined(SECOND)
5140 namespace NS5 {
5141 typedef struct T5_Other {} T5;
5142 } // namespace NS4
5143 class S5 {
5144 NS5::T5* t = 0;
5146 #else
5147 S5 s5;
5148 // expected-error@first.h:* {{'TypedefStruct::S5::t' from module 'FirstModule' is not present in definition of 'TypedefStruct::S5' in module 'SecondModule'}}
5149 // expected-note@second.h:* {{declaration of 't' does not match}}
5150 #endif
5151 } // namespace TypedefStruct
5153 #if defined (FIRST)
5154 typedef int T;
5155 namespace A {
5156 struct X { T n; };
5158 #elif defined(SECOND)
5159 namespace A {
5160 typedef int T;
5161 struct X { T n; };
5163 #else
5164 A::X x;
5165 #endif
5167 // Keep macros contained to one file.
5168 #ifdef FIRST
5169 #undef FIRST
5170 #endif
5172 #ifdef SECOND
5173 #undef SECOND
5174 #endif
5176 #ifdef ACCESS
5177 #undef ACCESS
5178 #endif