blob: a6f6a6268c15f1abe329b3a82111a39a33be4fc5 [file] [log] [blame]
Richard Smithe842a472014-10-22 02:05:46 +00001// RUN: rm -rf %t
2
3// -------------------------------
4// Build chained modules A, B, and C
Richard Smith47972af2015-06-16 00:08:24 +00005// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +00006// 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//
Richard Smith47972af2015-06-16 00:08:24 +00009// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +000010// 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//
Richard Smith47972af2015-06-16 00:08:24 +000014// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +000015// 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
Richard Smith47972af2015-06-16 00:08:24 +000023// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +000024// 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.
Richard Smith47972af2015-06-16 00:08:24 +000032// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +000033// RUN: -I%S/Inputs/explicit-build \
Richard Smithe842a472014-10-22 02:05:46 +000034// RUN: -fmodule-file=%t/a.pcm \
35// RUN: -verify %s -DHAVE_A
36//
Richard Smith47972af2015-06-16 00:08:24 +000037// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +000038// RUN: -I%S/Inputs/explicit-build \
Richard Smithe842a472014-10-22 02:05:46 +000039// RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \
Richard Smithd4b230b2014-10-27 23:01:16 +000040// RUN: -fmodule-file=%t/a.pcm \
Richard Smithe842a472014-10-22 02:05:46 +000041// RUN: -verify %s -DHAVE_A
42//
Richard Smith47972af2015-06-16 00:08:24 +000043// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +000044// RUN: -I%S/Inputs/explicit-build \
Richard Smithe842a472014-10-22 02:05:46 +000045// RUN: -fmodule-file=%t/b.pcm \
46// RUN: -verify %s -DHAVE_A -DHAVE_B
47//
Richard Smith47972af2015-06-16 00:08:24 +000048// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +000049// RUN: -I%S/Inputs/explicit-build \
Richard Smithe842a472014-10-22 02:05:46 +000050// RUN: -fmodule-file=%t/a.pcm \
51// RUN: -fmodule-file=%t/b.pcm \
52// RUN: -verify %s -DHAVE_A -DHAVE_B
53//
Richard Smith47972af2015-06-16 00:08:24 +000054// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +000055// RUN: -I%S/Inputs/explicit-build \
Richard Smithe842a472014-10-22 02:05:46 +000056// 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//
Richard Smith47972af2015-06-16 00:08:24 +000061// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +000062// RUN: -I%S/Inputs/explicit-build \
63// RUN: -fmodule-file=%t/a.pcm \
Richard Smithe842a472014-10-22 02:05:46 +000064// RUN: -fmodule-file=%t/c.pcm \
Richard Smithd4b230b2014-10-27 23:01:16 +000065// RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C
Richard Smithe842a472014-10-22 02:05:46 +000066
Richard Smith7f330cd2015-03-18 01:42:29 +000067// -------------------------------
68// Check that -fmodule-file= in a module build makes the file transitively
69// available even if it's not used.
Richard Smith47972af2015-06-16 00:08:24 +000070// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fno-implicit-modules -Rmodule-build -fno-modules-error-recovery \
Richard Smith7f330cd2015-03-18 01:42:29 +000071// 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//
Richard Smith47972af2015-06-16 00:08:24 +000075// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fno-implicit-modules -Rmodule-build -fno-modules-error-recovery \
Richard Smith7f330cd2015-03-18 01:42:29 +000076// RUN: -I%S/Inputs/explicit-build \
77// RUN: -fmodule-file=%t/d.pcm \
78// RUN: -verify %s -DHAVE_A -DHAVE_B
79
Richard Smithd4b230b2014-10-27 23:01:16 +000080#if HAVE_A
Richard Smithe842a472014-10-22 02:05:46 +000081 #include "a.h"
Richard Smithe842a472014-10-22 02:05:46 +000082 static_assert(a == 1, "");
Richard Smithd4b230b2014-10-27 23:01:16 +000083#else
84 const int use_a = a; // expected-error {{undeclared identifier}}
85#endif
86
87#if HAVE_B
88 #include "b.h"
Richard Smithe842a472014-10-22 02:05:46 +000089 static_assert(b == 2, "");
Richard Smithd4b230b2014-10-27 23:01:16 +000090#else
91 const int use_b = b; // expected-error {{undeclared identifier}}
92#endif
93
94#if HAVE_C
95 #include "c.h"
Richard Smithe842a472014-10-22 02:05:46 +000096 static_assert(c == 3, "");
97#else
Richard Smithd4b230b2014-10-27 23:01:16 +000098 const int use_c = c; // expected-error {{undeclared identifier}}
99#endif
Richard Smithe842a472014-10-22 02:05:46 +0000100
Richard Smithd4b230b2014-10-27 23:01:16 +0000101#if HAVE_A && HAVE_B && HAVE_C
102// expected-no-diagnostics
Richard Smithe842a472014-10-22 02:05:46 +0000103#endif
104
105// -------------------------------
106// Check that we can use a mixture of implicit and explicit modules.
Richard Smith47972af2015-06-16 00:08:24 +0000107// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +0000108// RUN: -I%S/Inputs/explicit-build \
Richard Smithe842a472014-10-22 02:05:46 +0000109// RUN: -fmodule-file=%t/b-not-a.pcm \
Richard Smithd4b230b2014-10-27 23:01:16 +0000110// RUN: -verify %s -DHAVE_A -DHAVE_B
Richard Smithe842a472014-10-22 02:05:46 +0000111
112// -------------------------------
113// Try to use two different flavors of the 'a' module.
Richard Smith47972af2015-06-16 00:08:24 +0000114// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +0000115// 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//
Richard Smith47972af2015-06-16 00:08:24 +0000119// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +0000120// 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//
Richard Smith47972af2015-06-16 00:08:24 +0000125// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +0000126// 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//
Richard Smith47972af2015-06-16 00:08:24 +0000129// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +0000130// 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//
Richard Smith47972af2015-06-16 00:08:24 +0000135// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +0000136// 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//
NAKAMURA Takumi4b811642015-08-09 22:55:50 +0000141// CHECK-MULTIPLE-AS: error: module 'a' is defined in both '{{.*[/\\]}}a{{.*}}.pcm' and '{{.*[/\\]}}a{{.*}}.pcm'
Richard Smithe842a472014-10-22 02:05:46 +0000142
143// -------------------------------
144// Try to import a PCH with -fmodule-file=
Richard Smith47972af2015-06-16 00:08:24 +0000145// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smith7e82e012016-02-19 22:25:36 +0000146// RUN: -fmodule-name=a -emit-pch %S/Inputs/explicit-build/a.h -o %t/a.pch -DBUILDING_A_PCH \
Richard Smithe842a472014-10-22 02:05:46 +0000147// RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty
148//
Richard Smith47972af2015-06-16 00:08:24 +0000149// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithe842a472014-10-22 02:05:46 +0000150// 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
Richard Smithd4b230b2014-10-27 23:01:16 +0000154
155// -------------------------------
156// Try to import a non-AST file with -fmodule-file=
157//
158// RUN: touch %t/not.pcm
159//
Richard Smith47972af2015-06-16 00:08:24 +0000160// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +0000161// RUN: -fmodule-file=%t/not.pcm \
162// RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-BAD-FILE %s
163//
Richard Smith37bd29a2015-02-28 03:09:52 +0000164// CHECK-BAD-FILE: fatal error: file '{{.*}}not.pcm' is not a valid precompiled module file
165
Richard Smith47972af2015-06-16 00:08:24 +0000166// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smithd4b230b2014-10-27 23:01:16 +0000167// RUN: -fmodule-file=%t/nonexistent.pcm \
Richard Smith37bd29a2015-02-28 03:09:52 +0000168// RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-NO-FILE %s
Richard Smithd4b230b2014-10-27 23:01:16 +0000169//
Richard Smith37bd29a2015-02-28 03:09:52 +0000170// CHECK-NO-FILE: fatal error: module file '{{.*}}nonexistent.pcm' not found
171
172// RUN: mv %t/a.pcm %t/a-tmp.pcm
Richard Smith47972af2015-06-16 00:08:24 +0000173// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smith37bd29a2015-02-28 03:09:52 +0000174// 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'
Richard Smith0f99d6a2015-08-09 08:48:41 +0000182// CHECK-NO-FILE-INDIRECT-NOT: note:
Richard Smith5b390752014-11-21 05:37:20 +0000183
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//
Richard Smith47972af2015-06-16 00:08:24 +0000188// RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smith5b390752014-11-21 05:37:20 +0000189// 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//
Richard Smith47972af2015-06-16 00:08:24 +0000197// RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \
Richard Smith5b390752014-11-21 05:37:20 +0000198// 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//
Richard Smith0f99d6a2015-08-09 08:48:41 +0000202// 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: