// 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 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 S1 { typename T::typeA x; }; #elif defined(SECOND) template class S1 { typename T::typeB x; }; #else template using U1 = S1; // expected-error@first.h:* {{'DependentType::S1::x' from module 'FirstModule' is not present in definition of 'S1' 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 struct Valid1 { DECLS }; #else template using V1 = Valid1; #endif #if defined(FIRST) || defined(SECOND) template struct Invalid1 { DECLS ACCESS }; #else template using I1 = Invalid1; // 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 S7 { typename T::type *x = {}; int z = x->T::foo(); }; #elif defined(SECOND) template class S7 { typename T::type *x = {}; int z = x->U::foo(); }; #else template using U7 = S7; // 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 S8 { int x = T::template X::value; }; #elif defined(SECOND) template class S8 { int x = T::template Y::value; }; #else template using U8 = S8; // 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::value; #if defined(FIRST) || defined(SECOND) template struct Valid2 { DECLS }; #else template using V2 = Valid2; #endif #if defined(FIRST) || defined(SECOND) template struct Invalid2 { DECLS ACCESS }; #else template using I2 = Invalid2; // 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 struct U1 {}; struct S1 { U1 u; }; #elif defined(SECOND) template struct U1 {}; struct S1 { U1 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 struct U2 {}; struct S2 { U2 u; }; #elif defined(SECOND) template struct V1 {}; struct S2 { V1 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 x; \ OneTemplateArg y; \ OneTemplateArg z; \ TwoTemplateArgs a; \ TwoTemplateArgs b; \ TwoTemplateArgs c; #if defined(FIRST) || defined(SECOND) template struct OneTemplateArg {}; template 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 struct U1{}; struct S1 { U1 x; }; #elif defined(SECOND) template 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 struct U2{}; struct S2 { using T = U2<2>; }; #elif defined(SECOND) template 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 struct U3{}; struct S3 { using T = U3<2>; }; #elif defined(SECOND) template 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 struct T4a {}; template