1*afda39a5SIain Sandoe // RUN: rm -rf %t
2*afda39a5SIain Sandoe // RUN: split-file %s %t
3*afda39a5SIain Sandoe // RUN: cd %t
4*afda39a5SIain Sandoe 
5*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 N.cpp \
6*afda39a5SIain Sandoe // RUN:    -emit-module-interface -o N.pcm
7*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 N.pcm -S -emit-llvm \
8*afda39a5SIain Sandoe // RUN:  -o - | FileCheck %s --check-prefix=CHECK-N
9*afda39a5SIain Sandoe 
10*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.cpp \
11*afda39a5SIain Sandoe // RUN:    -emit-module-interface -o O.pcm
12*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.pcm -S -emit-llvm \
13*afda39a5SIain Sandoe // RUN:  -o - | FileCheck %s --check-prefix=CHECK-O
14*afda39a5SIain Sandoe 
15*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-part.cpp \
16*afda39a5SIain Sandoe // RUN:    -emit-module-interface -o M-part.pcm
17*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-part.pcm -S \
18*afda39a5SIain Sandoe // RUN: -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-P
19*afda39a5SIain Sandoe 
20*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M.cpp \
21*afda39a5SIain Sandoe // RUN: -fmodule-file=N.pcm -fmodule-file=O.pcm -fmodule-file=M-part.pcm \
22*afda39a5SIain Sandoe // RUN:    -emit-module-interface -o M.pcm
23*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M.pcm -S -emit-llvm \
24*afda39a5SIain Sandoe // RUN:  -o - | FileCheck %s --check-prefix=CHECK-M
25*afda39a5SIain Sandoe 
26*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 useM.cpp \
27*afda39a5SIain Sandoe // RUN: -fmodule-file=M.pcm -S -emit-llvm  -o - \
28*afda39a5SIain Sandoe // RUN: | FileCheck %s --check-prefix=CHECK-USE
29*afda39a5SIain Sandoe 
30*afda39a5SIain Sandoe // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-impl.cpp \
31*afda39a5SIain Sandoe // RUN: -fmodule-file=M.pcm -S -emit-llvm  -o - \
32*afda39a5SIain Sandoe // RUN: | FileCheck %s --check-prefix=CHECK-IMPL
33*afda39a5SIain Sandoe 
34*afda39a5SIain Sandoe //--- N-h.h
35*afda39a5SIain Sandoe 
36*afda39a5SIain Sandoe struct Oink {
OinkOink37*afda39a5SIain Sandoe   Oink(){};
38*afda39a5SIain Sandoe };
39*afda39a5SIain Sandoe 
40*afda39a5SIain Sandoe Oink Hog;
41*afda39a5SIain Sandoe 
42*afda39a5SIain Sandoe //--- N.cpp
43*afda39a5SIain Sandoe 
44*afda39a5SIain Sandoe module;
45*afda39a5SIain Sandoe #include "N-h.h"
46*afda39a5SIain Sandoe 
47*afda39a5SIain Sandoe export module N;
48*afda39a5SIain Sandoe 
49*afda39a5SIain Sandoe export struct Quack {
QuackQuack50*afda39a5SIain Sandoe   Quack(){};
51*afda39a5SIain Sandoe };
52*afda39a5SIain Sandoe 
53*afda39a5SIain Sandoe export Quack Duck;
54*afda39a5SIain Sandoe 
55*afda39a5SIain Sandoe // CHECK-N: define internal void @__cxx_global_var_init
56*afda39a5SIain Sandoe // CHECK-N: call {{.*}} @_ZN4OinkC1Ev
57*afda39a5SIain Sandoe // CHECK-N: define internal void @__cxx_global_var_init
58*afda39a5SIain Sandoe // CHECK-N: call {{.*}} @_ZNW1N5QuackC1Ev
59*afda39a5SIain Sandoe // CHECK-N: define void @_ZGIW1N
60*afda39a5SIain Sandoe // CHECK-N: store i8 1, ptr @_ZGIW1N__in_chrg
61*afda39a5SIain Sandoe // CHECK-N: call void @__cxx_global_var_init
62*afda39a5SIain Sandoe // CHECK-N: call void @__cxx_global_var_init
63*afda39a5SIain Sandoe 
64*afda39a5SIain Sandoe //--- O-h.h
65*afda39a5SIain Sandoe 
66*afda39a5SIain Sandoe struct Meow {
MeowMeow67*afda39a5SIain Sandoe   Meow(){};
68*afda39a5SIain Sandoe };
69*afda39a5SIain Sandoe 
70*afda39a5SIain Sandoe Meow Cat;
71*afda39a5SIain Sandoe 
72*afda39a5SIain Sandoe //--- O.cpp
73*afda39a5SIain Sandoe 
74*afda39a5SIain Sandoe module;
75*afda39a5SIain Sandoe #include "O-h.h"
76*afda39a5SIain Sandoe 
77*afda39a5SIain Sandoe export module O;
78*afda39a5SIain Sandoe 
79*afda39a5SIain Sandoe export struct Bark {
BarkBark80*afda39a5SIain Sandoe   Bark(){};
81*afda39a5SIain Sandoe };
82*afda39a5SIain Sandoe 
83*afda39a5SIain Sandoe export Bark Dog;
84*afda39a5SIain Sandoe 
85*afda39a5SIain Sandoe // CHECK-O: define internal void @__cxx_global_var_init
86*afda39a5SIain Sandoe // CHECK-O: call {{.*}} @_ZN4MeowC2Ev
87*afda39a5SIain Sandoe // CHECK-O: define internal void @__cxx_global_var_init
88*afda39a5SIain Sandoe // CHECK-O: call {{.*}} @_ZNW1O4BarkC1Ev
89*afda39a5SIain Sandoe // CHECK-O: define void @_ZGIW1O
90*afda39a5SIain Sandoe // CHECK-O: store i8 1, ptr @_ZGIW1O__in_chrg
91*afda39a5SIain Sandoe // CHECK-O: call void @__cxx_global_var_init
92*afda39a5SIain Sandoe // CHECK-O: call void @__cxx_global_var_init
93*afda39a5SIain Sandoe 
94*afda39a5SIain Sandoe //--- P-h.h
95*afda39a5SIain Sandoe 
96*afda39a5SIain Sandoe struct Croak {
CroakCroak97*afda39a5SIain Sandoe   Croak(){};
98*afda39a5SIain Sandoe };
99*afda39a5SIain Sandoe 
100*afda39a5SIain Sandoe Croak Frog;
101*afda39a5SIain Sandoe 
102*afda39a5SIain Sandoe //--- M-part.cpp
103*afda39a5SIain Sandoe 
104*afda39a5SIain Sandoe module;
105*afda39a5SIain Sandoe #include "P-h.h"
106*afda39a5SIain Sandoe 
107*afda39a5SIain Sandoe module M:Part;
108*afda39a5SIain Sandoe 
109*afda39a5SIain Sandoe struct Squawk {
SquawkSquawk110*afda39a5SIain Sandoe   Squawk(){};
111*afda39a5SIain Sandoe };
112*afda39a5SIain Sandoe 
113*afda39a5SIain Sandoe Squawk parrot;
114*afda39a5SIain Sandoe 
115*afda39a5SIain Sandoe // CHECK-P: define internal void @__cxx_global_var_init
116*afda39a5SIain Sandoe // CHECK-P: call {{.*}} @_ZN5CroakC1Ev
117*afda39a5SIain Sandoe // CHECK-P: define internal void @__cxx_global_var_init
118*afda39a5SIain Sandoe // CHECK-P: call {{.*}} @_ZNW1M6SquawkC1Ev
119*afda39a5SIain Sandoe // CHECK-P: define void @_ZGIW1MWP4Part
120*afda39a5SIain Sandoe // CHECK-P: store i8 1, ptr @_ZGIW1MWP4Part__in_chrg
121*afda39a5SIain Sandoe // CHECK-P: call void @__cxx_global_var_init
122*afda39a5SIain Sandoe // CHECK-P: call void @__cxx_global_var_init
123*afda39a5SIain Sandoe 
124*afda39a5SIain Sandoe //--- M-h.h
125*afda39a5SIain Sandoe 
126*afda39a5SIain Sandoe struct Moo {
MooMoo127*afda39a5SIain Sandoe   Moo(){};
128*afda39a5SIain Sandoe };
129*afda39a5SIain Sandoe 
130*afda39a5SIain Sandoe Moo Cow;
131*afda39a5SIain Sandoe 
132*afda39a5SIain Sandoe //--- M.cpp
133*afda39a5SIain Sandoe 
134*afda39a5SIain Sandoe module;
135*afda39a5SIain Sandoe #include "M-h.h"
136*afda39a5SIain Sandoe 
137*afda39a5SIain Sandoe export module M;
138*afda39a5SIain Sandoe import N;
139*afda39a5SIain Sandoe export import O;
140*afda39a5SIain Sandoe import :Part;
141*afda39a5SIain Sandoe 
142*afda39a5SIain Sandoe export struct Baa {
143*afda39a5SIain Sandoe   int x;
BaaBaa144*afda39a5SIain Sandoe   Baa(){};
BaaBaa145*afda39a5SIain Sandoe   Baa(int x) : x(x) {}
getXBaa146*afda39a5SIain Sandoe   int getX() { return x; }
147*afda39a5SIain Sandoe };
148*afda39a5SIain Sandoe 
149*afda39a5SIain Sandoe export Baa Sheep(10);
150*afda39a5SIain Sandoe 
151*afda39a5SIain Sandoe // CHECK-M: define internal void @__cxx_global_var_init
152*afda39a5SIain Sandoe // CHECK-M: call {{.*}} @_ZN3MooC1Ev
153*afda39a5SIain Sandoe // CHECK-M: define internal void @__cxx_global_var_init
154*afda39a5SIain Sandoe // CHECK-M: call {{.*}} @_ZNW1M3BaaC1Ei
155*afda39a5SIain Sandoe // CHECK-M: declare void @_ZGIW1O()
156*afda39a5SIain Sandoe // CHECK-M: declare void @_ZGIW1N()
157*afda39a5SIain Sandoe // CHECK-M: declare void @_ZGIW1MWP4Part()
158*afda39a5SIain Sandoe // CHECK-M: define void @_ZGIW1M
159*afda39a5SIain Sandoe // CHECK-M: store i8 1, ptr @_ZGIW1M__in_chrg
160*afda39a5SIain Sandoe // CHECK-M: call void @_ZGIW1O()
161*afda39a5SIain Sandoe // CHECK-M: call void @_ZGIW1N()
162*afda39a5SIain Sandoe // CHECK-M: call void @_ZGIW1MWP4Part()
163*afda39a5SIain Sandoe // CHECK-M: call void @__cxx_global_var_init
164*afda39a5SIain Sandoe // CHECK-M: call void @__cxx_global_var_init
165*afda39a5SIain Sandoe 
166*afda39a5SIain Sandoe //--- useM.cpp
167*afda39a5SIain Sandoe 
168*afda39a5SIain Sandoe import M;
169*afda39a5SIain Sandoe 
main()170*afda39a5SIain Sandoe int main() {
171*afda39a5SIain Sandoe   return Sheep.getX();
172*afda39a5SIain Sandoe }
173*afda39a5SIain Sandoe 
174*afda39a5SIain Sandoe // CHECK-USE: declare void @_ZGIW1M
175*afda39a5SIain Sandoe // CHECK-USE: define internal void @_GLOBAL__sub_I_useM.cpp
176*afda39a5SIain Sandoe // CHECK-USE: call void @_ZGIW1M()
177*afda39a5SIain Sandoe 
178*afda39a5SIain Sandoe //--- M-impl.cpp
179*afda39a5SIain Sandoe 
180*afda39a5SIain Sandoe module M;
181*afda39a5SIain Sandoe 
foo(int i)182*afda39a5SIain Sandoe int foo(int i) { return i + 1; }
183*afda39a5SIain Sandoe 
184*afda39a5SIain Sandoe // CHECK-IMPL: declare void @_ZGIW1M
185*afda39a5SIain Sandoe // CHECK-IMPL: define internal void @_GLOBAL__sub_I_M_impl.cpp
186*afda39a5SIain Sandoe // CHECK-IMPL: call void @_ZGIW1M()
187