1 // Clear and create directories
2 // RUN: rm -rf %t
3 // RUN: mkdir %t
4 // RUN: mkdir %t/cache
5 // RUN: mkdir %t/Inputs
6 
7 // Build first header file
8 // RUN: echo "#define FIRST" >> %t/Inputs/first.h
9 // RUN: cat %s               >> %t/Inputs/first.h
10 
11 // Build second header file
12 // RUN: echo "#define SECOND" >> %t/Inputs/second.h
13 // RUN: cat %s                >> %t/Inputs/second.h
14 
15 // Test that each header can compile
16 // RUN: %clang_cc1 -fsyntax-only -x c++ -std=gnu++11 %t/Inputs/first.h
17 // RUN: %clang_cc1 -fsyntax-only -x c++ -std=gnu++11 %t/Inputs/second.h
18 
19 // Build module map file
20 // RUN: echo "module FirstModule {"     >> %t/Inputs/module.map
21 // RUN: echo "    header \"first.h\""   >> %t/Inputs/module.map
22 // RUN: echo "}"                        >> %t/Inputs/module.map
23 // RUN: echo "module SecondModule {"    >> %t/Inputs/module.map
24 // RUN: echo "    header \"second.h\""  >> %t/Inputs/module.map
25 // RUN: echo "}"                        >> %t/Inputs/module.map
26 
27 // Run test
28 // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -x c++ -I%t/Inputs -verify %s -std=gnu++11
29 
30 #if !defined(FIRST) && !defined(SECOND)
31 #include "first.h"
32 #include "second.h"
33 #endif
34 
35 namespace Types {
36 namespace TypeOfExpr {
37 #if defined(FIRST)
38 struct Invalid1 {
39   typeof(1 + 2) x;
40 };
41 double global;
42 struct Invalid2 {
43   typeof(global) x;
44 };
45 struct Valid {
46   typeof(3) x;
47   typeof(x) y;
48   typeof(Valid*) self;
49 };
50 #elif defined(SECOND)
51 struct Invalid1 {
52   typeof(3) x;
53 };
54 int global;
55 struct Invalid2 {
56   typeof(global) x;
57 };
58 struct Valid {
59   typeof(3) x;
60   typeof(x) y;
61   typeof(Valid*) self;
62 };
63 #else
64 Invalid1 i1;
65 // expected-error@first.h:* {{'Types::TypeOfExpr::Invalid1' has different definitions in different modules; first difference is definition in module 'FirstModule' found field 'x' with type 'typeof (1 + 2)' (aka 'int')}}
66 // expected-note@second.h:* {{but in 'SecondModule' found field 'x' with type 'typeof (3)' (aka 'int')}}
67 Invalid2 i2;
68 // expected-error@second.h:* {{'Types::TypeOfExpr::Invalid2::x' from module 'SecondModule' is not present in definition of 'Types::TypeOfExpr::Invalid2' in module 'FirstModule'}}
69 // expected-note@first.h:* {{declaration of 'x' does not match}}
70 Valid v;
71 #endif
72 }  // namespace TypeOfExpr
73 
74 namespace TypeOf {
75 #if defined(FIRST)
76 struct Invalid1 {
77   typeof(int) x;
78 };
79 struct Invalid2 {
80   typeof(int) x;
81 };
82 using T = int;
83 struct Invalid3 {
84   typeof(T) x;
85 };
86 struct Valid {
87   typeof(int) x;
88   using T = typeof(double);
89   typeof(T) y;
90 };
91 #elif defined(SECOND)
92 struct Invalid1 {
93   typeof(double) x;
94 };
95 using I = int;
96 struct Invalid2 {
97   typeof(I) x;
98 };
99 using T = short;
100 struct Invalid3 {
101   typeof(T) x;
102 };
103 struct Valid {
104   typeof(int) x;
105   using T = typeof(double);
106   typeof(T) y;
107 };
108 #else
109 Invalid1 i1;
110 // expected-error@second.h:* {{'Types::TypeOf::Invalid1::x' from module 'SecondModule' is not present in definition of 'Types::TypeOf::Invalid1' in module 'FirstModule'}}
111 // expected-note@first.h:* {{declaration of 'x' does not match}}
112 Invalid2 i2;
113 // expected-error@first.h:* {{'Types::TypeOf::Invalid2' has different definitions in different modules; first difference is definition in module 'FirstModule' found field 'x' with type 'typeof(int)' (aka 'int')}}
114 // expected-note@second.h:* {{but in 'SecondModule' found field 'x' with type 'typeof(Types::TypeOf::I)' (aka 'int')}}
115 Invalid3 i3;
116 // expected-error@second.h:* {{'Types::TypeOf::Invalid3::x' from module 'SecondModule' is not present in definition of 'Types::TypeOf::Invalid3' in module 'FirstModule'}}
117 // expected-note@first.h:* {{declaration of 'x' does not match}}
118 Valid v;
119 #endif
120 }  // namespace TypeOf
121 }  // namespace Types
122 
123 // Keep macros contained to one file.
124 #ifdef FIRST
125 #undef FIRST
126 #endif
127 
128 #ifdef SECOND
129 #undef SECOND
130 #endif
131