1 // Same as prune-non-affecting-module-map-repeated.cpp, but check that textual-only 2 // inclusions do not cause duplication of the module map files they are defined in. 3 4 // RUN: rm -rf %t && mkdir %t 5 // RUN: split-file %s %t 6 7 // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 8 // RUN: -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mixed.map\ 9 // RUN: -fmodule-map-file=%t/mod1.map \ 10 // RUN: -fmodule-name=mod1 -emit-module %t/mod1.map -o %t/mod1.pcm 11 // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 12 // RUN: -fmodule-map-file=%t/mixed.map\ 13 // RUN: -fmodule-name=mixed -emit-module %t/mixed.map -o %t/mixed.pcm 14 // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 15 // RUN: -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod1.map -fmodule-map-file=%t/mod2.map \ 16 // RUN: -fmodule-file=%t/mod1.pcm -fmodule-file=%t/mixed.pcm \ 17 // RUN: -fmodule-name=mod2 -emit-module %t/mod2.map -o %t/mod2.pcm 18 // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 19 // RUN: -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod2.map -fmodule-map-file=%t/mod3.map \ 20 // RUN: -fmodule-file=%t/mod2.pcm -fmodule-file=%t/mixed.pcm \ 21 // RUN: -fmodule-name=mod3 -emit-module %t/mod3.map -o %t/mod3.pcm 22 // RUN: %clang_cc1 -xc++ -fmodules -fno-implicit-modules \ 23 // RUN: -fmodule-map-file=%t/base.map -fmodule-map-file=%t/mod3.map -fmodule-map-file=%t/mod4.map \ 24 // RUN: -fmodule-file=%t/mod3.pcm \ 25 // RUN: -fmodule-name=mod4 -emit-module %t/mod4.map -o %t/mod4.pcm 26 // 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 28 //--- base.map 29 module base { textual header "vector.h" } 30 //--- mixed.map 31 module mixed { textual header "mixed_text.h" header "mixed_mod.h"} 32 //--- mod1.map 33 module mod1 { header "mod1.h" } 34 //--- mod2.map 35 module mod2 { header "mod2.h" } 36 //--- mod3.map 37 module mod3 { header "mod3.h" } 38 //--- mod4.map 39 module mod4 { header "mod4.h" } 40 //--- check_slocs.cc 41 #include "mod4.h" 42 #include "vector.h" 43 #pragma clang __debug sloc_usage // expected-remark {{source manager location address space usage}} 44 // expected-note@* {{% of available space}} 45 46 // base.map must only be present once, despite being used in each module. 47 // Because its location in every module compile should be non-affecting. 48 49 // expected-note@base.map:1 {{file entered 1 time}} 50 51 // different modules use either only textual header from mixed.map or both textual and modular 52 // headers. Either combination must lead to only 1 use at the end, because the module is ultimately 53 // in the import chain and any textual uses should not change that. 54 55 // expected-note@mixed.map:1 {{file entered 1 time}} 56 57 // expected-note@* + {{file entered}} 58 59 60 //--- vector.h 61 #ifndef VECTOR_H 62 #define VECTOR_H 63 #endif 64 65 //--- mixed_text.h 66 #ifndef MIXED_TEXT_H 67 #define MIXED_TEXT_H 68 #endif 69 //--- mixed_mod.h 70 #ifndef MIXED_MOD_H 71 #define MIXED_MOD_H 72 #endif 73 74 //--- mod1.h 75 #ifndef MOD1 76 #define MOD1 77 #include "vector.h" 78 #include "mixed_text.h" 79 int mod1(); 80 #endif 81 //--- mod2.h 82 #ifndef MOD2 83 #define MOD2 84 #include "vector.h" 85 #include "mod1.h" 86 #include "mixed_mod.h" 87 int mod2(); 88 #endif 89 //--- mod3.h 90 #ifndef MOD3 91 #define MOD3 92 #include "vector.h" 93 #include "mod2.h" 94 #include "mixed_text.h" 95 #include "mixed_mod.h" 96 int mod3(); 97 #endif 98 //--- mod4.h 99 #ifndef MOD4 100 #define MOD4 101 #include "vector.h" 102 #include "mod3.h" 103 int mod4(); 104 #endif 105