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 \
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
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
203// CHECK-MISMATCHED-B-NEXT: note: imported by module 'c'
204// CHECK-MISMATCHED-B-NOT:  note:
205