blob: 7091bb559848da8d12410e5dce6db70cb731e052 [file] [log] [blame]
Richard Trieu22ddc282018-09-04 22:53:19 +00001// 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
Richard Trieu0b9234b92018-09-05 22:14:46 +000028// RUN: %clang_cc1 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -x c++ -I%t/Inputs -verify %s -std=gnu++11
Richard Trieu22ddc282018-09-04 22:53:19 +000029
30#if !defined(FIRST) && !defined(SECOND)
31#include "first.h"
32#include "second.h"
33#endif
34
35namespace Types {
36namespace TypeOfExpr {
37#if defined(FIRST)
38struct Invalid1 {
39 typeof(1 + 2) x;
40};
41double global;
42struct Invalid2 {
43 typeof(global) x;
44};
45struct Valid {
46 typeof(3) x;
47 typeof(x) y;
48 typeof(Valid*) self;
49};
50#elif defined(SECOND)
51struct Invalid1 {
52 typeof(3) x;
53};
54int global;
55struct Invalid2 {
56 typeof(global) x;
57};
58struct Valid {
59 typeof(3) x;
60 typeof(x) y;
61 typeof(Valid*) self;
62};
63#else
64Invalid1 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')}}
67Invalid2 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}}
70Valid v;
71#endif
72} // namespace TypeOfExpr
73
74namespace TypeOf {
75#if defined(FIRST)
76struct Invalid1 {
77 typeof(int) x;
78};
79struct Invalid2 {
80 typeof(int) x;
81};
82using T = int;
83struct Invalid3 {
84 typeof(T) x;
85};
86struct Valid {
87 typeof(int) x;
88 using T = typeof(double);
89 typeof(T) y;
90};
91#elif defined(SECOND)
92struct Invalid1 {
93 typeof(double) x;
94};
95using I = int;
96struct Invalid2 {
97 typeof(I) x;
98};
99using T = short;
100struct Invalid3 {
101 typeof(T) x;
102};
103struct Valid {
104 typeof(int) x;
105 using T = typeof(double);
106 typeof(T) y;
107};
108#else
109Invalid1 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}}
112Invalid2 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')}}
115Invalid3 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}}
118Valid 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