xref: /aosp_15_r20/external/clang/test/Modules/cxx-irgen.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: rm -rf %t
2*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -std=c++11 -fmodules-cache-path=%t -I %S/Inputs -triple %itanium_abi_triple -disable-llvm-optzns -emit-llvm -o - %s | FileCheck %s
3*67e74705SXin Li // RUN: %clang_cc1 -fmodules -fimplicit-module-maps -x objective-c++ -std=c++11 -fmodules-cache-path=%t -I %S/Inputs -triple %itanium_abi_triple -disable-llvm-optzns -emit-llvm -debug-info-kind=limited -o - %s | FileCheck %s
4*67e74705SXin Li // FIXME: When we have a syntax for modules in C++, use that.
5*67e74705SXin Li 
6*67e74705SXin Li @import cxx_irgen_top;
7*67e74705SXin Li 
8*67e74705SXin Li CtorInit<int> x;
9*67e74705SXin Li 
10*67e74705SXin Li @import cxx_irgen_left;
11*67e74705SXin Li @import cxx_irgen_right;
12*67e74705SXin Li 
13*67e74705SXin Li // Keep these two namespace definitions separate; merging them hides the bug.
14*67e74705SXin Li namespace EmitInlineMethods {
15*67e74705SXin Li   // CHECK-DAG: define linkonce_odr [[CC:([0-9_a-z]*cc[ ]+)?]]void @_ZN17EmitInlineMethods1C1fEPNS_1AE(
16*67e74705SXin Li   // CHECK-DAG: declare [[CC]]void @_ZN17EmitInlineMethods1A1gEv(
17*67e74705SXin Li   struct C {
fEmitInlineMethods::C18*67e74705SXin Li     __attribute__((used)) void f(A *p) { p->g(); }
19*67e74705SXin Li   };
20*67e74705SXin Li }
21*67e74705SXin Li namespace EmitInlineMethods {
22*67e74705SXin Li   // CHECK-DAG: define linkonce_odr [[CC]]void @_ZN17EmitInlineMethods1D1fEPNS_1BE(
23*67e74705SXin Li   // CHECK-DAG: define linkonce_odr [[CC]]void @_ZN17EmitInlineMethods1B1gEv(
24*67e74705SXin Li   struct D {
fEmitInlineMethods::D25*67e74705SXin Li     __attribute__((used)) void f(B *p) { p->g(); }
26*67e74705SXin Li   };
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li // CHECK-DAG: define available_externally hidden {{.*}}{{signext i32|i32}} @_ZN1SIiE1gEv({{.*}} #[[ALWAYS_INLINE:.*]] align
30*67e74705SXin Li int a = S<int>::g();
31*67e74705SXin Li 
32*67e74705SXin Li int b = h();
33*67e74705SXin Li 
34*67e74705SXin Li // CHECK-DAG: define linkonce_odr {{.*}}{{signext i32|i32}} @_Z3minIiET_S0_S0_(i32
35*67e74705SXin Li int c = min(1, 2);
36*67e74705SXin Li // CHECK: define available_externally {{.*}}{{signext i32|i32}} @_ZN1SIiE1fEv({{.*}} #[[ALWAYS_INLINE]] align
37*67e74705SXin Li 
38*67e74705SXin Li namespace ImplicitSpecialMembers {
39*67e74705SXin Li   // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1BC2ERKS0_(
40*67e74705SXin Li   // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
41*67e74705SXin Li   // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1BC2EOS0_(
42*67e74705SXin Li   // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
43*67e74705SXin Li   // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1CC2ERKS0_(
44*67e74705SXin Li   // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
45*67e74705SXin Li   // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1CC2EOS0_(
46*67e74705SXin Li   // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
47*67e74705SXin Li   // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1DC2ERKS0_(
48*67e74705SXin Li   // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
49*67e74705SXin Li   // CHECK-LABEL: define {{.*}} @_ZN22ImplicitSpecialMembers1DC2EOS0_(
50*67e74705SXin Li   // CHECK: call {{.*}} @_ZN22ImplicitSpecialMembers1AC1ERKS0_(
51*67e74705SXin Li   // CHECK-LABEL: define {{.*}} @_ZN20OperatorDeleteLookup1AD0Ev(
52*67e74705SXin Li   // CHECK: call {{.*}}void @_ZN20OperatorDeleteLookup1AdlEPv(
53*67e74705SXin Li 
54*67e74705SXin Li   // CHECK-DAG: call {{[a-z\_\d]*[ ]?i32}} @_ZN8CtorInitIiE1fEv(
55*67e74705SXin Li 
56*67e74705SXin Li   extern B b1;
57*67e74705SXin Li   B b2(b1);
58*67e74705SXin Li   B b3(static_cast<B&&>(b1));
59*67e74705SXin Li 
60*67e74705SXin Li   extern C c1;
61*67e74705SXin Li   C c2(c1);
62*67e74705SXin Li   C c3(static_cast<C&&>(c1));
63*67e74705SXin Li 
64*67e74705SXin Li   extern D d1;
65*67e74705SXin Li   D d2(d1);
66*67e74705SXin Li   D d3(static_cast<D&&>(d1));
67*67e74705SXin Li }
68*67e74705SXin Li 
69*67e74705SXin Li namespace OperatorDeleteLookup {
70*67e74705SXin Li   // Trigger emission of B's vtable and deleting dtor.
71*67e74705SXin Li   // This requires us to know what operator delete was selected.
g()72*67e74705SXin Li   void g() { f(); }
73*67e74705SXin Li }
74*67e74705SXin Li 
75*67e74705SXin Li 
76*67e74705SXin Li // CHECK: attributes #[[ALWAYS_INLINE]] = {{.*}} alwaysinline
77