Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / CodeGenCXX / module-intializer.cpp
blobd365d180ac59d1b4a2927a9848a456991e147df9
1 // RUN: rm -rf %t
2 // RUN: split-file %s %t
3 // RUN: cd %t
5 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 N.cpp \
6 // RUN: -emit-module-interface -o N.pcm
7 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 N.pcm -S -emit-llvm \
8 // RUN: -o - | FileCheck %s --check-prefix=CHECK-N
10 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.cpp \
11 // RUN: -emit-module-interface -o O.pcm
12 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.pcm -S -emit-llvm \
13 // RUN: -o - | FileCheck %s --check-prefix=CHECK-O
15 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-part.cpp \
16 // RUN: -emit-module-interface -o M-part.pcm
17 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-part.pcm -S \
18 // RUN: -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-P
20 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M.cpp \
21 // RUN: -fmodule-file=N=N.pcm -fmodule-file=O=O.pcm -fmodule-file=M:Part=M-part.pcm \
22 // RUN: -emit-module-interface -o M.pcm
23 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M.pcm -S -emit-llvm \
24 // RUN: -o - | FileCheck %s --check-prefix=CHECK-M
26 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 useM.cpp \
27 // RUN: -fmodule-file=M=M.pcm -S -emit-llvm -o - \
28 // RUN: | FileCheck %s --check-prefix=CHECK-USE
30 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-impl.cpp \
31 // RUN: -fmodule-file=M=M.pcm -S -emit-llvm -o - \
32 // RUN: | FileCheck %s --check-prefix=CHECK-IMPL
34 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 N.cpp -S -emit-llvm \
35 // RUN: -o - | FileCheck %s --check-prefix=CHECK-N
37 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 O.cpp -S -emit-llvm \
38 // RUN: -o - | FileCheck %s --check-prefix=CHECK-O
40 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M-part.cpp -S -emit-llvm \
41 // RUN: -o - | FileCheck %s --check-prefix=CHECK-P
43 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++20 M.cpp \
44 // RUN: -fmodule-file=N.pcm -fmodule-file=O=O.pcm -fmodule-file=M:Part=M-part.pcm \
45 // RUN: -S -emit-llvm -o - | FileCheck %s --check-prefix=CHECK-M
47 //--- N-h.h
49 struct Oink {
50 Oink(){};
53 Oink Hog;
55 //--- N.cpp
57 module;
58 #include "N-h.h"
60 export module N;
62 export struct Quack {
63 Quack(){};
66 export Quack Duck;
68 // CHECK-N: define internal void @__cxx_global_var_init
69 // CHECK-N: call {{.*}} @_ZN4OinkC1Ev
70 // CHECK-N: define internal void @__cxx_global_var_init
71 // CHECK-N: call {{.*}} @_ZNW1N5QuackC1Ev
72 // CHECK-N: define void @_ZGIW1N
73 // CHECK-N: store i8 1, ptr @_ZGIW1N__in_chrg
74 // CHECK-N: call void @__cxx_global_var_init
75 // CHECK-N: call void @__cxx_global_var_init
77 //--- O-h.h
79 struct Meow {
80 Meow(){};
83 Meow Cat;
85 //--- O.cpp
87 module;
88 #include "O-h.h"
90 export module O;
92 export struct Bark {
93 Bark(){};
96 export Bark Dog;
98 // CHECK-O: define internal void @__cxx_global_var_init
99 // CHECK-O: call {{.*}} @_ZN4MeowC2Ev
100 // CHECK-O: define internal void @__cxx_global_var_init
101 // CHECK-O: call {{.*}} @_ZNW1O4BarkC1Ev
102 // CHECK-O: define void @_ZGIW1O
103 // CHECK-O: store i8 1, ptr @_ZGIW1O__in_chrg
104 // CHECK-O: call void @__cxx_global_var_init
105 // CHECK-O: call void @__cxx_global_var_init
107 //--- P-h.h
109 struct Croak {
110 Croak(){};
113 Croak Frog;
115 //--- M-part.cpp
117 module;
118 #include "P-h.h"
120 module M:Part;
122 struct Squawk {
123 Squawk(){};
126 Squawk parrot;
128 // CHECK-P: define internal void @__cxx_global_var_init
129 // CHECK-P: call {{.*}} @_ZN5CroakC1Ev
130 // CHECK-P: define internal void @__cxx_global_var_init
131 // CHECK-P: call {{.*}} @_ZNW1M6SquawkC1Ev
132 // CHECK-P: define void @_ZGIW1MWP4Part
133 // CHECK-P: store i8 1, ptr @_ZGIW1MWP4Part__in_chrg
134 // CHECK-P: call void @__cxx_global_var_init
135 // CHECK-P: call void @__cxx_global_var_init
137 //--- M-h.h
139 struct Moo {
140 Moo(){};
143 Moo Cow;
145 //--- M.cpp
147 module;
148 #include "M-h.h"
150 export module M;
151 import N;
152 export import O;
153 import :Part;
155 export struct Baa {
156 int x;
157 Baa(){};
158 Baa(int x) : x(x) {}
159 int getX() { return x; }
162 export Baa Sheep(10);
164 // CHECK-M: define internal void @__cxx_global_var_init
165 // CHECK-M: call {{.*}} @_ZN3MooC1Ev
166 // CHECK-M: define internal void @__cxx_global_var_init
167 // CHECK-M: call {{.*}} @_ZNW1M3BaaC1Ei
168 // CHECK-M: declare void @_ZGIW1O()
169 // CHECK-M: declare void @_ZGIW1N()
170 // CHECK-M: declare void @_ZGIW1MWP4Part()
171 // CHECK-M: define void @_ZGIW1M
172 // CHECK-M: store i8 1, ptr @_ZGIW1M__in_chrg
173 // CHECK-M: call void @_ZGIW1O()
174 // CHECK-M: call void @_ZGIW1N()
175 // CHECK-M: call void @_ZGIW1MWP4Part()
176 // CHECK-M: call void @__cxx_global_var_init
177 // CHECK-M: call void @__cxx_global_var_init
179 //--- useM.cpp
181 import M;
183 int main() {
184 return Sheep.getX();
187 // CHECK-USE: declare void @_ZGIW1M
188 // CHECK-USE: define internal void @_GLOBAL__sub_I_useM.cpp
189 // CHECK-USE: call void @_ZGIW1M()
191 //--- M-impl.cpp
193 module M;
195 int foo(int i) { return i + 1; }
197 // CHECK-IMPL: declare void @_ZGIW1M
198 // CHECK-IMPL: define internal void @_GLOBAL__sub_I_M_impl.cpp
199 // CHECK-IMPL: call void @_ZGIW1M()