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