xref: /llvm-project/clang/test/Modules/prune-non-affecting-module-map-repeated.cpp (revision f02b1cc99e12ac0147d5c334f130a305d85e477a)
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