|  | // Clear and create directories | 
|  | // RUN: rm -rf %t | 
|  | // RUN: mkdir %t | 
|  | // RUN: mkdir %t/cache | 
|  | // RUN: mkdir %t/Inputs | 
|  |  | 
|  | // Build first header file | 
|  | // RUN: echo "#define FIRST" >> %t/Inputs/first.h | 
|  | // RUN: cat %s               >> %t/Inputs/first.h | 
|  |  | 
|  | // Build second header file | 
|  | // RUN: echo "#define SECOND" >> %t/Inputs/second.h | 
|  | // RUN: cat %s                >> %t/Inputs/second.h | 
|  |  | 
|  | // Test that each header can compile | 
|  | // RUN: %clang_cc1 -fsyntax-only -x c++ -std=c++1z %t/Inputs/first.h | 
|  | // RUN: %clang_cc1 -fsyntax-only -x c++ -std=c++1z %t/Inputs/second.h | 
|  |  | 
|  | // Build module map file | 
|  | // RUN: echo "module FirstModule {"     >> %t/Inputs/module.map | 
|  | // RUN: echo "    header \"first.h\""   >> %t/Inputs/module.map | 
|  | // RUN: echo "}"                        >> %t/Inputs/module.map | 
|  | // RUN: echo "module SecondModule {"    >> %t/Inputs/module.map | 
|  | // RUN: echo "    header \"second.h\""  >> %t/Inputs/module.map | 
|  | // RUN: echo "}"                        >> %t/Inputs/module.map | 
|  |  | 
|  | // Run test | 
|  | // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -x c++ -I%t/Inputs -verify %s -std=c++1z | 
|  |  | 
|  | #if !defined(FIRST) && !defined(SECOND) | 
|  | #include "first.h" | 
|  | #include "second.h" | 
|  | #endif | 
|  |  | 
|  | // Used for testing | 
|  | #if defined(FIRST) | 
|  | #define ACCESS public: | 
|  | #elif defined(SECOND) | 
|  | #define ACCESS private: | 
|  | #endif | 
|  |  | 
|  | namespace AccessSpecifiers { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | private: | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@second.h:* {{'AccessSpecifiers::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found end of class}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | public: | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | protected: | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@second.h:* {{'AccessSpecifiers::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found protected access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS \ | 
|  | public:       \ | 
|  | private:      \ | 
|  | protected: | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'AccessSpecifiers::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  |  | 
|  | #undef DECLS | 
|  | } // namespace AccessSpecifiers | 
|  |  | 
|  | namespace StaticAssert { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | static_assert(1 == 1, "First"); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | static_assert(1 == 1, "Second"); | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@second.h:* {{'StaticAssert::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found static assert with message}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found static assert with different message}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | static_assert(2 == 2, "Message"); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | static_assert(2 == 2); | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found static assert with message}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | static_assert(3 == 3, "Message"); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S3 { | 
|  | static_assert(3 != 4, "Message"); | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // expected-error@second.h:* {{'StaticAssert::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found static assert with condition}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found static assert with different condition}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S4 { | 
|  | static_assert(4 == 4, "Message"); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | public: | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // expected-error@second.h:* {{'StaticAssert::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found static assert}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS                       \ | 
|  | static_assert(4 == 4, "Message"); \ | 
|  | static_assert(5 == 5); | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'StaticAssert::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace StaticAssert | 
|  |  | 
|  | namespace Field { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | int x; | 
|  | private: | 
|  | int y; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | int x; | 
|  | int y; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@second.h:* {{'Field::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found field}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found private access specifier}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | int x; | 
|  | int y; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | int y; | 
|  | int x; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@second.h:* {{'Field::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'y'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | double x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S3 { | 
|  | int x; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // expected-error@first.h:* {{'Field::S3::x' from module 'FirstModule' is not present in definition of 'Field::S3' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | typedef int A; | 
|  | struct S4 { | 
|  | A x; | 
|  | }; | 
|  |  | 
|  | struct S5 { | 
|  | A x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | typedef int B; | 
|  | struct S4 { | 
|  | B x; | 
|  | }; | 
|  |  | 
|  | struct S5 { | 
|  | int x; | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // expected-error@second.h:* {{'Field::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with type 'Field::B' (aka 'int')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'Field::A' (aka 'int')}} | 
|  |  | 
|  | S5 s5; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'Field::A' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S6 { | 
|  | unsigned x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S6 { | 
|  | unsigned x : 1; | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // expected-error@second.h:* {{'Field::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found bitfield 'x'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found non-bitfield 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S7 { | 
|  | unsigned x : 2; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S7 { | 
|  | unsigned x : 1; | 
|  | }; | 
|  | #else | 
|  | S7 s7; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found bitfield 'x' with different width expression}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S8 { | 
|  | unsigned x : 2; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S8 { | 
|  | unsigned x : 1 + 1; | 
|  | }; | 
|  | #else | 
|  | S8 s8; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found bitfield 'x' with different width expression}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S9 { | 
|  | mutable int x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S9 { | 
|  | int x; | 
|  | }; | 
|  | #else | 
|  | S9 s9; | 
|  | // expected-error@second.h:* {{'Field::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found non-mutable field 'x'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found mutable field 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S10 { | 
|  | unsigned x = 5; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S10 { | 
|  | unsigned x; | 
|  | }; | 
|  | #else | 
|  | S10 s10; | 
|  | // expected-error@second.h:* {{'Field::S10' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'x' with no initalizer}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with an initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S11 { | 
|  | unsigned x = 5; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S11 { | 
|  | unsigned x = 7; | 
|  | }; | 
|  | #else | 
|  | S11 s11; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with a different initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S12 { | 
|  | unsigned x[5]; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S12 { | 
|  | unsigned x[7]; | 
|  | }; | 
|  | #else | 
|  | S12 s12; | 
|  | // expected-error@first.h:* {{'Field::S12::x' from module 'FirstModule' is not present in definition of 'Field::S12' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S13 { | 
|  | unsigned x[7]; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S13 { | 
|  | double x[7]; | 
|  | }; | 
|  | #else | 
|  | S13 s13; | 
|  | // expected-error@first.h:* {{'Field::S13::x' from module 'FirstModule' is not present in definition of 'Field::S13' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS         \ | 
|  | int a;              \ | 
|  | int b : 3;          \ | 
|  | unsigned c : 1 + 2; \ | 
|  | s d;                \ | 
|  | double e = 1.0;     \ | 
|  | long f[5]; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | typedef short s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'Field::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace Field | 
|  |  | 
|  | namespace Method { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | void A() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | private: | 
|  | void A() {} | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@second.h:* {{'Method::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | void A() {} | 
|  | void B() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | void B() {} | 
|  | void A() {} | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@second.h:* {{'Method::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'B'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | static void A() {} | 
|  | void A(int) {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S3 { | 
|  | void A(int) {} | 
|  | static void A() {} | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is static}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S4 { | 
|  | virtual void A() {} | 
|  | void B() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | void A() {} | 
|  | virtual void B() {} | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is virtual}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S5 { | 
|  | virtual void A() = 0; | 
|  | virtual void B() {}; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S5 { | 
|  | virtual void A() {} | 
|  | virtual void B() = 0; | 
|  | }; | 
|  | #else | 
|  | S5 *s5; | 
|  | // expected-error@second.h:* {{'Method::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'A' is virtual}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is pure virtual}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S6 { | 
|  | inline void A() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S6 { | 
|  | void A() {} | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is inline}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S7 { | 
|  | void A() volatile {} | 
|  | void A() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S7 { | 
|  | void A() {} | 
|  | void A() volatile {} | 
|  | }; | 
|  | #else | 
|  | S7 s7; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is volatile}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S8 { | 
|  | void A() const {} | 
|  | void A() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S8 { | 
|  | void A() {} | 
|  | void A() const {} | 
|  | }; | 
|  | #else | 
|  | S8 s8; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' is const}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S9 { | 
|  | void A(int x) {} | 
|  | void A(int x, int y) {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S9 { | 
|  | void A(int x, int y) {} | 
|  | void A(int x) {} | 
|  | }; | 
|  | #else | 
|  | S9 s9; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' that has 1 parameter}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S10 { | 
|  | void A(int x) {} | 
|  | void A(float x) {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S10 { | 
|  | void A(float x) {} | 
|  | void A(int x) {} | 
|  | }; | 
|  | #else | 
|  | S10 s10; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter of type 'int'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S11 { | 
|  | void A(int x); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S11 { | 
|  | void A(int y); | 
|  | }; | 
|  | #else | 
|  | S11 s11; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter named 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S12 { | 
|  | void A(int x); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S12 { | 
|  | void A(int x = 1); | 
|  | }; | 
|  | #else | 
|  | S12 s12; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter with a default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S13 { | 
|  | void A(int x = 1 + 0); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S13 { | 
|  | void A(int x = 1); | 
|  | }; | 
|  | #else | 
|  | S13 s13; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter with a different default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S14 { | 
|  | void A(int x[2]); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S14 { | 
|  | void A(int x[3]); | 
|  | }; | 
|  | #else | 
|  | S14 s14; | 
|  | // 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]'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'A' with 1st parameter of type 'int *' decayed from 'int [2]'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S15 { | 
|  | int A() { return 0; } | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S15 { | 
|  | long A() { return 0; } | 
|  | }; | 
|  | #else | 
|  | S15 s15; | 
|  | // expected-error@first.h:* {{'Method::S15::A' from module 'FirstModule' is not present in definition of 'Method::S15' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'A' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS            \ | 
|  | void A();              \ | 
|  | static void B();       \ | 
|  | virtual void C();      \ | 
|  | virtual void D() = 0;  \ | 
|  | inline void E();       \ | 
|  | void F() const;        \ | 
|  | void G() volatile;     \ | 
|  | void H(int x);         \ | 
|  | void I(int x = 5 + 5); \ | 
|  | void J(int);           \ | 
|  | void K(int x[2]);      \ | 
|  | int L(); | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1* v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1* i1; | 
|  | // expected-error@second.h:* {{'Method::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace Method | 
|  |  | 
|  | namespace MethodBody { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | int A() { return 0; } | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | int A() { return 0; } | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | int BothBodies() { return 0; } | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | int BothBodies() { return 1; } | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@first.h:* {{'MethodBody::S2' has different definitions in different modules; first difference is definition in module 'FirstModule' found method 'BothBodies' with body}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found method 'BothBodies' with different body}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | int FirstBody() { return 0; } | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S3 { | 
|  | int FirstBody(); | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // expected-error@first.h:* {{'MethodBody::S3' has different definitions in different modules; first difference is definition in module 'FirstModule' found method 'FirstBody' with body}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found method 'FirstBody' with no body}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S4 { | 
|  | int SecondBody(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | int SecondBody() { return 0; } | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // 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}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found method 'SecondBody' with body}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S5 { | 
|  | int FirstBodySecondOutOfLine() { return 0; } | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S5 { | 
|  | int FirstBodySecondOutOfLine(); | 
|  | }; | 
|  | int S5::FirstBodySecondOutOfLine() { return 0; } | 
|  | #else | 
|  | S5 s5; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'FirstBodySecondOutOfLine' with body}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S6 { | 
|  | int FirstOutOfLineSecondBody(); | 
|  | }; | 
|  | int S6::FirstOutOfLineSecondBody() { return 0; } | 
|  | #elif defined(SECOND) | 
|  | struct S6 { | 
|  | int FirstOutOfLineSecondBody() { return 0; } | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // 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}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found method 'FirstOutOfLineSecondBody' with body}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S7 { | 
|  | int BothOutOfLine(); | 
|  | }; | 
|  | int S7::BothOutOfLine() { return 1; } | 
|  | #elif defined(SECOND) | 
|  | struct S7 { | 
|  | int BothOutOfLine(); | 
|  | }; | 
|  | int S7::BothOutOfLine() { return 0; } | 
|  | #else | 
|  | S7 s7; | 
|  | // expected-error@second.h:* {{'MethodBody::S7::BothOutOfLine' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found a different body}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S8 { | 
|  | int FirstBodySecondOutOfLine() { return 0; } | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S8 { | 
|  | int FirstBodySecondOutOfLine(); | 
|  | }; | 
|  | int S8::FirstBodySecondOutOfLine() { return 1; } | 
|  | #else | 
|  | S8 s8; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'FirstBodySecondOutOfLine' with body}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S9 { | 
|  | int FirstOutOfLineSecondBody(); | 
|  | }; | 
|  | int S9::FirstOutOfLineSecondBody() { return 1; } | 
|  | #elif defined(SECOND) | 
|  | struct S9 { | 
|  | int FirstOutOfLineSecondBody() { return 0; } | 
|  | }; | 
|  | #else | 
|  | S9 s9; | 
|  | // 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}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found method 'FirstOutOfLineSecondBody' with body}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S10 { | 
|  | S10(int); | 
|  | S10() = delete; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S10 { | 
|  | S10(int); | 
|  | S10(); | 
|  | }; | 
|  | #else | 
|  | S10 s10(10); | 
|  | // expected-error@first.h:* {{'MethodBody::S10' has different definitions in different modules; first difference is definition in module 'FirstModule' found constructor is deleted}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found constructor is not deleted}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S11 { | 
|  | S11() = default; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S11 { | 
|  | S11(); | 
|  | }; | 
|  | #else | 
|  | S11 s11; | 
|  | // expected-error@first.h:* {{'MethodBody::S11' has different definitions in different modules; first difference is definition in module 'FirstModule' found constructor is defaulted}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found constructor is not defaulted}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS(CLASSNAME) \ | 
|  | CLASSNAME() = default; \ | 
|  | ~CLASSNAME() = delete; \ | 
|  | void A();              \ | 
|  | void B() { return; };  \ | 
|  | void C();              \ | 
|  | void D(); | 
|  |  | 
|  | #define OUTOFLINEDEFS(CLASSNAME) \ | 
|  | void CLASSNAME::C() {}         \ | 
|  | void CLASSNAME::D() { return; } | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS(Valid1) | 
|  | }; | 
|  | OUTOFLINEDEFS(Valid1) | 
|  | #else | 
|  | Valid1* v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS(Invalid1) | 
|  | ACCESS | 
|  | }; | 
|  | OUTOFLINEDEFS(Invalid1) | 
|  | #else | 
|  | Invalid1* i1; | 
|  | // expected-error@first.h:* {{'MethodBody::Invalid1' has different definitions in different modules; first difference is definition in module 'FirstModule' found public access specifier}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found private access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace MethodBody | 
|  |  | 
|  | namespace Constructor { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | S1() {} | 
|  | void foo() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | void foo() {} | 
|  | S1() {} | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@second.h:* {{'Constructor::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found method 'foo'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found constructor}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | S2(int) {} | 
|  | S2(int, int) {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | S2(int, int) {} | 
|  | S2(int) {} | 
|  | }; | 
|  | #else | 
|  | S2* s2; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found constructor that has 1 parameter}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS(CLASS) \ | 
|  | CLASS(int);        \ | 
|  | CLASS(double);     \ | 
|  | CLASS(int, int); | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS(Valid1) | 
|  | }; | 
|  | #else | 
|  | Valid1* v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS(Invalid1) | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1* i1; | 
|  | // expected-error@second.h:* {{'Constructor::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace Constructor | 
|  |  | 
|  | namespace Destructor { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | ~S1() {} | 
|  | S1() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | S1() {} | 
|  | ~S1() {} | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@second.h:* {{'Destructor::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found constructor}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found destructor}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | virtual ~S2() {} | 
|  | void foo() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | ~S2() {} | 
|  | virtual void foo() {} | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@second.h:* {{'Destructor::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found destructor is not virtual}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found destructor is virtual}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | ~Valid1(); | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | ~Invalid1(); | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'Destructor::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid2 { | 
|  | virtual ~Valid2(); | 
|  | }; | 
|  | #else | 
|  | Valid2 v2; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid2 { | 
|  | virtual ~Invalid2(); | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid2 i2; | 
|  | // expected-error@second.h:* {{'Destructor::Invalid2' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | }  // namespace Destructor | 
|  |  | 
|  | namespace TypeDef { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | typedef int a; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | typedef double a; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{'TypeDef::S1::a' from module 'FirstModule' is not present in definition of 'TypeDef::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'a' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | typedef int a; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | typedef int b; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@first.h:* {{'TypeDef::S2::a' from module 'FirstModule' is not present in definition of 'TypeDef::S2' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{definition has no member 'a'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | typedef int T; | 
|  | struct S3 { | 
|  | typedef T a; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | typedef double T; | 
|  | struct S3 { | 
|  | typedef T a; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // expected-error@first.h:* {{'TypeDef::S3::a' from module 'FirstModule' is not present in definition of 'TypeDef::S3' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'a' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S4 { | 
|  | typedef int a; | 
|  | typedef int b; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | typedef int b; | 
|  | typedef int a; | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // expected-error@second.h:* {{'TypeDef::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found typedef name 'b'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found typedef name 'a'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S5 { | 
|  | typedef int a; | 
|  | typedef int b; | 
|  | int x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S5 { | 
|  | int x; | 
|  | typedef int b; | 
|  | typedef int a; | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | // expected-error@second.h:* {{'TypeDef::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found field}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found typedef}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | typedef float F; | 
|  | struct S6 { | 
|  | typedef int a; | 
|  | typedef F b; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S6 { | 
|  | typedef int a; | 
|  | typedef float b; | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found typedef 'b' with different underlying type 'TypeDef::F' (aka 'float')}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS       \ | 
|  | typedef int A;    \ | 
|  | typedef double B; \ | 
|  | typedef I C; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | typedef int I; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'TypeDef::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace TypeDef | 
|  |  | 
|  | namespace Using { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | using a = int; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | using a = double; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{'Using::S1::a' from module 'FirstModule' is not present in definition of 'Using::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'a' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | using a = int; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | using b = int; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@first.h:* {{'Using::S2::a' from module 'FirstModule' is not present in definition of 'Using::S2' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{definition has no member 'a'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | typedef int T; | 
|  | struct S3 { | 
|  | using a = T; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | typedef double T; | 
|  | struct S3 { | 
|  | using a = T; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // expected-error@first.h:* {{'Using::S3::a' from module 'FirstModule' is not present in definition of 'Using::S3' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'a' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S4 { | 
|  | using a = int; | 
|  | using b = int; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | using b = int; | 
|  | using a = int; | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // expected-error@second.h:* {{'Using::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found type alias name 'b'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found type alias name 'a'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S5 { | 
|  | using a = int; | 
|  | using b = int; | 
|  | int x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S5 { | 
|  | int x; | 
|  | using b = int; | 
|  | using a = int; | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | // expected-error@second.h:* {{'Using::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found field}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found type alias}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | typedef float F; | 
|  | struct S6 { | 
|  | using a = int; | 
|  | using b = F; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S6 { | 
|  | using a = int; | 
|  | using b = float; | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found type alias 'b' with different underlying type 'Using::F' (aka 'float')}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | using I = int; | 
|  | #endif | 
|  |  | 
|  | #define DECLS       \ | 
|  | using A = int;    \ | 
|  | using B = double; \ | 
|  | using C = I; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'Using::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace Using | 
|  |  | 
|  | namespace RecordType { | 
|  | #if defined(FIRST) | 
|  | struct B1 {}; | 
|  | struct S1 { | 
|  | B1 x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct A1 {}; | 
|  | struct S1 { | 
|  | A1 x; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{'RecordType::S1::x' from module 'FirstModule' is not present in definition of 'RecordType::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS \ | 
|  | Foo F; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Foo {}; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'RecordType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace RecordType | 
|  |  | 
|  | namespace DependentType { | 
|  | #if defined(FIRST) | 
|  | template <class T> | 
|  | class S1 { | 
|  | typename T::typeA x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class T> | 
|  | class S1 { | 
|  | typename T::typeB x; | 
|  | }; | 
|  | #else | 
|  | template<class T> | 
|  | using U1 = S1<T>; | 
|  | // expected-error@first.h:* {{'DependentType::S1::x' from module 'FirstModule' is not present in definition of 'S1<T>' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS \ | 
|  | typename T::typeA x; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class T> | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | template <class T> | 
|  | using V1 = Valid1<T>; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class T> | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | template <class T> | 
|  | using I1 = Invalid1<T>; | 
|  | // expected-error@second.h:* {{'DependentType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace DependentType | 
|  |  | 
|  | namespace ElaboratedType { | 
|  | #if defined(FIRST) | 
|  | namespace N1 { using type = double; } | 
|  | struct S1 { | 
|  | N1::type x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | namespace N1 { using type = int; } | 
|  | struct S1 { | 
|  | N1::type x; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{'ElaboratedType::S1::x' from module 'FirstModule' is not present in definition of 'ElaboratedType::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS \ | 
|  | NS::type x; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | namespace NS { using type = float; } | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'ElaboratedType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace ElaboratedType | 
|  |  | 
|  | namespace Enum { | 
|  | #if defined(FIRST) | 
|  | enum A1 {}; | 
|  | struct S1 { | 
|  | A1 x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | enum A2 {}; | 
|  | struct S1 { | 
|  | A2 x; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{'Enum::S1::x' from module 'FirstModule' is not present in definition of 'Enum::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS \ | 
|  | E e = E1; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | enum E { E1, E2 }; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'Enum::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | } | 
|  |  | 
|  | namespace NestedNamespaceSpecifier { | 
|  | #if defined(FIRST) | 
|  | namespace LevelA1 { | 
|  | using Type = int; | 
|  | } | 
|  |  | 
|  | struct S1 { | 
|  | LevelA1::Type x; | 
|  | }; | 
|  | # elif defined(SECOND) | 
|  | namespace LevelB1 { | 
|  | namespace LevelC1 { | 
|  | using Type = int; | 
|  | } | 
|  | } | 
|  |  | 
|  | struct S1 { | 
|  | LevelB1::LevelC1::Type x; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // 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')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'LevelA1::Type' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | namespace LevelA2 { using Type = int; } | 
|  | struct S2 { | 
|  | LevelA2::Type x; | 
|  | }; | 
|  | # elif defined(SECOND) | 
|  | struct S2 { | 
|  | int x; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'LevelA2::Type' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | namespace LevelA3 { using Type = int; } | 
|  | namespace LevelB3 { using Type = int; } | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | LevelA3::Type x; | 
|  | }; | 
|  | # elif defined(SECOND) | 
|  | struct S3 { | 
|  | LevelB3::Type x; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // 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')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'LevelA3::Type' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct TA4 { using Type = int; }; | 
|  | struct S4 { | 
|  | TA4::Type x; | 
|  | }; | 
|  | # elif defined(SECOND) | 
|  | struct TB4 { using Type = int; }; | 
|  | struct S4 { | 
|  | TB4::Type x; | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // 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')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'TA4::Type' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct T5 { using Type = int; }; | 
|  | struct S5 { | 
|  | T5::Type x; | 
|  | }; | 
|  | # elif defined(SECOND) | 
|  | namespace T5 { using Type = int; }; | 
|  | struct S5 { | 
|  | T5::Type x; | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | // 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')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'T5::Type' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | namespace N6 {using I = int;} | 
|  | struct S6 { | 
|  | NestedNamespaceSpecifier::N6::I x; | 
|  | }; | 
|  | # elif defined(SECOND) | 
|  | using I = int; | 
|  | struct S6 { | 
|  | ::NestedNamespaceSpecifier::I x; | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // 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')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'NestedNamespaceSpecifier::N6::I' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class T, class U> | 
|  | class S7 { | 
|  | typename T::type *x = {}; | 
|  | int z = x->T::foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class T, class U> | 
|  | class S7 { | 
|  | typename T::type *x = {}; | 
|  | int z = x->U::foo(); | 
|  | }; | 
|  | #else | 
|  | template <class T, class U> | 
|  | using U7 = S7<T, U>; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'z' with a different initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class T> | 
|  | class S8 { | 
|  | int x = T::template X<int>::value; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class T> | 
|  | class S8 { | 
|  | int x = T::template Y<int>::value; | 
|  | }; | 
|  | #else | 
|  | template <class T> | 
|  | using U8 = S8<T>; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with a different initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | namespace N9 { using I = int; } | 
|  | namespace O9 = N9; | 
|  | struct S9 { | 
|  | O9::I x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | namespace N9 { using I = int; } | 
|  | namespace P9 = N9; | 
|  | struct S9 { | 
|  | P9::I x; | 
|  | }; | 
|  | #else | 
|  | S9 s9; | 
|  | // 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')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x' with type 'O9::I' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | namespace N10 { | 
|  | #if defined(FIRST) | 
|  | inline namespace A { struct X {}; } | 
|  | struct S10 { | 
|  | A::X x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | inline namespace B { struct X {}; } | 
|  | struct S10 { | 
|  | B::X x; | 
|  | }; | 
|  | #else | 
|  | S10 s10; | 
|  | // expected-error@second.h:* {{'NestedNamespaceSpecifier::N10::S10::x' from module 'SecondModule' is not present in definition of 'NestedNamespaceSpecifier::N10::S10' in module 'FirstModule'}} | 
|  | // expected-note@first.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | #define DECLS       \ | 
|  | NS1::Type a;      \ | 
|  | NS1::NS2::Type b; \ | 
|  | NS1::S c;         \ | 
|  | NS3::Type d; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | namespace NS1 { | 
|  | using Type = int; | 
|  | namespace NS2 { | 
|  | using Type = double; | 
|  | } | 
|  | struct S {}; | 
|  | } | 
|  | namespace NS3 = NS1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'NestedNamespaceSpecifier::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  |  | 
|  | #define DECLS               \ | 
|  | typename T::type *x = {}; \ | 
|  | int y = x->T::foo();      \ | 
|  | int z = U::template X<int>::value; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class T, class U> | 
|  | struct Valid2 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | template <class T, class U> | 
|  | using V2 = Valid2<T, U>; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class T, class U> | 
|  | struct Invalid2 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | template <class T, class U> | 
|  | using I2 = Invalid2<T, U>; | 
|  | // expected-error@second.h:* {{'NestedNamespaceSpecifier::Invalid2' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace NestedNamespaceSpecifier | 
|  |  | 
|  | namespace TemplateSpecializationType { | 
|  | #if defined(FIRST) | 
|  | template <class T1> struct U1 {}; | 
|  | struct S1 { | 
|  | U1<int> u; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class T1, class T2> struct U1 {}; | 
|  | struct S1 { | 
|  | U1<int, int> u; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{'TemplateSpecializationType::S1::u' from module 'FirstModule' is not present in definition of 'TemplateSpecializationType::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'u' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class T1> struct U2 {}; | 
|  | struct S2 { | 
|  | U2<int> u; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class T1> struct V1 {}; | 
|  | struct S2 { | 
|  | V1<int> u; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@first.h:* {{'TemplateSpecializationType::S2::u' from module 'FirstModule' is not present in definition of 'TemplateSpecializationType::S2' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'u' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS                       \ | 
|  | OneTemplateArg<int> x;            \ | 
|  | OneTemplateArg<double> y;         \ | 
|  | OneTemplateArg<char *> z;         \ | 
|  | TwoTemplateArgs<int, int> a;      \ | 
|  | TwoTemplateArgs<double, float> b; \ | 
|  | TwoTemplateArgs<short *, char> c; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class T> struct OneTemplateArg {}; | 
|  | template <class T, class U> struct TwoTemplateArgs {}; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'TemplateSpecializationType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace TemplateSpecializationType | 
|  |  | 
|  | namespace TemplateArgument { | 
|  | #if defined(FIRST) | 
|  | template <class> struct U1{}; | 
|  | struct S1 { | 
|  | U1<int> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <int> struct U1{}; | 
|  | struct S1 { | 
|  | U1<1> x; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{'TemplateArgument::S1::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <int> struct U2{}; | 
|  | struct S2 { | 
|  | using T = U2<2>; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <int> struct U2{}; | 
|  | struct S2 { | 
|  | using T = U2<(2)>; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // 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)>'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found type alias 'T' with different underlying type 'U2<2>'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <int> struct U3{}; | 
|  | struct S3 { | 
|  | using T = U3<2>; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <int> struct U3{}; | 
|  | struct S3 { | 
|  | using T = U3<1 + 1>; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // 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>'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found type alias 'T' with different underlying type 'U3<2>'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template<class> struct T4a {}; | 
|  | template <template <class> class T> struct U4 {}; | 
|  | struct S4 { | 
|  | U4<T4a> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template<class> struct T4b {}; | 
|  | template <template <class> class T> struct U4 {}; | 
|  | struct S4 { | 
|  | U4<T4b> x; | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // expected-error@first.h:* {{'TemplateArgument::S4::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S4' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class T> struct U5 {}; | 
|  | struct S5 { | 
|  | U5<int> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class T> struct U5 {}; | 
|  | struct S5 { | 
|  | U5<short> x; | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | // expected-error@first.h:* {{'TemplateArgument::S5::x' from module 'FirstModule' is not present in definition of 'TemplateArgument::S5' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class T> struct U6 {}; | 
|  | struct S6 { | 
|  | U6<int> x; | 
|  | U6<short> y; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class T> struct U6 {}; | 
|  | struct S6 { | 
|  | U6<short> y; | 
|  | U6<int> x; | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // expected-error@second.h:* {{'TemplateArgument::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found field 'y'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found field 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S7 { | 
|  | template<int> void run() {} | 
|  | template<> void run<1>() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S7 { | 
|  | template<int> void run() {} | 
|  | void run() {} | 
|  | }; | 
|  | #else | 
|  | S7 s7; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with template arguments}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S8 { | 
|  | static int a, b; | 
|  | template<int&> void run() {} | 
|  | template<int&, int&> void run() {} | 
|  | template<> void run<a>() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S8 { | 
|  | static int a, b; | 
|  | template<int&> void run() {} | 
|  | template<int&, int&> void run() {} | 
|  | template<> void run<a, b>() {} | 
|  | }; | 
|  | #else | 
|  | S8 s8; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with 1 template argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S9 { | 
|  | static int a, b; | 
|  | template<int&> void run() {} | 
|  | template<> void run<a>() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S9 { | 
|  | static int a, b; | 
|  | template<int&> void run() {} | 
|  | template<> void run<b>() {} | 
|  | }; | 
|  | #else | 
|  | S9 s9; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with 'a' for 1st template argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S10 { | 
|  | static int a, b; | 
|  | template<int, int&...> void run() {} | 
|  | template<> void run<1, a>() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S10 { | 
|  | static int a, b; | 
|  | template<int, int&...> void run() {} | 
|  | template<> void run<1, b>() {} | 
|  | }; | 
|  | #else | 
|  | S10 s10; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with 'a' for 2nd template argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S11 { | 
|  | static int a, b; | 
|  | template<int, int&...> void run() {} | 
|  | template<> void run<1, a>() {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S11 { | 
|  | static int a, b; | 
|  | template<int, int&...> void run() {} | 
|  | template<> void run<1, a, a>() {} | 
|  | }; | 
|  | #else | 
|  | S11 s11; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'run' with 2 template arguments}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS                   \ | 
|  | OneClass<int> a;              \ | 
|  | OneInt<1> b;                  \ | 
|  | using c = OneClass<float>;    \ | 
|  | using d = OneInt<2>;          \ | 
|  | using e = OneInt<2 + 2>;      \ | 
|  | OneTemplateClass<OneClass> f; \ | 
|  | OneTemplateInt<OneInt> g;     \ | 
|  | static int i1, i2;            \ | 
|  | template <int &>              \ | 
|  | void Function() {}            \ | 
|  | template <int &, int &>       \ | 
|  | void Function() {}            \ | 
|  | template <>                   \ | 
|  | void Function<i1>() {}        \ | 
|  | template <>                   \ | 
|  | void Function<i2>() {}        \ | 
|  | template <>                   \ | 
|  | void Function<i1, i2>() {}    \ | 
|  | template <>                   \ | 
|  | void Function<i2, i1>() {} | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class> struct OneClass{}; | 
|  | template <int> struct OneInt{}; | 
|  | template <template <class> class> struct OneTemplateClass{}; | 
|  | template <template <int> class> struct OneTemplateInt{}; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'TemplateArgument::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace TemplateArgument | 
|  |  | 
|  | namespace TemplateTypeParmType { | 
|  | #if defined(FIRST) | 
|  | template <class T1, class T2> | 
|  | struct S1 { | 
|  | T1 x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class T1, class T2> | 
|  | struct S1 { | 
|  | T2 x; | 
|  | }; | 
|  | #else | 
|  | using TemplateTypeParmType::S1; | 
|  | // expected-error@first.h:* {{'TemplateTypeParmType::S1::x' from module 'FirstModule' is not present in definition of 'S1<T1, T2>' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <int ...Ts> | 
|  | struct U2 {}; | 
|  | template <int T, int U> | 
|  | class S2 { | 
|  | typedef U2<U, T> type; | 
|  | type x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <int ...Ts> | 
|  | struct U2 {}; | 
|  | template <int T, int U> | 
|  | class S2 { | 
|  | typedef U2<T, U> type; | 
|  | type x; | 
|  | }; | 
|  | #else | 
|  | using TemplateTypeParmType::S2; | 
|  | // expected-error@first.h:* {{'TemplateTypeParmType::S2::x' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | // expected-error@first.h:* {{'TemplateTypeParmType::S2::type' from module 'FirstModule' is not present in definition of 'S2<T, U>' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'type' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS            \ | 
|  | T t;                   \ | 
|  | U u;                   \ | 
|  | ParameterPack<T> a;    \ | 
|  | ParameterPack<T, U> b; \ | 
|  | ParameterPack<U> c;    \ | 
|  | ParameterPack<U, T> d; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class ...Ts> struct ParameterPack {}; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class T, class U> | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | using TemplateTypeParmType::Valid1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class T, class U> | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | using TemplateTypeParmType::Invalid1; | 
|  | // expected-error@second.h:* {{'TemplateTypeParmType::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace TemplateTypeParmType | 
|  |  | 
|  | namespace VarDecl { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | static int x; | 
|  | static int y; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | static int y; | 
|  | static int x; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found data member with name 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | static int x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | using I = int; | 
|  | struct S2 { | 
|  | static I x; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // 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 'VarDecl::I' (aka 'int')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found data member 'x' with different type 'int'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | static const int x = 1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S3 { | 
|  | static const int x; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found data member 'x' without an initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S4 { | 
|  | static const int x = 1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | static const int x = 2; | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found data member 'x' with a different initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S5 { | 
|  | static const int x = 1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S5 { | 
|  | static constexpr int x = 1; | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found data member 'x' is constexpr}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S6 { | 
|  | static const int x = 1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S6 { | 
|  | static const int y = 1; | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // expected-error@first.h:* {{'VarDecl::S6::x' from module 'FirstModule' is not present in definition of 'VarDecl::S6' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{definition has no member 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S7 { | 
|  | static const int x = 1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S7 { | 
|  | static const unsigned x = 1; | 
|  | }; | 
|  | #else | 
|  | S7 s7; | 
|  | // expected-error@first.h:* {{'VarDecl::S7::x' from module 'FirstModule' is not present in definition of 'VarDecl::S7' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S8 { | 
|  | public: | 
|  | static const int x = 1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S8 { | 
|  | static const int x = 1; | 
|  | public: | 
|  | }; | 
|  | #else | 
|  | S8 s8; | 
|  | // expected-error@second.h:* {{'VarDecl::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found data member}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S9 { | 
|  | static const int x = 1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S9 { | 
|  | static int x; | 
|  | }; | 
|  | #else | 
|  | S9 s9; | 
|  | // expected-error@first.h:* {{'VarDecl::S9::x' from module 'FirstModule' is not present in definition of 'VarDecl::S9' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS             \ | 
|  | static int a;           \ | 
|  | static I b;             \ | 
|  | static const int c = 1; \ | 
|  | static constexpr int d = 5; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | using I = int; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'VarDecl::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace VarDecl | 
|  |  | 
|  | namespace Friend { | 
|  | #if defined(FIRST) | 
|  | struct T1 {}; | 
|  | struct S1 { | 
|  | friend class T1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct T1 {}; | 
|  | struct S1 { | 
|  | friend T1; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@second.h:* {{'Friend::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'Friend::T1'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found friend 'class T1'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct T2 {}; | 
|  | struct S2 { | 
|  | friend class T2; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct T2 {}; | 
|  | struct S2 { | 
|  | friend struct T2; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@second.h:* {{'Friend::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'struct T2'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found friend 'class T2'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct T3 {}; | 
|  | struct S3 { | 
|  | friend const T3; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct T3 {}; | 
|  | struct S3 { | 
|  | friend T3; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // expected-error@second.h:* {{'Friend::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend 'Friend::T3'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found friend 'const Friend::T3'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct T4 {}; | 
|  | struct S4 { | 
|  | friend T4; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | friend void T4(); | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // expected-error@second.h:* {{'Friend::S4' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend function}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found friend class}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S5 { | 
|  | friend void T5a(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S5 { | 
|  | friend void T5b(); | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | // expected-error@second.h:* {{'Friend::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found friend function 'T5b'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found friend function 'T5a'}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS            \ | 
|  | friend class FriendA;  \ | 
|  | friend struct FriendB; \ | 
|  | friend FriendC;        \ | 
|  | friend const FriendD;  \ | 
|  | friend void Function(); | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | class FriendA {}; | 
|  | class FriendB {}; | 
|  | class FriendC {}; | 
|  | class FriendD {}; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'Friend::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace Friend | 
|  |  | 
|  | namespace TemplateParameters { | 
|  | #if defined(FIRST) | 
|  | template <class A> | 
|  | struct S1 {}; | 
|  | #elif defined(SECOND) | 
|  | template <class B> | 
|  | struct S1 {}; | 
|  | #else | 
|  | using TemplateParameters::S1; | 
|  | // expected-error@second.h:* {{'TemplateParameters::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found template parameter 'B'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found template parameter 'A'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class A = double> | 
|  | struct S2 {}; | 
|  | #elif defined(SECOND) | 
|  | template <class A = int> | 
|  | struct S2 {}; | 
|  | #else | 
|  | using TemplateParameters::S2; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found template parameter with different default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class A = int> | 
|  | struct S3 {}; | 
|  | #elif defined(SECOND) | 
|  | template <class A> | 
|  | struct S3 {}; | 
|  | #else | 
|  | using TemplateParameters::S3; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found template parameter with default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <int A> | 
|  | struct S4 {}; | 
|  | #elif defined(SECOND) | 
|  | template <int A = 2> | 
|  | struct S4 {}; | 
|  | #else | 
|  | using TemplateParameters::S4; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found template parameter with no default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <int> class S5_first {}; | 
|  | template <template<int> class A = S5_first> | 
|  | struct S5 {}; | 
|  | #elif defined(SECOND) | 
|  | template <int> class S5_second {}; | 
|  | template <template<int> class A = S5_second> | 
|  | struct S5 {}; | 
|  | #else | 
|  | using TemplateParameters::S5; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found template parameter with different default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class A> | 
|  | struct S6 {}; | 
|  | #elif defined(SECOND) | 
|  | template <class> | 
|  | struct S6 {}; | 
|  | #else | 
|  | using TemplateParameters::S6; | 
|  | // expected-error@second.h:* {{'TemplateParameters::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found unnamed template parameter}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found template parameter 'A'}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <class> class DefaultArg; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <int, class, template <class> class, | 
|  | int A, class B, template <int> class C, | 
|  | int D = 1, class E = int, template <class F> class = DefaultArg> | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | using TemplateParameters::Valid1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <int, class, template <class> class, | 
|  | int A, class B, template <int> class C, | 
|  | int D = 1, class E = int, template <class F> class = DefaultArg> | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | using TemplateParameters::Invalid1; | 
|  | // expected-error@second.h:* {{'TemplateParameters::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace TemplateParameters | 
|  |  | 
|  | namespace BaseClass { | 
|  | #if defined(FIRST) | 
|  | struct B1 {}; | 
|  | struct S1 : B1 {}; | 
|  | #elif defined(SECOND) | 
|  | struct S1 {}; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@second.h:* {{'BaseClass::S1' has different definitions in different modules; first difference is definition in module 'SecondModule' found 0 base classes}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1 base class}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 {}; | 
|  | #elif defined(SECOND) | 
|  | struct B2 {}; | 
|  | struct S2 : virtual B2 {}; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@second.h:* {{'BaseClass::S2' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1 base class}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 0 base classes}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct B3a {}; | 
|  | struct S3 : B3a {}; | 
|  | #elif defined(SECOND) | 
|  | struct B3b {}; | 
|  | struct S3 : virtual B3b {}; | 
|  | #else | 
|  | S3 s3; | 
|  | // expected-error@second.h:* {{'BaseClass::S3' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1 virtual base class}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 0 virtual base classes}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct B4a {}; | 
|  | struct S4 : B4a {}; | 
|  | #elif defined(SECOND) | 
|  | struct B4b {}; | 
|  | struct S4 : B4b {}; | 
|  | #else | 
|  | S4 s4; | 
|  | // 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 'BaseClass::B4b'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st base class with different type 'BaseClass::B4a'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct B5a {}; | 
|  | struct S5 : virtual B5a {}; | 
|  | #elif defined(SECOND) | 
|  | struct B5a {}; | 
|  | struct S5 : B5a {}; | 
|  | #else | 
|  | S5 s5; | 
|  | // expected-error@second.h:* {{'BaseClass::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found 0 virtual base classes}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1 virtual base class}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct B6a {}; | 
|  | struct S6 : B6a {}; | 
|  | #elif defined(SECOND) | 
|  | struct B6a {}; | 
|  | struct S6 : virtual B6a {}; | 
|  | #else | 
|  | S6 s6; | 
|  | // expected-error@second.h:* {{'BaseClass::S6' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1 virtual base class}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 0 virtual base classes}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct B7a {}; | 
|  | struct S7 : protected B7a {}; | 
|  | #elif defined(SECOND) | 
|  | struct B7a {}; | 
|  | struct S7 : B7a {}; | 
|  | #else | 
|  | S7 s7; | 
|  | // expected-error@second.h:* {{'BaseClass::S7' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class 'BaseClass::B7a' with no access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st base class 'BaseClass::B7a' with protected access specifier}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct B8a {}; | 
|  | struct S8 : public B8a {}; | 
|  | #elif defined(SECOND) | 
|  | struct B8a {}; | 
|  | struct S8 : private B8a {}; | 
|  | #else | 
|  | S8 s8; | 
|  | // expected-error@second.h:* {{'BaseClass::S8' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class 'BaseClass::B8a' with private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st base class 'BaseClass::B8a' with public access specifier}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct B9a {}; | 
|  | struct S9 : private B9a {}; | 
|  | #elif defined(SECOND) | 
|  | struct B9a {}; | 
|  | struct S9 : public B9a {}; | 
|  | #else | 
|  | S9 s9; | 
|  | // expected-error@second.h:* {{'BaseClass::S9' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class 'BaseClass::B9a' with public access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st base class 'BaseClass::B9a' with private access specifier}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct B10a {}; | 
|  | struct S10 : B10a {}; | 
|  | #elif defined(SECOND) | 
|  | struct B10a {}; | 
|  | struct S10 : protected B10a {}; | 
|  | #else | 
|  | S10 s10; | 
|  | // expected-error@second.h:* {{'BaseClass::S10' has different definitions in different modules; first difference is definition in module 'SecondModule' found 1st base class 'BaseClass::B10a' with protected access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st base class 'BaseClass::B10a' with no access specifier}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Base1 {}; | 
|  | struct Base2 {}; | 
|  | struct Base3 {}; | 
|  | struct Base4 {}; | 
|  | struct Base5 {}; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 : | 
|  | Base1, virtual Base2, protected Base3, public Base4, private Base5 { | 
|  |  | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 : | 
|  | Base1, virtual Base2, protected Base3, public Base4, private Base5 { | 
|  |  | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'BaseClass::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace BaseClass | 
|  |  | 
|  | namespace PointersAndReferences { | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template<typename> struct Wrapper{}; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | Wrapper<int*> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | Wrapper<float*> x; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{PointersAndReferences::S1::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | Wrapper<int &&> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | Wrapper<float &&> x; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@first.h:* {{PointersAndReferences::S2::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S2' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | Wrapper<int *> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S3 { | 
|  | Wrapper<float *> x; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // expected-error@first.h:* {{PointersAndReferences::S3::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S3' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S4 { | 
|  | Wrapper<int &> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | Wrapper<float &> x; | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // expected-error@first.h:* {{PointersAndReferences::S4::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S4' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S5 { | 
|  | Wrapper<S5 *> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S5 { | 
|  | Wrapper<const S5 *> x; | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | // expected-error@second.h:* {{'PointersAndReferences::S5::x' from module 'SecondModule' is not present in definition of 'PointersAndReferences::S5' in module 'FirstModule'}} | 
|  | // expected-note@first.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S6 { | 
|  | Wrapper<int &> x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S6 { | 
|  | Wrapper<const int &> x; | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // expected-error@first.h:* {{PointersAndReferences::S6::x' from module 'FirstModule' is not present in definition of 'PointersAndReferences::S6' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'x' does not match}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS                \ | 
|  | Wrapper<int *> x1;         \ | 
|  | Wrapper<float *> x2;       \ | 
|  | Wrapper<const float *> x3; \ | 
|  | Wrapper<int &> x4;         \ | 
|  | Wrapper<int &&> x5;        \ | 
|  | Wrapper<const int &> x6;   \ | 
|  | Wrapper<S1 *> x7;          \ | 
|  | Wrapper<S1 &> x8;          \ | 
|  | Wrapper<S1 &&> x9; | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'PointersAndReferences::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | }  // namespace PointersAndReferences | 
|  |  | 
|  | namespace FunctionTemplate { | 
|  | #if defined(FIRST) | 
|  | struct S1 { | 
|  | template <int, int> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S1 { | 
|  | template <int> void foo(); | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | // expected-error@first.h:* {{'FunctionTemplate::S1::foo' from module 'FirstModule' is not present in definition of 'FunctionTemplate::S1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'foo' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | template <char> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | template <int> void foo(); | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | // expected-error@first.h:* {{'FunctionTemplate::S2::foo' from module 'FirstModule' is not present in definition of 'FunctionTemplate::S2' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{declaration of 'foo' does not match}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | template <int x> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S3 { | 
|  | template <int y> void foo(); | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter named 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S4 { | 
|  | template <int x> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S4 { | 
|  | template <int x> void bar(); | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | // expected-error@first.h:* {{'FunctionTemplate::S4::foo' from module 'FirstModule' is not present in definition of 'FunctionTemplate::S4' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{definition has no member 'foo'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S5 { | 
|  | template <int x> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S5 { | 
|  | public: | 
|  | template <int x> void foo(); | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | // expected-error@second.h:* {{'FunctionTemplate::S5' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S6 { | 
|  | template <typename x = int> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S6 { | 
|  | template <typename x> void foo(); | 
|  | }; | 
|  | #else | 
|  | S6 s6; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S7 { | 
|  | template <typename x = void> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S7 { | 
|  | template <typename x = int> void foo(); | 
|  | }; | 
|  | #else | 
|  | S7 s7; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument 'void'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <int> | 
|  | struct U8 {}; | 
|  | struct S8 { | 
|  | template <template<int> class x = U8> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <int> | 
|  | struct T8 {}; | 
|  | struct S8{ | 
|  | template <template<int> class x = T8> void foo(); | 
|  | }; | 
|  | #else | 
|  | S8 s8; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument 'U8'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <int> | 
|  | struct U9 {}; | 
|  | struct S9 { S9(); | 
|  | template <template<int> class x = U9> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S9 { S9(); | 
|  | template <template<int> class x> void foo(); | 
|  | }; | 
|  | #else | 
|  | S9 s9; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S10 { | 
|  | template <template<int> class x> void foo(); | 
|  | template <template<typename> class x> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S10 { | 
|  | template <template<typename> class x> void foo(); | 
|  | template <template<int> class x> void foo(); | 
|  | }; | 
|  | #else | 
|  | S10 s10; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with different type}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S11 { | 
|  | template <template<int> class x> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S11 { | 
|  | template <template<int> class> void foo(); | 
|  | }; | 
|  | #else | 
|  | S11 s11; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter named 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S12 { | 
|  | template <class> void foo(); | 
|  | template <class, class> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S12 { | 
|  | template <class, class> void foo(); | 
|  | template <class> void foo(); | 
|  | }; | 
|  | #else | 
|  | S12 s12; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1 template parameter}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S13 { | 
|  | template <class = int> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S13 { | 
|  | template <class = void> void foo(); | 
|  | }; | 
|  | #else | 
|  | S13 s13; | 
|  | // 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'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument 'int'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S14 { | 
|  | template <class = void> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S14 { | 
|  | template <class> void foo(); | 
|  | }; | 
|  | #else | 
|  | S14 s14; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S15 { | 
|  | template <class> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S15 { | 
|  | template <class = void> void foo(); | 
|  | }; | 
|  | #else | 
|  | S15 s15; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with no default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S16 { | 
|  | template <short> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S16 { | 
|  | template <short = 1> void foo(); | 
|  | }; | 
|  | #else | 
|  | S16 s16; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with no default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S17 { | 
|  | template <short = 2> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S17 { | 
|  | template <short = 1 + 1> void foo(); | 
|  | }; | 
|  | #else | 
|  | S17 s17; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with default argument 2}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S18 { | 
|  | template <short> void foo(); | 
|  | template <int> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S18 { | 
|  | template <int> void foo(); | 
|  | template <short> void foo(); | 
|  | }; | 
|  | #else | 
|  | S18 s18; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter with different type}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S19 { | 
|  | template <short> void foo(); | 
|  | template <short...> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S19 { | 
|  | template <short...> void foo(); | 
|  | template <short> void foo(); | 
|  | }; | 
|  | #else | 
|  | S19 s19; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter not being a template parameter pack}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S20 { | 
|  | template <class> void foo(); | 
|  | template <class...> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S20 { | 
|  | template <class...> void foo(); | 
|  | template <class> void foo(); | 
|  | }; | 
|  | #else | 
|  | S20 s20; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter not being a template parameter pack}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S21 { | 
|  | template <template<class> class...> void foo(); | 
|  | template <template<class> class> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S21 { | 
|  | template <template<class> class> void foo(); | 
|  | template <template<class> class...> void foo(); | 
|  | }; | 
|  | #else | 
|  | S21 s21; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template parameter being a template parameter pack}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S22 { | 
|  | template <template<class> class> void foo(); | 
|  | template <class> void foo(); | 
|  | template <int> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S22 { | 
|  | template <class> void foo(); | 
|  | template <int> void foo(); | 
|  | template <template<class> class> void foo(); | 
|  | }; | 
|  | #else | 
|  | S22 s22; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template paramter being a template template parameter}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S23 { | 
|  | template <class> void foo(); | 
|  | template <int> void foo(); | 
|  | template <template<class> class> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S23 { | 
|  | template <int> void foo(); | 
|  | template <template<class> class> void foo(); | 
|  | template <class> void foo(); | 
|  | }; | 
|  | #else | 
|  | S23 s23; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template paramter being a type template parameter}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S24 { | 
|  | template <int> void foo(); | 
|  | template <template<class> class> void foo(); | 
|  | template <class> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S24 { | 
|  | template <template<class> class> void foo(); | 
|  | template <class> void foo(); | 
|  | template <int> void foo(); | 
|  | }; | 
|  | #else | 
|  | S24 s24; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template 'foo' with 1st template paramter being a non-type template parameter}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S25 { | 
|  | template <int> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S25 { | 
|  | public: | 
|  | template <int> void foo(); | 
|  | }; | 
|  | #else | 
|  | S25 s25; | 
|  | // expected-error@second.h:* {{'FunctionTemplate::S25' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found function template}} | 
|  | #endif | 
|  |  | 
|  | #define DECLS                                           \ | 
|  | template <int>                                        \ | 
|  | void nontype1();                                      \ | 
|  | template <int x>                                      \ | 
|  | void nontype2();                                      \ | 
|  | template <int, int>                                   \ | 
|  | void nontype3();                                      \ | 
|  | template <int x = 5>                                  \ | 
|  | void nontype4();                                      \ | 
|  | template <int... x>                                   \ | 
|  | void nontype5();                                      \ | 
|  | \ | 
|  | template <class>                                      \ | 
|  | void type1();                                         \ | 
|  | template <class x>                                    \ | 
|  | void type2();                                         \ | 
|  | template <class, class>                               \ | 
|  | void type3();                                         \ | 
|  | template <class x = int>                              \ | 
|  | void type4();                                         \ | 
|  | template <class... x>                                 \ | 
|  | void type5();                                         \ | 
|  | \ | 
|  | template <template <int> class>                       \ | 
|  | void template1();                                     \ | 
|  | template <template <int> class x>                     \ | 
|  | void template2();                                     \ | 
|  | template <template <int> class, template <int> class> \ | 
|  | void template3();                                     \ | 
|  | template <template <int> class x = U>                 \ | 
|  | void template4();                                     \ | 
|  | template <template <int> class... x>                  \ | 
|  | void template5(); | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template<int> | 
|  | struct U {}; | 
|  | struct Valid1 { | 
|  | DECLS | 
|  | }; | 
|  | #else | 
|  | Valid1 v1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | struct Invalid1 { | 
|  | DECLS | 
|  | ACCESS | 
|  | }; | 
|  | #else | 
|  | Invalid1 i1; | 
|  | // expected-error@second.h:* {{'FunctionTemplate::Invalid1' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | #undef DECLS | 
|  | } | 
|  |  | 
|  | namespace Enums { | 
|  | #if defined(FIRST) | 
|  | enum E1 { x11 }; | 
|  | #elif defined(SECOND) | 
|  | enum E1 {}; | 
|  | #else | 
|  | E1 e1; | 
|  | // expected-error@first.h:* {{'Enums::x11' from module 'FirstModule' is not present in definition of 'Enums::E1' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{definition has no member 'x11'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E2 {}; | 
|  | #elif defined(SECOND) | 
|  | enum E2 { x21 }; | 
|  | #else | 
|  | E2 e2; | 
|  | // expected-error@second.h:* {{'Enums::E2' has different definitions in different modules; definition in module 'SecondModule' first difference is enum with 1 element}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum with 0 elements}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E3 { x31 }; | 
|  | #elif defined(SECOND) | 
|  | enum E3 { x32 }; | 
|  | #else | 
|  | E3 e3; | 
|  | // expected-error@first.h:* {{'Enums::x31' from module 'FirstModule' is not present in definition of 'Enums::E3' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{definition has no member 'x31'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E4 { x41 }; | 
|  | #elif defined(SECOND) | 
|  | enum E4 { x41, x42 }; | 
|  | #else | 
|  | E4 e4; | 
|  | // expected-error@second.h:* {{'Enums::E4' has different definitions in different modules; definition in module 'SecondModule' first difference is enum with 2 elements}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum with 1 element}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E5 { x51, x52 }; | 
|  | #elif defined(SECOND) | 
|  | enum E5 { x51 }; | 
|  | #else | 
|  | E5 e5; | 
|  | // expected-error@first.h:* {{'Enums::x52' from module 'FirstModule' is not present in definition of 'Enums::E5' in module 'SecondModule'}} | 
|  | // expected-note@second.h:* {{definition has no member 'x52'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E6 { x61, x62 }; | 
|  | #elif defined(SECOND) | 
|  | enum E6 { x62, x61 }; | 
|  | #else | 
|  | E6 e6; | 
|  | // expected-error@second.h:* {{'Enums::E6' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st element has name 'x62'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st element has name 'x61'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E7 { x71 = 0 }; | 
|  | #elif defined(SECOND) | 
|  | enum E7 { x71 }; | 
|  | #else | 
|  | E7 e7; | 
|  | // expected-error@second.h:* {{'Enums::E7' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st element 'x71' has an initilizer}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st element 'x71' does not have an initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E8 { x81 }; | 
|  | #elif defined(SECOND) | 
|  | enum E8 { x81 = 0 }; | 
|  | #else | 
|  | E8 e8; | 
|  | // 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 initilizer}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st element 'x81' has an initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E9 { x91 = 0, x92 = 1 }; | 
|  | #elif defined(SECOND) | 
|  | enum E9 { x91 = 0, x92 = 2 - 1 }; | 
|  | #else | 
|  | E9 e9; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 2nd element 'x92' has different initializer}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum class E10 : int {}; | 
|  | #elif defined(SECOND) | 
|  | enum class E10 {}; | 
|  | #else | 
|  | E10 e10; | 
|  | // expected-error@second.h:* {{'Enums::E10' has different definitions in different modules; definition in module 'SecondModule' first difference is enum without specified type}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum with specified type}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E11 {}; | 
|  | #elif defined(SECOND) | 
|  | enum E11 : int {}; | 
|  | #else | 
|  | E11 e11; | 
|  | // expected-error@second.h:* {{'Enums::E11' has different definitions in different modules; definition in module 'SecondModule' first difference is enum with specified type}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum without specified type}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum struct E12 : long {}; | 
|  | #elif defined(SECOND) | 
|  | enum struct E12 : int {}; | 
|  | #else | 
|  | E12 e12; | 
|  | // expected-error@second.h:* {{'Enums::E12' has different definitions in different modules; definition in module 'SecondModule' first difference is enum with specified type 'int'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum with specified type 'long'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum struct E13 {}; | 
|  | #elif defined(SECOND) | 
|  | enum E13 {}; | 
|  | #else | 
|  | E13 e13; | 
|  | // expected-error@second.h:* {{'Enums::E13' has different definitions in different modules; definition in module 'SecondModule' first difference is enum that is not scoped}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum that is scoped}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum E14 {}; | 
|  | #elif defined(SECOND) | 
|  | enum struct E14 {}; | 
|  | #else | 
|  | E14 e14; | 
|  | // expected-error@second.h:* {{'Enums::E14' has different definitions in different modules; definition in module 'SecondModule' first difference is enum that is scoped}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum that is not scoped}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum class E15 {}; | 
|  | #elif defined(SECOND) | 
|  | enum struct E15 {}; | 
|  | #else | 
|  | E15 e15; | 
|  | // expected-error@second.h:* {{'Enums::E15' has different definitions in different modules; definition in module 'SecondModule' first difference is enum scoped with keyword struct}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum scoped with keyword class}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum struct E16 {}; | 
|  | #elif defined(SECOND) | 
|  | enum class E16 {}; | 
|  | #else | 
|  | E16 e16; | 
|  | // expected-error@second.h:* {{'Enums::E16' has different definitions in different modules; definition in module 'SecondModule' first difference is enum scoped with keyword class}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found enum scoped with keyword struct}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | enum Valid { v1 = (struct S*)0 == (struct S*)0 }; | 
|  | #elif defined(SECOND) | 
|  | struct S {}; | 
|  | enum Valid { v1 = (struct S*)0 == (struct S*)0 }; | 
|  | #else | 
|  | Valid V; | 
|  | #endif | 
|  | }  // namespace Enums | 
|  |  | 
|  | // Collection of interesting cases below. | 
|  |  | 
|  | // Naive parsing of AST can lead to cycles in processing.  Ensure | 
|  | // self-references don't trigger an endless cycles of AST node processing. | 
|  | namespace SelfReference { | 
|  | #if defined(FIRST) | 
|  | template <template <int> class T> class Wrapper {}; | 
|  |  | 
|  | template <int N> class S { | 
|  | S(Wrapper<::SelfReference::S> &Ref) {} | 
|  | }; | 
|  |  | 
|  | struct Xx { | 
|  | struct Yy { | 
|  | }; | 
|  | }; | 
|  |  | 
|  | Xx::Xx::Xx::Yy yy; | 
|  |  | 
|  | namespace NNS { | 
|  | template <typename> struct Foo; | 
|  | template <template <class> class T = NNS::Foo> | 
|  | struct NestedNamespaceSpecifier {}; | 
|  | } | 
|  | #endif | 
|  | }  // namespace SelfReference | 
|  |  | 
|  | namespace FriendFunction { | 
|  | #if defined(FIRST) | 
|  | void F(int = 0); | 
|  | struct S { friend void F(int); }; | 
|  | #elif defined(SECOND) | 
|  | void F(int); | 
|  | struct S { friend void F(int); }; | 
|  | #else | 
|  | S s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | void G(int = 0); | 
|  | struct T { | 
|  | friend void G(int); | 
|  |  | 
|  | private: | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | void G(int); | 
|  | struct T { | 
|  | friend void G(int); | 
|  |  | 
|  | public: | 
|  | }; | 
|  | #else | 
|  | T t; | 
|  | // expected-error@second.h:* {{'FriendFunction::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found private access specifier}} | 
|  | #endif | 
|  | }  // namespace FriendFunction | 
|  |  | 
|  | namespace ImplicitDecl { | 
|  | #if defined(FIRST) | 
|  | struct S { }; | 
|  | void S_Constructors() { | 
|  | // Trigger creation of implicit contructors | 
|  | S foo; | 
|  | S bar = foo; | 
|  | S baz(bar); | 
|  | } | 
|  | #elif defined(SECOND) | 
|  | struct S { }; | 
|  | #else | 
|  | S s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct T { | 
|  | private: | 
|  | }; | 
|  | void T_Constructors() { | 
|  | // Trigger creation of implicit contructors | 
|  | T foo; | 
|  | T bar = foo; | 
|  | T baz(bar); | 
|  | } | 
|  | #elif defined(SECOND) | 
|  | struct T { | 
|  | public: | 
|  | }; | 
|  | #else | 
|  | T t; | 
|  | // expected-error@first.h:* {{'ImplicitDecl::T' has different definitions in different modules; first difference is definition in module 'FirstModule' found private access specifier}} | 
|  | // expected-note@second.h:* {{but in 'SecondModule' found public access specifier}} | 
|  | #endif | 
|  |  | 
|  | }  // namespace ImplicitDecl | 
|  |  | 
|  | namespace TemplatedClass { | 
|  | #if defined(FIRST) | 
|  | template <class> | 
|  | struct S {}; | 
|  | #elif defined(SECOND) | 
|  | template <class> | 
|  | struct S {}; | 
|  | #else | 
|  | S<int> s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class> | 
|  | struct T { | 
|  | private: | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class> | 
|  | struct T { | 
|  | public: | 
|  | }; | 
|  | #else | 
|  | T<int> t; | 
|  | // expected-error@second.h:* {{'TemplatedClass::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found private access specifier}} | 
|  | #endif | 
|  | }  // namespace TemplatedClass | 
|  |  | 
|  | namespace TemplateClassWithField { | 
|  | #if defined(FIRST) | 
|  | template <class A> | 
|  | struct S { | 
|  | A a; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class A> | 
|  | struct S { | 
|  | A a; | 
|  | }; | 
|  | #else | 
|  | S<int> s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class A> | 
|  | struct T { | 
|  | A a; | 
|  |  | 
|  | private: | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class A> | 
|  | struct T { | 
|  | A a; | 
|  |  | 
|  | public: | 
|  | }; | 
|  | #else | 
|  | T<int> t; | 
|  | // expected-error@second.h:* {{'TemplateClassWithField::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found public access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found private access specifier}} | 
|  | #endif | 
|  | }  // namespace TemplateClassWithField | 
|  |  | 
|  | namespace TemplateClassWithTemplateField { | 
|  | #if defined(FIRST) | 
|  | template <class A> | 
|  | class WrapperS; | 
|  | template <class A> | 
|  | struct S { | 
|  | WrapperS<A> a; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class A> | 
|  | class WrapperS; | 
|  | template <class A> | 
|  | struct S { | 
|  | WrapperS<A> a; | 
|  | }; | 
|  | #else | 
|  | template <class A> | 
|  | class WrapperS{}; | 
|  | S<int> s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <class A> | 
|  | class WrapperT; | 
|  | template <class A> | 
|  | struct T { | 
|  | WrapperT<A> a; | 
|  |  | 
|  | public: | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <class A> | 
|  | class WrapperT; | 
|  | template <class A> | 
|  | struct T { | 
|  | WrapperT<A> a; | 
|  |  | 
|  | private: | 
|  | }; | 
|  | #else | 
|  | template <class A> | 
|  | class WrapperT{}; | 
|  | T<int> t; | 
|  | // expected-error@second.h:* {{'TemplateClassWithTemplateField::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | }  // namespace TemplateClassWithTemplateField | 
|  |  | 
|  | namespace EnumWithForwardDeclaration { | 
|  | #if defined(FIRST) | 
|  | enum E : int; | 
|  | struct S { | 
|  | void get(E) {} | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | enum E : int { A, B }; | 
|  | struct S { | 
|  | void get(E) {} | 
|  | }; | 
|  | #else | 
|  | S s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct T { | 
|  | void get(E) {} | 
|  | public: | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct T { | 
|  | void get(E) {} | 
|  | private: | 
|  | }; | 
|  | #else | 
|  | T t; | 
|  | // expected-error@second.h:* {{'EnumWithForwardDeclaration::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | }  // namespace EnumWithForwardDeclaration | 
|  |  | 
|  | namespace StructWithForwardDeclaration { | 
|  | #if defined(FIRST) | 
|  | struct P {}; | 
|  | struct S { | 
|  | struct P *ptr; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S { | 
|  | struct P *ptr; | 
|  | }; | 
|  | #else | 
|  | S s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct Q {}; | 
|  | struct T { | 
|  | struct Q *ptr; | 
|  | public: | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct T { | 
|  | struct Q *ptr; | 
|  | private: | 
|  | }; | 
|  | #else | 
|  | T t; | 
|  | // expected-error@second.h:* {{'StructWithForwardDeclaration::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | }  // namespace StructWithForwardDeclaration | 
|  |  | 
|  | namespace StructWithForwardDeclarationNoDefinition { | 
|  | #if defined(FIRST) | 
|  | struct P; | 
|  | struct S { | 
|  | struct P *ptr; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S { | 
|  | struct P *ptr; | 
|  | }; | 
|  | #else | 
|  | S s; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct Q; | 
|  | struct T { | 
|  | struct Q *ptr; | 
|  |  | 
|  | public: | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct T { | 
|  | struct Q *ptr; | 
|  |  | 
|  | private: | 
|  | }; | 
|  | #else | 
|  | T t; | 
|  | // expected-error@second.h:* {{'StructWithForwardDeclarationNoDefinition::T' has different definitions in different modules; first difference is definition in module 'SecondModule' found private access specifier}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found public access specifier}} | 
|  | #endif | 
|  | }  // namespace StructWithForwardDeclarationNoDefinition | 
|  |  | 
|  | namespace LateParsedDefaultArgument { | 
|  | #if defined(FIRST) | 
|  | template <typename T> | 
|  | struct S { | 
|  | struct R { | 
|  | void foo(T x = 0) {} | 
|  | }; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | #else | 
|  | void run() { | 
|  | S<int>::R().foo(); | 
|  | } | 
|  | #endif | 
|  | }  // namespace LateParsedDefaultArgument | 
|  |  | 
|  | namespace LateParsedDefaultArgument { | 
|  | #if defined(FIRST) | 
|  | template <typename alpha> struct Bravo { | 
|  | void charlie(bool delta = false) {} | 
|  | }; | 
|  | typedef Bravo<char> echo; | 
|  | echo foxtrot; | 
|  |  | 
|  | Bravo<char> golf; | 
|  | #elif defined(SECOND) | 
|  | #else | 
|  | #endif | 
|  | }  // LateParsedDefaultArgument | 
|  |  | 
|  | namespace DifferentParameterNameInTemplate { | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | template <typename T> | 
|  | struct S { | 
|  | typedef T Type; | 
|  |  | 
|  | static void Run(const Type *name_one); | 
|  | }; | 
|  |  | 
|  | template <typename T> | 
|  | void S<T>::Run(const T *name_two) {} | 
|  |  | 
|  | template <typename T> | 
|  | struct Foo { | 
|  | ~Foo() { Handler::Run(nullptr); } | 
|  | Foo() {} | 
|  |  | 
|  | class Handler : public S<T> {}; | 
|  |  | 
|  | void Get(typename Handler::Type *x = nullptr) {} | 
|  | void Add() { Handler::Run(nullptr); } | 
|  | }; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct Beta; | 
|  |  | 
|  | struct Alpha { | 
|  | Alpha(); | 
|  | void Go() { betas.Get(); } | 
|  | Foo<Beta> betas; | 
|  | }; | 
|  |  | 
|  | #elif defined(SECOND) | 
|  | struct Beta {}; | 
|  |  | 
|  | struct BetaHelper { | 
|  | void add_Beta() { betas.Add(); } | 
|  | Foo<Beta> betas; | 
|  | }; | 
|  |  | 
|  | #else | 
|  | Alpha::Alpha() {} | 
|  | #endif | 
|  | }  // DifferentParameterNameInTemplate | 
|  |  | 
|  | namespace ParameterTest { | 
|  | #if defined(FIRST) | 
|  | class X {}; | 
|  | template <typename G> | 
|  | class S { | 
|  | public: | 
|  | typedef G Type; | 
|  | static inline G *Foo(const G *a, int * = nullptr); | 
|  | }; | 
|  |  | 
|  | template<typename G> | 
|  | G* S<G>::Foo(const G* aaaa, int*) {} | 
|  | #elif defined(SECOND) | 
|  | template <typename G> | 
|  | class S { | 
|  | public: | 
|  | typedef G Type; | 
|  | static inline G *Foo(const G *a, int * = nullptr); | 
|  | }; | 
|  |  | 
|  | template<typename G> | 
|  | G* S<G>::Foo(const G* asdf, int*) {} | 
|  | #else | 
|  | S<X> s; | 
|  | #endif | 
|  | }  // ParameterTest | 
|  |  | 
|  | namespace MultipleTypedefs { | 
|  | #if defined(FIRST) | 
|  | typedef int B1; | 
|  | typedef B1 A1; | 
|  | struct S1 { | 
|  | A1 x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | typedef int A1; | 
|  | struct S1 { | 
|  | A1 x; | 
|  | }; | 
|  | #else | 
|  | S1 s1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct T2 { int x; }; | 
|  | typedef T2 B2; | 
|  | typedef B2 A2; | 
|  | struct S2 { | 
|  | T2 x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct T2 { int x; }; | 
|  | typedef T2 A2; | 
|  | struct S2 { | 
|  | T2 x; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | using A3 = const int; | 
|  | using B3 = volatile A3; | 
|  | struct S3 { | 
|  | B3 x = 1; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | using A3 = volatile const int; | 
|  | using B3 = A3; | 
|  | struct S3 { | 
|  | B3 x = 1; | 
|  | }; | 
|  | #else | 
|  | S3 s3; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | using A4 = int; | 
|  | using B4 = A4; | 
|  | struct S4 { | 
|  | B4 x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | using A4 = int; | 
|  | using B4 = ::MultipleTypedefs::A4; | 
|  | struct S4 { | 
|  | B4 x; | 
|  | }; | 
|  | #else | 
|  | S4 s4; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | using A5 = int; | 
|  | using B5 = MultipleTypedefs::A5; | 
|  | struct S5 { | 
|  | B5 x; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | using A5 = int; | 
|  | using B5 = ::MultipleTypedefs::A5; | 
|  | struct S5 { | 
|  | B5 x; | 
|  | }; | 
|  | #else | 
|  | S5 s5; | 
|  | #endif | 
|  | }  // MultipleTypedefs | 
|  |  | 
|  | namespace DefaultArguments { | 
|  | #if defined(FIRST) | 
|  | template <typename T> | 
|  | struct S { | 
|  | struct R { | 
|  | void foo(T x = 0); | 
|  | }; | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | template <typename T> | 
|  | struct S { | 
|  | struct R { | 
|  | void foo(T x = 1); | 
|  | }; | 
|  | }; | 
|  | #else | 
|  | void run() { | 
|  | S<int>::R().foo(); | 
|  | } | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'foo' with 1st parameter with a different default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | template <typename alpha> struct Bravo { | 
|  | void charlie(bool delta = false); | 
|  | }; | 
|  | typedef Bravo<char> echo; | 
|  | echo foxtrot; | 
|  | #elif defined(SECOND) | 
|  | template <typename alpha> struct Bravo { | 
|  | void charlie(bool delta = (false)); | 
|  | }; | 
|  | typedef Bravo<char> echo; | 
|  | echo foxtrot; | 
|  | #else | 
|  | Bravo<char> golf; | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found method 'charlie' with 1st parameter with a different default argument}} | 
|  | #endif | 
|  | }  // namespace DefaultArguments | 
|  |  | 
|  | namespace FunctionDecl { | 
|  | #if defined(FIRST) | 
|  | struct S1 {}; | 
|  | S1 s1a; | 
|  | #elif defined(SECOND) | 
|  | struct S1 {}; | 
|  | #else | 
|  | S1 s1; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S2 { | 
|  | S2() = default; | 
|  | }; | 
|  | S2 s2a = S2(); | 
|  | #elif defined(SECOND) | 
|  | struct S2 { | 
|  | S2() = default; | 
|  | }; | 
|  | #else | 
|  | S2 s2; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S3 { | 
|  | S3() = delete; | 
|  | }; | 
|  | S3* s3c; | 
|  | #elif defined(SECOND) | 
|  | struct S3 { | 
|  | S3() = delete; | 
|  | }; | 
|  | #else | 
|  | S3* s3; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) || defined(SECOND) | 
|  | int F1(int x, float y = 2.7) { return 1; } | 
|  | #else | 
|  | int I1 = F1(1); | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | int F2() { return 1; } | 
|  | #elif defined(SECOND) | 
|  | double F2() { return 1; } | 
|  | #else | 
|  | int I2 = F2(); | 
|  | // expected-error@-1 {{call to 'F2' is ambiguous}} | 
|  | // expected-note@first.h:* {{candidate function}} | 
|  | // expected-note@second.h:* {{candidate function}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | int F3(float) { return 1; } | 
|  | #elif defined(SECOND) | 
|  | int F3(double) { return 1; } | 
|  | #else | 
|  | int I3 = F3(1); | 
|  | // expected-error@-1 {{call to 'F3' is ambiguous}} | 
|  | // expected-note@first.h:* {{candidate function}} | 
|  | // expected-note@second.h:* {{candidate function}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | int F4(int x) { return 1; } | 
|  | #elif defined(SECOND) | 
|  | int F4(int y) { return 1; } | 
|  | #else | 
|  | int I4 = F4(1); | 
|  | // expected-error@second.h:* {{'FunctionDecl::F4' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st parameter with name 'y'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with name 'x'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | int F5(int x) { return 1; } | 
|  | #elif defined(SECOND) | 
|  | int F5(int x = 1) { return 1; } | 
|  | #else | 
|  | int I5 = F6(1); | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with a default argument}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | int F6(int x = 2) { return 1; } | 
|  | #elif defined(SECOND) | 
|  | int F6(int x = 1) { return 1; } | 
|  | #else | 
|  | int I6 = F6(1); | 
|  | // 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}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with a different default argument}} | 
|  | #endif | 
|  |  | 
|  | using I = int; | 
|  | #if defined(FIRST) | 
|  | I F7() { return 0; } | 
|  | #elif defined(SECOND) | 
|  | int F7() { return 0; } | 
|  | #else | 
|  | int I7 = F7(); | 
|  | // expected-error@second.h:* {{'FunctionDecl::F7' has different definitions in different modules; definition in module 'SecondModule' first difference is return type is 'int'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found different return type 'FunctionDecl::I' (aka 'int')}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | int F8(int) { return 0; } | 
|  | #elif defined(SECOND) | 
|  | int F8(I) { return 0; } | 
|  | #else | 
|  | int I8 = F8(1); | 
|  | // expected-error@second.h:* {{'FunctionDecl::F8' has different definitions in different modules; definition in module 'SecondModule' first difference is 1st parameter with type 'FunctionDecl::I' (aka 'int')}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with type 'int'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | int F9(int[1]) { return 0; } | 
|  | #elif defined(SECOND) | 
|  | int F9(int[2]) { return 0; } | 
|  | #else | 
|  | int I9 = F9(nullptr); | 
|  | // 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]'}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found 1st parameter with type 'int *' decayed from 'int [1]'}} | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | int F10() { return 1; } | 
|  | #elif defined(SECOND) | 
|  | int F10() { return 2; } | 
|  | #else | 
|  | int I10 = F10(); | 
|  | #endif | 
|  | // expected-error@second.h:* {{'FunctionDecl::F10' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found a different body}} | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S11 { | 
|  | template <int> void foo(); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S11 { | 
|  | template <int> void foo(); | 
|  | }; | 
|  | template <int> void S11::foo() {} | 
|  | #else | 
|  | S11 s11; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S12 { | 
|  | void foo(int x); | 
|  | }; | 
|  | #elif defined(SECOND) | 
|  | struct S12 { | 
|  | void foo(int x); | 
|  | }; | 
|  | void S12::foo(int y) {} | 
|  | #else | 
|  | S12 s12; | 
|  | #endif | 
|  |  | 
|  | #if defined(FIRST) | 
|  | struct S13 { | 
|  | void foo(int x); | 
|  | }; | 
|  | void S13::foo(int y) {} | 
|  | #elif defined(SECOND) | 
|  | struct S13 { | 
|  | void foo(int x); | 
|  | }; | 
|  | void S13::foo(int y) {} | 
|  | #else | 
|  | S13 s13; | 
|  | #endif | 
|  | }  // namespace FunctionDecl | 
|  |  | 
|  | namespace DeclTemplateArguments { | 
|  | #if defined(FIRST) | 
|  | int foo() { return 1; } | 
|  | int bar() { return foo(); } | 
|  | #elif defined(SECOND) | 
|  | template <class T = int> | 
|  | int foo() { return 2; } | 
|  | int bar() { return foo<>(); } | 
|  | #else | 
|  | int num = bar(); | 
|  | // expected-error@second.h:* {{'DeclTemplateArguments::bar' has different definitions in different modules; definition in module 'SecondModule' first difference is function body}} | 
|  | // expected-note@first.h:* {{but in 'FirstModule' found a different body}} | 
|  | #endif | 
|  | } | 
|  |  | 
|  | // Keep macros contained to one file. | 
|  | #ifdef FIRST | 
|  | #undef FIRST | 
|  | #endif | 
|  |  | 
|  | #ifdef SECOND | 
|  | #undef SECOND | 
|  | #endif | 
|  |  | 
|  | #ifdef ACCESS | 
|  | #undef ACCESS | 
|  | #endif |