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 Sandoeint 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 Sandoeint 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