[lld][WebAssembly] Reinstate mistakenly disabled test. NFC
[llvm-project.git] / clang / test / Modules / odr_hash-gnu.cpp
blob7091bb559848da8d12410e5dce6db70cb731e052
1 // Clear and create directories
2 // RUN: rm -rf %t
3 // RUN: mkdir %t
4 // RUN: mkdir %t/cache
5 // RUN: mkdir %t/Inputs
7 // Build first header file
8 // RUN: echo "#define FIRST" >> %t/Inputs/first.h
9 // RUN: cat %s >> %t/Inputs/first.h
11 // Build second header file
12 // RUN: echo "#define SECOND" >> %t/Inputs/second.h
13 // RUN: cat %s >> %t/Inputs/second.h
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
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
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
30 #if !defined(FIRST) && !defined(SECOND)
31 #include "first.h"
32 #include "second.h"
33 #endif
35 namespace Types {
36 namespace TypeOfExpr {
37 #if defined(FIRST)
38 struct Invalid1 {
39 typeof(1 + 2) x;
41 double global;
42 struct Invalid2 {
43 typeof(global) x;
45 struct Valid {
46 typeof(3) x;
47 typeof(x) y;
48 typeof(Valid*) self;
50 #elif defined(SECOND)
51 struct Invalid1 {
52 typeof(3) x;
54 int global;
55 struct Invalid2 {
56 typeof(global) x;
58 struct Valid {
59 typeof(3) x;
60 typeof(x) y;
61 typeof(Valid*) self;
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
74 namespace TypeOf {
75 #if defined(FIRST)
76 struct Invalid1 {
77 typeof(int) x;
79 struct Invalid2 {
80 typeof(int) x;
82 using T = int;
83 struct Invalid3 {
84 typeof(T) x;
86 struct Valid {
87 typeof(int) x;
88 using T = typeof(double);
89 typeof(T) y;
91 #elif defined(SECOND)
92 struct Invalid1 {
93 typeof(double) x;
95 using I = int;
96 struct Invalid2 {
97 typeof(I) x;
99 using T = short;
100 struct Invalid3 {
101 typeof(T) x;
103 struct Valid {
104 typeof(int) x;
105 using T = typeof(double);
106 typeof(T) y;
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
123 // Keep macros contained to one file.
124 #ifdef FIRST
125 #undef FIRST
126 #endif
128 #ifdef SECOND
129 #undef SECOND
130 #endif