1 // RUN: rm -rf %t 2 // RUN: mkdir %t 3 // RUN: split-file %s %t 4 5 // RUN: %clang_cc1 -emit-obj -fmodules -fimplicit-module-maps -fmodules-cache-path=%t %t/merge.cpp -o %t/merge.o 6 7 //--- V.h 8 #ifndef V_H 9 #define V_H 10 template <typename T> 11 struct V { ~VV12 ~V() {} 13 }; 14 #endif 15 16 //--- A.h 17 #include "V.h" 18 19 void A(const V<unsigned long> &v); 20 21 //--- B.h 22 #include "V.h" 23 B()24inline V<unsigned long> B() { 25 return {}; 26 } 27 28 //--- C.h 29 #include "V.h" 30 31 #include "A.h" 32 33 class C { 34 public: C(const V<unsigned long> & v)35 C(const V<unsigned long> &v) { 36 V<unsigned long> v2; 37 } 38 }; 39 GetC()40C GetC() { 41 return {{}}; 42 } 43 44 // This include *MUST* come last. 45 #include "B.h" 46 47 //--- module.modulemap 48 module "V" { header "V.h" export * } 49 module "A" { header "A.h" export * } 50 module "B" { header "B.h" export * } 51 module "C" { header "C.h" export * } 52 53 //--- merge.cpp 54 #include "C.h" 55 56 template <typename T> 57 C GetC_main() { 58 return {{}}; 59 } 60 61 void f() { 62 GetC_main<float>(); 63 GetC(); 64 } 65