1e842a474SRichard Smith // RUN: rm -rf %t 2e842a474SRichard Smith 3e842a474SRichard Smith // ------------------------------- 4e842a474SRichard Smith // Build chained modules A, B, and C 547972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 6e842a474SRichard Smith // RUN: -fmodule-name=a -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/a.pcm \ 7e842a474SRichard Smith // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty 8e842a474SRichard Smith // 947972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 10e842a474SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 11e842a474SRichard Smith // RUN: -fmodule-name=b -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/b.pcm \ 12e842a474SRichard Smith // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty 13e842a474SRichard Smith // 1447972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 15e842a474SRichard Smith // RUN: -fmodule-file=%t/b.pcm \ 16e842a474SRichard Smith // RUN: -fmodule-name=c -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/c.pcm \ 17e842a474SRichard Smith // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty 18e842a474SRichard Smith // 19e842a474SRichard Smith // CHECK-NO-IMPLICIT-BUILD-NOT: building module 20e842a474SRichard Smith 21e842a474SRichard Smith // ------------------------------- 22e842a474SRichard Smith // Build B with an implicit build of A 2347972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 24e842a474SRichard Smith // RUN: -fmodule-name=b -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/b-not-a.pcm \ 25e842a474SRichard Smith // RUN: 2>&1 | FileCheck --check-prefix=CHECK-B-NO-A %s 26e842a474SRichard Smith // 27e842a474SRichard Smith // CHECK-B-NO-A: While building module 'b': 28e842a474SRichard Smith // CHECK-B-NO-A: building module 'a' as 29e842a474SRichard Smith 30e842a474SRichard Smith // ------------------------------- 31e842a474SRichard Smith // Check that we can use the explicitly-built A, B, and C modules. 3247972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 33d4b230b3SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 34e842a474SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 35e842a474SRichard Smith // RUN: -verify %s -DHAVE_A 36e842a474SRichard Smith // 3747972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 38d4b230b3SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 39e842a474SRichard Smith // RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \ 40d4b230b3SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 41e842a474SRichard Smith // RUN: -verify %s -DHAVE_A 42e842a474SRichard Smith // 4347972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 44d4b230b3SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 45e842a474SRichard Smith // RUN: -fmodule-file=%t/b.pcm \ 46e842a474SRichard Smith // RUN: -verify %s -DHAVE_A -DHAVE_B 47e842a474SRichard Smith // 4847972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 49d4b230b3SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 50e842a474SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 51e842a474SRichard Smith // RUN: -fmodule-file=%t/b.pcm \ 52e842a474SRichard Smith // RUN: -verify %s -DHAVE_A -DHAVE_B 53e842a474SRichard Smith // 5447972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 55d4b230b3SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 56e842a474SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 57e842a474SRichard Smith // RUN: -fmodule-file=%t/b.pcm \ 58e842a474SRichard Smith // RUN: -fmodule-file=%t/c.pcm \ 59e842a474SRichard Smith // RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C 60e842a474SRichard Smith // 6147972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 62e842a474SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 63e842a474SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 64e842a474SRichard Smith // RUN: -fmodule-file=%t/c.pcm \ 65d4b230b3SRichard Smith // RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C 66e842a474SRichard Smith 677f330cdbSRichard Smith // ------------------------------- 687f330cdbSRichard Smith // Check that -fmodule-file= in a module build makes the file transitively 697f330cdbSRichard Smith // available even if it's not used. 7047972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fno-implicit-modules -Rmodule-build -fno-modules-error-recovery \ 717f330cdbSRichard Smith // RUN: -fmodule-file=%t/b.pcm \ 727f330cdbSRichard Smith // RUN: -fmodule-name=d -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/d.pcm \ 737f330cdbSRichard Smith // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty 747f330cdbSRichard Smith // 7547972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fno-implicit-modules -Rmodule-build -fno-modules-error-recovery \ 767f330cdbSRichard Smith // RUN: -I%S/Inputs/explicit-build \ 777f330cdbSRichard Smith // RUN: -fmodule-file=%t/d.pcm \ 787f330cdbSRichard Smith // RUN: -verify %s -DHAVE_A -DHAVE_B 797f330cdbSRichard Smith 80d4b230b3SRichard Smith #if HAVE_A 81e842a474SRichard Smith #include "a.h" 82e842a474SRichard Smith static_assert(a == 1, ""); 83d4b230b3SRichard Smith #else 84d4b230b3SRichard Smith const int use_a = a; // expected-error {{undeclared identifier}} 85d4b230b3SRichard Smith #endif 86d4b230b3SRichard Smith 87d4b230b3SRichard Smith #if HAVE_B 88d4b230b3SRichard Smith #include "b.h" 89e842a474SRichard Smith static_assert(b == 2, ""); 90d4b230b3SRichard Smith #else 91d4b230b3SRichard Smith const int use_b = b; // expected-error {{undeclared identifier}} 92d4b230b3SRichard Smith #endif 93d4b230b3SRichard Smith 94d4b230b3SRichard Smith #if HAVE_C 95d4b230b3SRichard Smith #include "c.h" 96e842a474SRichard Smith static_assert(c == 3, ""); 97e842a474SRichard Smith #else 98d4b230b3SRichard Smith const int use_c = c; // expected-error {{undeclared identifier}} 99e842a474SRichard Smith #endif 100e842a474SRichard Smith 101d4b230b3SRichard Smith #if HAVE_A && HAVE_B && HAVE_C 102d4b230b3SRichard Smith // expected-no-diagnostics 103e842a474SRichard Smith #endif 104e842a474SRichard Smith 105e842a474SRichard Smith // ------------------------------- 106e842a474SRichard Smith // Check that we can use a mixture of implicit and explicit modules. 10747972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 108d4b230b3SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 109e842a474SRichard Smith // RUN: -fmodule-file=%t/b-not-a.pcm \ 110d4b230b3SRichard Smith // RUN: -verify %s -DHAVE_A -DHAVE_B 111e842a474SRichard Smith 112e842a474SRichard Smith // ------------------------------- 113e842a474SRichard Smith // Try to use two different flavors of the 'a' module. 11447972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 115d4b230b3SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 116d4b230b3SRichard Smith // RUN: -fmodule-file=%t/b-not-a.pcm \ 117d4b230b3SRichard Smith // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s 118d4b230b3SRichard Smith // 11947972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 120d4b230b3SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 121d4b230b3SRichard Smith // RUN: -fmodule-file=%t/b-not-a.pcm \ 122d4b230b3SRichard Smith // RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \ 123d4b230b3SRichard Smith // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s 124d4b230b3SRichard Smith // 12547972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 126e842a474SRichard Smith // RUN: -fmodule-name=a -emit-module %S/Inputs/explicit-build/module.modulemap -o %t/a-alt.pcm \ 127e842a474SRichard Smith // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty 128e842a474SRichard Smith // 12947972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 130e842a474SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 131e842a474SRichard Smith // RUN: -fmodule-file=%t/a-alt.pcm \ 132e842a474SRichard Smith // RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \ 133e842a474SRichard Smith // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s 134e842a474SRichard Smith // 13547972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 136e842a474SRichard Smith // RUN: -fmodule-file=%t/a-alt.pcm \ 137e842a474SRichard Smith // RUN: -fmodule-file=%t/a.pcm \ 138e842a474SRichard Smith // RUN: -fmodule-map-file=%S/Inputs/explicit-build/module.modulemap \ 139e842a474SRichard Smith // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-MULTIPLE-AS %s 140e842a474SRichard Smith // 1414b811648SNAKAMURA Takumi // CHECK-MULTIPLE-AS: error: module 'a' is defined in both '{{.*[/\\]}}a{{.*}}.pcm' and '{{.*[/\\]}}a{{.*}}.pcm' 142e842a474SRichard Smith 143e842a474SRichard Smith // ------------------------------- 144e842a474SRichard Smith // Try to import a PCH with -fmodule-file= 14547972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 1467e82e019SRichard Smith // RUN: -fmodule-name=a -emit-pch %S/Inputs/explicit-build/a.h -o %t/a.pch -DBUILDING_A_PCH \ 147e842a474SRichard Smith // RUN: 2>&1 | FileCheck --check-prefix=CHECK-NO-IMPLICIT-BUILD %s --allow-empty 148e842a474SRichard Smith // 14947972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 150e842a474SRichard Smith // RUN: -fmodule-file=%t/a.pch \ 151e842a474SRichard Smith // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-A-AS-PCH %s 152e842a474SRichard Smith // 153e842a474SRichard Smith // CHECK-A-AS-PCH: fatal error: AST file '{{.*}}a.pch' was not built as a module 154d4b230b3SRichard Smith 155d4b230b3SRichard Smith // ------------------------------- 156d4b230b3SRichard Smith // Try to import a non-AST file with -fmodule-file= 157d4b230b3SRichard Smith // 158d4b230b3SRichard Smith // RUN: touch %t/not.pcm 159d4b230b3SRichard Smith // 16047972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 161d4b230b3SRichard Smith // RUN: -fmodule-file=%t/not.pcm \ 162d4b230b3SRichard Smith // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-BAD-FILE %s 163d4b230b3SRichard Smith // 16437bd29a5SRichard Smith // CHECK-BAD-FILE: fatal error: file '{{.*}}not.pcm' is not a valid precompiled module file 16537bd29a5SRichard Smith 16647972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 167d4b230b3SRichard Smith // RUN: -fmodule-file=%t/nonexistent.pcm \ 16837bd29a5SRichard Smith // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-NO-FILE %s 169d4b230b3SRichard Smith // 170*b3b5a736SAdrian Prantl // CHECK-NO-FILE: fatal error: module file '{{.*}}nonexistent.pcm' not found: module file not found 17137bd29a5SRichard Smith 17237bd29a5SRichard Smith // RUN: mv %t/a.pcm %t/a-tmp.pcm 17347972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 17437bd29a5SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 17537bd29a5SRichard Smith // RUN: -fmodule-file=%t/c.pcm \ 17637bd29a5SRichard Smith // RUN: %s 2>&1 | FileCheck --check-prefix=CHECK-NO-FILE-INDIRECT %s 17737bd29a5SRichard Smith // RUN: mv %t/a-tmp.pcm %t/a.pcm 17837bd29a5SRichard Smith // 17937bd29a5SRichard Smith // CHECK-NO-FILE-INDIRECT: error: module file '{{.*}}a.pcm' not found 18037bd29a5SRichard Smith // CHECK-NO-FILE-INDIRECT-NEXT: note: imported by module 'b' in '{{.*}}b.pcm' 18137bd29a5SRichard Smith // CHECK-NO-FILE-INDIRECT-NEXT: note: imported by module 'c' in '{{.*}}c.pcm' 1820f99d6a4SRichard Smith // CHECK-NO-FILE-INDIRECT-NOT: note: 1835b390756SRichard Smith 1845b390756SRichard Smith // ------------------------------- 1855b390756SRichard Smith // Check that we don't get upset if B's timestamp is newer than C's. 1865b390756SRichard Smith // RUN: touch %t/b.pcm 1875b390756SRichard Smith // 18847972afdSRichard Smith // RUN: %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 1895b390756SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 1905b390756SRichard Smith // RUN: -fmodule-file=%t/c.pcm \ 1915b390756SRichard Smith // RUN: -verify %s -DHAVE_A -DHAVE_B -DHAVE_C 1925b390756SRichard Smith // 1935b390756SRichard Smith // ... but that we do get upset if our B is different from the B that C expects. 1945b390756SRichard Smith // 1955b390756SRichard Smith // RUN: cp %t/b-not-a.pcm %t/b.pcm 1965b390756SRichard Smith // 19747972afdSRichard Smith // RUN: not %clang_cc1 -x c++ -std=c++11 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -Rmodule-build -fno-modules-error-recovery \ 1985b390756SRichard Smith // RUN: -I%S/Inputs/explicit-build \ 1995b390756SRichard Smith // RUN: -fmodule-file=%t/c.pcm \ 2005b390756SRichard Smith // RUN: %s -DHAVE_A -DHAVE_B -DHAVE_C 2>&1 | FileCheck --check-prefix=CHECK-MISMATCHED-B %s 2015b390756SRichard Smith // 2029a06a882SAdrian Prantl // CHECK-MISMATCHED-B: fatal error: module file '{{.*}}b.pcm' is out of date and needs to be rebuilt: module file out of date 2030f99d6a4SRichard Smith // CHECK-MISMATCHED-B-NEXT: note: imported by module 'c' 2040f99d6a4SRichard Smith // CHECK-MISMATCHED-B-NOT: note: 205