blob: 6fe9f7ee46a3fd2494d39b2402ce127fa3292efe [file] [log] [blame]
Stephen Hines176edba2014-12-01 14:53:08 -08001// RUN: rm -rf %t
2
3// -------------------------------
4// Build chained modules A, B, and C
5// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -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 -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 -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 -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 -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 -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 -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 -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 -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 -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
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -070067// -------------------------------
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 -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 -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
Stephen Hines176edba2014-12-01 14:53:08 -080080#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 -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 -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 -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 -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 -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 -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 -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 -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 -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//
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700164// CHECK-BAD-FILE: fatal error: file '{{.*}}not.pcm' is not a valid precompiled module file
165
Stephen Hines176edba2014-12-01 14:53:08 -0800166// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
167// RUN: -fmodule-file=%t/nonexistent.pcm \
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700168// RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-NO-FILE %s
Stephen Hines176edba2014-12-01 14:53:08 -0800169//
Pirama Arumuga Nainar3ea9e332015-04-08 08:57:32 -0700170// 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 -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'
Stephen Hines0e2c34f2015-03-23 12:09:02 -0700182
183// -------------------------------
184// Check that we don't get upset if B's timestamp is newer than C's.
185// RUN: touch %t/b.pcm
186//
187// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
188// RUN: -I%S/Inputs/explicit-build \
189// RUN: -fmodule-file=%t/c.pcm \
190// RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C
191//
192// ... but that we do get upset if our B is different from the B that C expects.
193//
194// RUN: cp %t/b-not-a.pcm %t/b.pcm
195//
196// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
197// RUN: -I%S/Inputs/explicit-build \
198// RUN: -fmodule-file=%t/c.pcm \
199// RUN: %s -DHAVE_A -DHAVE_B -DHAVE_C 2>&1 | FileCheck --check-prefix=CHECK-MISMATCHED-B %s
200//
201// CHECK-MISMATCHED-B: fatal error: malformed or corrupted AST file: {{.*}}b.pcm": module file out of date