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