xref: /aosp_15_r20/external/clang/test/CodeGenCXX/inline-functions.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=NORMAL
2*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -fms-compatibility -triple=x86_64-pc-win32 -emit-llvm -o - | FileCheck %s --check-prefix=CHECK --check-prefix=MSVCCOMPAT
3*67e74705SXin Li // CHECK: ; ModuleID
4*67e74705SXin Li 
5*67e74705SXin Li struct A {
6*67e74705SXin Li     inline void f();
7*67e74705SXin Li };
8*67e74705SXin Li 
9*67e74705SXin Li // NORMAL-NOT: define void @_ZN1A1fEv
10*67e74705SXin Li // MSVCCOMPAT-NOT: define void @"\01?f@A@@QEAAXXZ"
f()11*67e74705SXin Li void A::f() { }
12*67e74705SXin Li 
13*67e74705SXin Li template<typename> struct B { };
14*67e74705SXin Li 
15*67e74705SXin Li template<> struct B<char> {
16*67e74705SXin Li   inline void f();
17*67e74705SXin Li };
18*67e74705SXin Li 
19*67e74705SXin Li // NORMAL-NOT: _ZN1BIcE1fEv
20*67e74705SXin Li // MSVCCOMPAT-NOT: @"\01?f@?$B@D@@QEAAXXZ"
f()21*67e74705SXin Li void B<char>::f() { }
22*67e74705SXin Li 
23*67e74705SXin Li // We need a final CHECK line here.
24*67e74705SXin Li 
25*67e74705SXin Li // NORMAL-LABEL: define void @_Z1fv
26*67e74705SXin Li // MSVCCOMPAT-LABEL: define void @"\01?f@@YAXXZ"
f()27*67e74705SXin Li void f() { }
28*67e74705SXin Li 
29*67e74705SXin Li // <rdar://problem/8740363>
30*67e74705SXin Li inline void f1(int);
31*67e74705SXin Li 
32*67e74705SXin Li // NORMAL-LABEL: define linkonce_odr void @_Z2f1i
33*67e74705SXin Li // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?f1@@YAXH@Z"
f1(int)34*67e74705SXin Li void f1(int) { }
35*67e74705SXin Li 
test_f1()36*67e74705SXin Li void test_f1() { f1(17); }
37*67e74705SXin Li 
38*67e74705SXin Li // PR8789
39*67e74705SXin Li namespace test1 {
40*67e74705SXin Li   template <typename T> class ClassTemplate {
41*67e74705SXin Li   private:
42*67e74705SXin Li     friend void T::func();
g()43*67e74705SXin Li     void g() {}
44*67e74705SXin Li   };
45*67e74705SXin Li 
46*67e74705SXin Li   // NORMAL-LABEL: define linkonce_odr void @_ZN5test11C4funcEv(
47*67e74705SXin Li   // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?func@C@test1@@QEAAXXZ"(
48*67e74705SXin Li 
49*67e74705SXin Li   class C {
50*67e74705SXin Li   public:
func()51*67e74705SXin Li     void func() {
52*67e74705SXin Li       ClassTemplate<C> ct;
53*67e74705SXin Li       ct.g();
54*67e74705SXin Li     }
55*67e74705SXin Li   };
56*67e74705SXin Li 
f()57*67e74705SXin Li   void f() {
58*67e74705SXin Li     C c;
59*67e74705SXin Li     c.func();
60*67e74705SXin Li   }
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li // PR13252
64*67e74705SXin Li namespace test2 {
65*67e74705SXin Li   struct A;
66*67e74705SXin Li   void f(const A& a);
67*67e74705SXin Li   struct A {
f(const A & a)68*67e74705SXin Li     friend void f(const A& a) { }
69*67e74705SXin Li   };
g()70*67e74705SXin Li   void g() {
71*67e74705SXin Li     A a;
72*67e74705SXin Li     f(a);
73*67e74705SXin Li   }
74*67e74705SXin Li   // NORMAL-LABEL: define linkonce_odr void @_ZN5test21fERKNS_1AE
75*67e74705SXin Li   // MSVCCOMPAT-LABEL: define linkonce_odr void @"\01?f@test2@@YAXAEBUA@1@@Z"
76*67e74705SXin Li }
77*67e74705SXin Li 
78*67e74705SXin Li // NORMAL-NOT: _Z17ExternAndInlineFnv
79*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01?ExternAndInlineFn@@YAXXZ"
ExternAndInlineFn()80*67e74705SXin Li extern inline void ExternAndInlineFn() {}
81*67e74705SXin Li 
82*67e74705SXin Li // NORMAL-NOT: _Z18InlineThenExternFnv
83*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01?InlineThenExternFn@@YAXXZ"
InlineThenExternFn()84*67e74705SXin Li inline void InlineThenExternFn() {}
85*67e74705SXin Li extern void InlineThenExternFn();
86*67e74705SXin Li 
87*67e74705SXin Li // NORMAL-LABEL: define void @_Z18ExternThenInlineFnv
88*67e74705SXin Li // MSVCCOMPAT-LABEL: define void @"\01?ExternThenInlineFn@@YAXXZ"
ExternThenInlineFn()89*67e74705SXin Li extern void ExternThenInlineFn() {}
90*67e74705SXin Li 
91*67e74705SXin Li // NORMAL-NOT: _Z25ExternThenInlineThenDefFnv
92*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01?ExternThenInlineThenDefFn@@YAXXZ"
93*67e74705SXin Li extern void ExternThenInlineThenDefFn();
94*67e74705SXin Li inline void ExternThenInlineThenDefFn();
ExternThenInlineThenDefFn()95*67e74705SXin Li void ExternThenInlineThenDefFn() {}
96*67e74705SXin Li 
97*67e74705SXin Li // NORMAL-NOT: _Z25InlineThenExternThenDefFnv
98*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01?InlineThenExternThenDefFn@@YAXXZ"
99*67e74705SXin Li inline void InlineThenExternThenDefFn();
100*67e74705SXin Li extern void InlineThenExternThenDefFn();
InlineThenExternThenDefFn()101*67e74705SXin Li void InlineThenExternThenDefFn() {}
102*67e74705SXin Li 
103*67e74705SXin Li // NORMAL-NOT: _Z17ExternAndConstexprFnv
104*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr i32 @"\01?ExternAndConstexprFn@@YAHXZ"
ExternAndConstexprFn()105*67e74705SXin Li extern constexpr int ExternAndConstexprFn() { return 0; }
106*67e74705SXin Li 
107*67e74705SXin Li // NORMAL-NOT: _Z11ConstexprFnv
108*67e74705SXin Li // MSVCCOMPAT-NOT: @"\01?ConstexprFn@@YAHXZ"
ConstexprFn()109*67e74705SXin Li constexpr int ConstexprFn() { return 0; }
110*67e74705SXin Li 
111*67e74705SXin Li template <typename T>
112*67e74705SXin Li extern inline void ExternInlineOnPrimaryTemplate(T);
113*67e74705SXin Li 
114*67e74705SXin Li // NORMAL-LABEL: define void @_Z29ExternInlineOnPrimaryTemplateIiEvT_
115*67e74705SXin Li // MSVCCOMPAT-LABEL: define void @"\01??$ExternInlineOnPrimaryTemplate@H@@YAXH@Z"
116*67e74705SXin Li template <>
ExternInlineOnPrimaryTemplate(int)117*67e74705SXin Li void ExternInlineOnPrimaryTemplate(int) {}
118*67e74705SXin Li 
119*67e74705SXin Li template <typename T>
120*67e74705SXin Li extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(T);
121*67e74705SXin Li 
122*67e74705SXin Li // NORMAL-NOT: _Z46ExternInlineOnPrimaryTemplateAndSpecializationIiEvT_
123*67e74705SXin Li // MSVCCOMPAT-LABEL: define weak_odr void @"\01??$ExternInlineOnPrimaryTemplateAndSpecialization@H@@YAXH@Z"
124*67e74705SXin Li template <>
ExternInlineOnPrimaryTemplateAndSpecialization(int)125*67e74705SXin Li extern inline void ExternInlineOnPrimaryTemplateAndSpecialization(int) {}
126*67e74705SXin Li 
127*67e74705SXin Li struct TypeWithInlineMethods {
128*67e74705SXin Li   // NORMAL-NOT: _ZN21TypeWithInlineMethods9StaticFunEv
129*67e74705SXin Li   // MSVCCOMPAT-NOT: @"\01?StaticFun@TypeWithInlineMethods@@SAXXZ"
StaticFunTypeWithInlineMethods130*67e74705SXin Li   static void StaticFun() {}
131*67e74705SXin Li   // NORMAL-NOT: _ZN21TypeWithInlineMethods12NonStaticFunEv
132*67e74705SXin Li   // MSVCCOMPAT-NOT: @"\01?NonStaticFun@TypeWithInlineMethods@@QEAAXXZ"
NonStaticFunTypeWithInlineMethods133*67e74705SXin Li   void NonStaticFun() { StaticFun(); }
134*67e74705SXin Li };
135*67e74705SXin Li 
136*67e74705SXin Li namespace PR22959 {
137*67e74705SXin Li template <typename>
138*67e74705SXin Li struct S;
139*67e74705SXin Li 
140*67e74705SXin Li S<int> Foo();
141*67e74705SXin Li 
142*67e74705SXin Li template <typename>
143*67e74705SXin Li struct S {
144*67e74705SXin Li   friend S<int> Foo();
145*67e74705SXin Li };
146*67e74705SXin Li 
Foo()147*67e74705SXin Li __attribute__((used)) inline S<int> Foo() { return S<int>(); }
148*67e74705SXin Li // NORMAL-LABEL: define linkonce_odr void @_ZN7PR229593FooEv(
149*67e74705SXin Li // MSVCCOMPAT-LABEL: define linkonce_odr i8 @"\01?Foo@PR22959@@YA?AU?$S@H@1@XZ"(
150*67e74705SXin Li }
151