1*f02b1cc9SIlya Biryukov // Check that the same module map file passed to -fmodule-map-file *and* 2*f02b1cc9SIlya Biryukov // available from one of the `-fmodule-file` does not allocate extra source 3*f02b1cc9SIlya Biryukov // location space. This optimization is important for using module maps in 4*f02b1cc9SIlya Biryukov // large codebases to avoid running out of source location space. 5*f02b1cc9SIlya Biryukov 6*f02b1cc9SIlya Biryukov // RUN: rm -rf %t && mkdir %t 7*f02b1cc9SIlya Biryukov // RUN: split-file %s %t 8*f02b1cc9SIlya Biryukov 9*f02b1cc9SIlya Biryukov // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules -fmodule-map-file=%t/base.map -fmodule-name=base -emit-module %t/base.map -o %t/base.pcm 10*f02b1cc9SIlya Biryukov // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 11*f02b1cc9SIlya Biryukov // RUN: -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod1.map \ 12*f02b1cc9SIlya Biryukov // RUN: -fmodule-file=%t/base.pcm \ 13*f02b1cc9SIlya Biryukov // RUN: -fmodule-name=mod1 -emit-module %t/mod1.map -o %t/mod1.pcm 14*f02b1cc9SIlya Biryukov // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 15*f02b1cc9SIlya Biryukov // RUN: -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod1.map -fmodule-map-file=%t/mod2.map \ 16*f02b1cc9SIlya Biryukov // RUN: -fmodule-file=%t/mod1.pcm \ 17*f02b1cc9SIlya Biryukov // RUN: -fmodule-name=mod2 -emit-module %t/mod2.map -o %t/mod2.pcm 18*f02b1cc9SIlya Biryukov // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 19*f02b1cc9SIlya Biryukov // RUN: -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod2.map -fmodule-map-file=%t/mod3.map \ 20*f02b1cc9SIlya Biryukov // RUN: -fmodule-file=%t/mod2.pcm \ 21*f02b1cc9SIlya Biryukov // RUN: -fmodule-name=mod3 -emit-module %t/mod3.map -o %t/mod3.pcm 22*f02b1cc9SIlya Biryukov // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 23*f02b1cc9SIlya Biryukov // RUN: -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod3.map -fmodule-map-file=%t/mod4.map \ 24*f02b1cc9SIlya Biryukov // RUN: -fmodule-file=%t/mod3.pcm \ 25*f02b1cc9SIlya Biryukov // RUN: -fmodule-name=mod4 -emit-module %t/mod4.map -o %t/mod4.pcm 26*f02b1cc9SIlya Biryukov // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod4.map -fmodule-file=%t/mod4.pcm -fsyntax-only -verify %t/check_slocs.cc 27*f02b1cc9SIlya Biryukov 28*f02b1cc9SIlya Biryukov //--- base.map 29*f02b1cc9SIlya Biryukov module base { header "vector.h" } 30*f02b1cc9SIlya Biryukov //--- mod1.map 31*f02b1cc9SIlya Biryukov module mod1 { header "mod1.h" } 32*f02b1cc9SIlya Biryukov //--- mod2.map 33*f02b1cc9SIlya Biryukov module mod2 { header "mod2.h" } 34*f02b1cc9SIlya Biryukov //--- mod3.map 35*f02b1cc9SIlya Biryukov module mod3 { header "mod3.h" } 36*f02b1cc9SIlya Biryukov //--- mod4.map 37*f02b1cc9SIlya Biryukov module mod4 { header "mod4.h" } 38*f02b1cc9SIlya Biryukov //--- check_slocs.cc 39*f02b1cc9SIlya Biryukov #include "mod4.h" 40*f02b1cc9SIlya Biryukov #pragma clang __debug sloc_usage // expected-remark {{source manager location address space usage}} 41*f02b1cc9SIlya Biryukov // expected-note@* {{% of available space}} 42*f02b1cc9SIlya Biryukov 43*f02b1cc9SIlya Biryukov // Module map files files that were specified on the command line are entered twice (once when parsing command-line, once loaded from the .pcm) 44*f02b1cc9SIlya Biryukov // Those that not specified on the command line must be entered once. 45*f02b1cc9SIlya Biryukov 46*f02b1cc9SIlya Biryukov // expected-note@base.map:1 {{file entered 2 times}} 47*f02b1cc9SIlya Biryukov // expected-note@mod4.map:1 {{file entered 2 times}} 48*f02b1cc9SIlya Biryukov // expected-note@mod1.map:1 {{file entered 1 time}} 49*f02b1cc9SIlya Biryukov // expected-note@mod2.map:1 {{file entered 1 time}} 50*f02b1cc9SIlya Biryukov // expected-note@mod3.map:1 {{file entered 1 time}} 51*f02b1cc9SIlya Biryukov // expected-note@* + {{file entered}} 52*f02b1cc9SIlya Biryukov 53*f02b1cc9SIlya Biryukov 54*f02b1cc9SIlya Biryukov //--- vector.h 55*f02b1cc9SIlya Biryukov #ifndef VECTOR_H 56*f02b1cc9SIlya Biryukov #define VECTOR_H 57*f02b1cc9SIlya Biryukov #endif 58*f02b1cc9SIlya Biryukov 59*f02b1cc9SIlya Biryukov //--- mod1.h 60*f02b1cc9SIlya Biryukov #ifndef MOD1 61*f02b1cc9SIlya Biryukov #define MOD1 62*f02b1cc9SIlya Biryukov #include "vector.h" 63*f02b1cc9SIlya Biryukov int mod1(); 64*f02b1cc9SIlya Biryukov #endif 65*f02b1cc9SIlya Biryukov //--- mod2.h 66*f02b1cc9SIlya Biryukov #ifndef MOD2 67*f02b1cc9SIlya Biryukov #define MOD2 68*f02b1cc9SIlya Biryukov #include "vector.h" 69*f02b1cc9SIlya Biryukov #include "mod1.h" 70*f02b1cc9SIlya Biryukov int mod2(); 71*f02b1cc9SIlya Biryukov #endif 72*f02b1cc9SIlya Biryukov //--- mod3.h 73*f02b1cc9SIlya Biryukov #ifndef MOD3 74*f02b1cc9SIlya Biryukov #define MOD3 75*f02b1cc9SIlya Biryukov #include "vector.h" 76*f02b1cc9SIlya Biryukov #include "mod2.h" 77*f02b1cc9SIlya Biryukov int mod3(); 78*f02b1cc9SIlya Biryukov #endif 79*f02b1cc9SIlya Biryukov //--- mod4.h 80*f02b1cc9SIlya Biryukov #ifndef MOD4 81*f02b1cc9SIlya Biryukov #define MOD4 82*f02b1cc9SIlya Biryukov #include "vector.h" 83*f02b1cc9SIlya Biryukov #include "mod3.h" 84*f02b1cc9SIlya Biryukov int mod4(); 85*f02b1cc9SIlya Biryukov #endif 86