xref: /aosp_15_r20/external/clang/test/CodeGenCXX/inline-hint.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-linux -finline-functions -emit-llvm -disable-llvm-optzns -o - | FileCheck %s --check-prefix=CHECK --check-prefix=SUITABLE
2*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-linux -finline-hint-functions -emit-llvm -disable-llvm-optzns -o - | FileCheck %s --check-prefix=CHECK --check-prefix=HINTED
3*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-linux -fno-inline -emit-llvm -disable-llvm-optzns -o - | FileCheck %s --check-prefix=CHECK --check-prefix=NOINLINE
4*67e74705SXin Li 
5*67e74705SXin Li // Force non-trivial implicit constructors/destructors/operators for B by having explicit ones for A
6*67e74705SXin Li struct A {
AA7*67e74705SXin Li   A() {}
AA8*67e74705SXin Li   A(const A&) {}
operator =A9*67e74705SXin Li   A& operator=(const A&) { return *this; }
~AA10*67e74705SXin Li   ~A() {}
11*67e74705SXin Li };
12*67e74705SXin Li 
13*67e74705SXin Li struct B {
14*67e74705SXin Li   A member;
implicitFunctionB15*67e74705SXin Li   int implicitFunction(int a) { return a + a; }
16*67e74705SXin Li   inline int explicitFunction(int a);
17*67e74705SXin Li   int noHintFunction(int a);
optNoneFunctionB18*67e74705SXin Li   __attribute__((optnone)) int optNoneFunction(int a) { return a + a; }
implicitTplFunctionB19*67e74705SXin Li   template<int N> int implicitTplFunction(int a) { return N + a; }
explicitTplFunctionB20*67e74705SXin Li   template<int N> inline int explicitTplFunction(int a) { return N + a; }
21*67e74705SXin Li   template<int N> int noHintTplFunction(int a);
22*67e74705SXin Li   template<int N> int explicitRedeclTplFunction(int a);
23*67e74705SXin Li };
24*67e74705SXin Li 
explicitFunction(int a)25*67e74705SXin Li int B::explicitFunction(int a) { return a + a; }
26*67e74705SXin Li // CHECK: @_ZN1B14noHintFunctionEi({{.*}}) [[NOHINT_ATTR:#[0-9]+]]
noHintFunction(int a)27*67e74705SXin Li int B::noHintFunction(int a) { return a + a; }
28*67e74705SXin Li 
29*67e74705SXin Li // CHECK: @_ZN1B19implicitTplFunctionILi0EEEii({{.*}}) [[NOHINT_ATTR]]
implicitTplFunction(int a)30*67e74705SXin Li template<> int B::implicitTplFunction<0>(int a) { return a + a; }
31*67e74705SXin Li // CHECK: @_ZN1B19explicitTplFunctionILi0EEEii({{.*}}) [[NOHINT_ATTR]]
explicitTplFunction(int a)32*67e74705SXin Li template<> int B::explicitTplFunction<0>(int a) { return a + a; }
33*67e74705SXin Li // CHECK: @_ZN1B17noHintTplFunctionILi0EEEii({{.*}}) [[NOHINT_ATTR]]
noHintTplFunction(int a)34*67e74705SXin Li template<> int B::noHintTplFunction<0>(int a) { return a + a; }
implicitTplFunction(int a)35*67e74705SXin Li template<> inline int B::implicitTplFunction<1>(int a) { return a; }
explicitTplFunction(int a)36*67e74705SXin Li template<> inline int B::explicitTplFunction<1>(int a) { return a; }
noHintTplFunction(int a)37*67e74705SXin Li template<> inline int B::noHintTplFunction<1>(int a) { return a; }
noHintTplFunction(int a)38*67e74705SXin Li template<int N> int B::noHintTplFunction(int a) { return N + a; }
explicitRedeclTplFunction(int a)39*67e74705SXin Li template<int N> inline int B::explicitRedeclTplFunction(int a) { return N + a; }
40*67e74705SXin Li 
constexprFunction(int a)41*67e74705SXin Li constexpr int constexprFunction(int a) { return a + a; }
42*67e74705SXin Li 
foo()43*67e74705SXin Li void foo()
44*67e74705SXin Li {
45*67e74705SXin Li // CHECK: @_ZN1BC1Ev({{.*}}) unnamed_addr [[IMPLICIT_CONSTR_ATTR:#[0-9]+]]
46*67e74705SXin Li   B b1;
47*67e74705SXin Li // CHECK: @_ZN1BC1ERKS_({{.*}}) unnamed_addr [[IMPLICIT_CONSTR_ATTR]]
48*67e74705SXin Li   B b2(b1);
49*67e74705SXin Li // CHECK: @_ZN1BaSERKS_({{.*}}) [[IMPLICIT_CONSTR_ATTR]]
50*67e74705SXin Li   b2 = b1;
51*67e74705SXin Li // CHECK: @_ZN1B16implicitFunctionEi({{.*}}) [[IMPLICIT_ATTR:#[0-9]+]]
52*67e74705SXin Li   b1.implicitFunction(1);
53*67e74705SXin Li // CHECK: @_ZN1B16explicitFunctionEi({{.*}}) [[EXPLICIT_ATTR:#[0-9]+]]
54*67e74705SXin Li   b1.explicitFunction(2);
55*67e74705SXin Li   b1.noHintFunction(3);
56*67e74705SXin Li // CHECK: @_ZN1B15optNoneFunctionEi({{.*}}) [[OPTNONE_ATTR:#[0-9]+]]
57*67e74705SXin Li   b1.optNoneFunction(4);
58*67e74705SXin Li // CHECK: @_Z17constexprFunctioni({{.*}}) [[IMPLICIT_ATTR]]
59*67e74705SXin Li   constexprFunction(5);
60*67e74705SXin Li   b1.implicitTplFunction<0>(6);
61*67e74705SXin Li // CHECK: @_ZN1B19implicitTplFunctionILi1EEEii({{.*}}) [[EXPLICIT_ATTR]]
62*67e74705SXin Li   b1.implicitTplFunction<1>(7);
63*67e74705SXin Li // CHECK: @_ZN1B19implicitTplFunctionILi2EEEii({{.*}}) [[IMPLICIT_ATTR]]
64*67e74705SXin Li   b1.implicitTplFunction<2>(8);
65*67e74705SXin Li   b1.explicitTplFunction<0>(9);
66*67e74705SXin Li // CHECK: @_ZN1B19explicitTplFunctionILi1EEEii({{.*}}) [[EXPLICIT_ATTR]]
67*67e74705SXin Li   b1.explicitTplFunction<1>(10);
68*67e74705SXin Li // CHECK: @_ZN1B19explicitTplFunctionILi2EEEii({{.*}}) [[EXPLICIT_ATTR]]
69*67e74705SXin Li   b1.explicitTplFunction<2>(11);
70*67e74705SXin Li   b1.noHintTplFunction<0>(12);
71*67e74705SXin Li // CHECK: @_ZN1B17noHintTplFunctionILi1EEEii({{.*}}) [[EXPLICIT_ATTR]]
72*67e74705SXin Li   b1.noHintTplFunction<1>(13);
73*67e74705SXin Li // CHECK: @_ZN1B17noHintTplFunctionILi2EEEii({{.*}}) [[NOHINT_ATTR]]
74*67e74705SXin Li   b1.noHintTplFunction<2>(14);
75*67e74705SXin Li // CHECK: @_ZN1B25explicitRedeclTplFunctionILi2EEEii({{.*}}) [[EXPLICIT_ATTR]]
76*67e74705SXin Li   b1.explicitRedeclTplFunction<2>(15);
77*67e74705SXin Li // CHECK: @_ZN1BD2Ev({{.*}}) unnamed_addr [[IMPLICIT_CONSTR_ATTR]]
78*67e74705SXin Li }
79*67e74705SXin Li 
80*67e74705SXin Li // SUITABLE-NOT: attributes [[NOHINT_ATTR]] = { {{.*}}noinline{{.*}} }
81*67e74705SXin Li //   HINTED-DAG: attributes [[NOHINT_ATTR]] = { noinline{{.*}} }
82*67e74705SXin Li // NOINLINE-DAG: attributes [[NOHINT_ATTR]] = { noinline{{.*}} }
83*67e74705SXin Li 
84*67e74705SXin Li // SUITABLE-NOT: attributes [[IMPLICIT_ATTR]] = { {{.*}}noinline{{.*}} }
85*67e74705SXin Li //   HINTED-NOT: attributes [[IMPLICIT_ATTR]] = { {{.*}}noinline{{.*}} }
86*67e74705SXin Li // NOINLINE-DAG: attributes [[IMPLICIT_ATTR]] = { noinline{{.*}} }
87*67e74705SXin Li 
88*67e74705SXin Li // SUITABLE-NOT: attributes [[IMPLICIT_CONSTR_ATTR]] = { {{.*}}noinline{{.*}} }
89*67e74705SXin Li //   HINTED-NOT: attributes [[IMPLICIT_ATTR]] = { {{.*}}noinline{{.*}} }
90*67e74705SXin Li // NOINLINE-DAG: attributes [[IMPLICIT_CONSTR_ATTR]] = { noinline{{.*}} }
91*67e74705SXin Li 
92*67e74705SXin Li // SUITABLE-NOT: attributes [[EXPLICIT_ATTR]] = { {{.*}}noinline{{.*}} }
93*67e74705SXin Li //   HINTED-NOT: attributes [[IMPLICIT_ATTR]] = { {{.*}}noinline{{.*}} }
94*67e74705SXin Li // NOINLINE-DAG: attributes [[EXPLICIT_ATTR]] = { noinline{{.*}} }
95*67e74705SXin Li 
96*67e74705SXin Li // CHECK-DAG: attributes [[OPTNONE_ATTR]] = { noinline{{.*}} }
97