1 | // RUN: rm -rf %t |
2 | |
3 | // ------------------------------- |
4 | // Build chained modules A, B, and C |
5 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
6 | // RUN: -fmodule-name=a -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/a.pcm \ |
7 | // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty |
8 | // |
9 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
10 | // RUN: -fmodule-file=%t/a.pcm \ |
11 | // RUN: -fmodule-name=b -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/b.pcm \ |
12 | // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty |
13 | // |
14 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
15 | // RUN: -fmodule-file=%t/b.pcm \ |
16 | // RUN: -fmodule-name=c -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/c.pcm \ |
17 | // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty |
18 | // |
19 | // CHECK-NO-IMPLICIT-BUILD-NOT: building module |
20 | |
21 | // ------------------------------- |
22 | // Build B with an implicit build of A |
23 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
24 | // RUN: -fmodule-name=b -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/b-not-a.pcm \ |
25 | // RUN: 2>&1 | FileCheck --check-prefix=CHECK-B-NO-A %s |
26 | // |
27 | // CHECK-B-NO-A: While building module 'b': |
28 | // CHECK-B-NO-A: building module 'a' as |
29 | |
30 | // ------------------------------- |
31 | // Check that we can use the explicitly-built A, B, and C modules. |
32 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
33 | // RUN: -I%S/Inputs/explicit-build \ |
34 | // RUN: -fmodule-file=%t/a.pcm \ |
35 | // RUN: -verify %s -DHAVE_A |
36 | // |
37 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
38 | // RUN: -I%S/Inputs/explicit-build \ |
39 | // RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \ |
40 | // RUN: -fmodule-file=%t/a.pcm \ |
41 | // RUN: -verify %s -DHAVE_A |
42 | // |
43 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
44 | // RUN: -I%S/Inputs/explicit-build \ |
45 | // RUN: -fmodule-file=%t/b.pcm \ |
46 | // RUN: -verify %s -DHAVE_A -DHAVE_B |
47 | // |
48 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
49 | // RUN: -I%S/Inputs/explicit-build \ |
50 | // RUN: -fmodule-file=%t/a.pcm \ |
51 | // RUN: -fmodule-file=%t/b.pcm \ |
52 | // RUN: -verify %s -DHAVE_A -DHAVE_B |
53 | // |
54 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
55 | // RUN: -I%S/Inputs/explicit-build \ |
56 | // RUN: -fmodule-file=%t/a.pcm \ |
57 | // RUN: -fmodule-file=%t/b.pcm \ |
58 | // RUN: -fmodule-file=%t/c.pcm \ |
59 | // RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C |
60 | // |
61 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
62 | // RUN: -I%S/Inputs/explicit-build \ |
63 | // RUN: -fmodule-file=%t/a.pcm \ |
64 | // RUN: -fmodule-file=%t/c.pcm \ |
65 | // RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C |
66 | |
67 | // ------------------------------- |
68 | // Check that -fmodule-file= in a module build makes the file transitively |
69 | // available even if it's not used. |
70 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fno-implicit-modules -Rmodule-build -fno-modules-error-recovery \ |
71 | // RUN: -fmodule-file=%t/b.pcm \ |
72 | // RUN: -fmodule-name=d -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/d.pcm \ |
73 | // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty |
74 | // |
75 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fno-implicit-modules -Rmodule-build -fno-modules-error-recovery \ |
76 | // RUN: -I%S/Inputs/explicit-build \ |
77 | // RUN: -fmodule-file=%t/d.pcm \ |
78 | // RUN: -verify %s -DHAVE_A -DHAVE_B |
79 | |
80 | #if HAVE_A |
81 | #include "a.h" |
82 | static_assert(a == 1, ""); |
83 | #else |
84 | const int use_a = a; // expected-error {{undeclared identifier}} |
85 | #endif |
86 | |
87 | #if HAVE_B |
88 | #include "b.h" |
89 | static_assert(b == 2, ""); |
90 | #else |
91 | const int use_b = b; // expected-error {{undeclared identifier}} |
92 | #endif |
93 | |
94 | #if HAVE_C |
95 | #include "c.h" |
96 | static_assert(c == 3, ""); |
97 | #else |
98 | const int use_c = c; // expected-error {{undeclared identifier}} |
99 | #endif |
100 | |
101 | #if HAVE_A && HAVE_B && HAVE_C |
102 | // expected-no-diagnostics |
103 | #endif |
104 | |
105 | // ------------------------------- |
106 | // Check that we can use a mixture of implicit and explicit modules. |
107 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
108 | // RUN: -I%S/Inputs/explicit-build \ |
109 | // RUN: -fmodule-file=%t/b-not-a.pcm \ |
110 | // RUN: -verify %s -DHAVE_A -DHAVE_B |
111 | |
112 | // ------------------------------- |
113 | // Try to use two different flavors of the 'a' module. |
114 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
115 | // RUN: -fmodule-file=%t/a.pcm \ |
116 | // RUN: -fmodule-file=%t/b-not-a.pcm \ |
117 | // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s |
118 | // |
119 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
120 | // RUN: -fmodule-file=%t/a.pcm \ |
121 | // RUN: -fmodule-file=%t/b-not-a.pcm \ |
122 | // RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \ |
123 | // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s |
124 | // |
125 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
126 | // RUN: -fmodule-name=a -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/a-alt.pcm \ |
127 | // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty |
128 | // |
129 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
130 | // RUN: -fmodule-file=%t/a.pcm \ |
131 | // RUN: -fmodule-file=%t/a-alt.pcm \ |
132 | // RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \ |
133 | // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s |
134 | // |
135 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
136 | // RUN: -fmodule-file=%t/a-alt.pcm \ |
137 | // RUN: -fmodule-file=%t/a.pcm \ |
138 | // RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \ |
139 | // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s |
140 | // |
141 | // CHECK-MULTIPLE-AS: error: module 'a' is defined in both '{{.*[/\\]}}a{{.*}}.pcm' and '{{.*[/\\]}}a{{.*}}.pcm' |
142 | |
143 | // ------------------------------- |
144 | // Try to import a PCH with -fmodule-file= |
145 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
146 | // RUN: -fmodule-name=a -emit-pch %S/Inputs/explicit-build/a.h -o %t/a.pch -DBUILDING_A_PCH \ |
147 | // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty |
148 | // |
149 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
150 | // RUN: -fmodule-file=%t/a.pch \ |
151 | // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-A-AS-PCH %s |
152 | // |
153 | // CHECK-A-AS-PCH: fatal error: AST file '{{.*}}a.pch' was not built as a module |
154 | |
155 | // ------------------------------- |
156 | // Try to import a non-AST file with -fmodule-file= |
157 | // |
158 | // RUN: touch %t/not.pcm |
159 | // |
160 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
161 | // RUN: -fmodule-file=%t/not.pcm \ |
162 | // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-BAD-FILE %s |
163 | // |
164 | // CHECK-BAD-FILE: fatal error: file '{{.*}}not.pcm' is not a valid precompiled module file |
165 | |
166 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
167 | // RUN: -fmodule-file=%t/nonexistent.pcm \ |
168 | // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-NO-FILE %s |
169 | // |
170 | // CHECK-NO-FILE: fatal error: module file '{{.*}}nonexistent.pcm' not found: module file not found |
171 | |
172 | // RUN: mv %t/a.pcm %t/a-tmp.pcm |
173 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
174 | // RUN: -I%S/Inputs/explicit-build \ |
175 | // RUN: -fmodule-file=%t/c.pcm \ |
176 | // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-NO-FILE-INDIRECT %s |
177 | // RUN: mv %t/a-tmp.pcm %t/a.pcm |
178 | // |
179 | // CHECK-NO-FILE-INDIRECT: error: module file '{{.*}}a.pcm' not found |
180 | // CHECK-NO-FILE-INDIRECT-NEXT: note: imported by module 'b' in '{{.*}}b.pcm' |
181 | // CHECK-NO-FILE-INDIRECT-NEXT: note: imported by module 'c' in '{{.*}}c.pcm' |
182 | // CHECK-NO-FILE-INDIRECT-NOT: note: |
183 | |
184 | // ------------------------------- |
185 | // Check that we don't get upset if B's timestamp is newer than C's. |
186 | // RUN: touch %t/b.pcm |
187 | // |
188 | // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
189 | // RUN: -I%S/Inputs/explicit-build \ |
190 | // RUN: -fmodule-file=%t/c.pcm \ |
191 | // RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C |
192 | // |
193 | // ... but that we do get upset if our B is different from the B that C expects. |
194 | // |
195 | // RUN: cp %t/b-not-a.pcm %t/b.pcm |
196 | // |
197 | // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ |
198 | // RUN: -I%S/Inputs/explicit-build \ |
199 | // RUN: -fmodule-file=%t/c.pcm \ |
200 | // RUN: %s -DHAVE_A -DHAVE_B -DHAVE_C 2>&1 | FileCheck --check-prefix=CHECK-MISMATCHED-B %s |
201 | // |
202 | // CHECK-MISMATCHED-B: fatal error: module file '{{.*}}b.pcm' is out of date and needs to be rebuilt: module file out of date |
203 | // CHECK-MISMATCHED-B-NEXT: note: imported by module 'c' |
204 | // CHECK-MISMATCHED-B-NOT: note: |
205 | |