xref: /llvm-project/clang/test/Modules/merge-template-members-parent.cpp (revision 99b54743106bae89217c3591ec7461266dbd00a4)
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()24 inline 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()40 C 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