Clang Project

clang_source_code/test/Modules/odr_hash-gnu.cpp
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
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
131