// RUN: rm -rf %t // RUN: mkdir %t // RUN: split-file %s %t // RUN: %clang_cc1 -emit-obj -fmodules -fimplicit-module-maps -fmodules-cache-path=%t %t/merge.cpp -o %t/merge.o //--- V.h #ifndef V_H #define V_H template struct V { ~V() {} }; #endif //--- A.h #include "V.h" void A(const V &v); //--- B.h #include "V.h" inline V B() { return {}; } //--- C.h #include "V.h" #include "A.h" class C { public: C(const V &v) { V v2; } }; C GetC() { return {{}}; } // This include *MUST* come last. #include "B.h" //--- module.modulemap module "V" { header "V.h" export * } module "A" { header "A.h" export * } module "B" { header "B.h" export * } module "C" { header "C.h" export * } //--- merge.cpp #include "C.h" template C GetC_main() { return {{}}; } void f() { GetC_main(); GetC(); }