1 // RUN: %clang_cc1 -triple i386-unknown-unknown -std=c++11 -fvisibility-inlines-hidden -emit-llvm -o - %s -O2 -disable-llvm-passes | FileCheck %s
3 // The trickery with optimization in the run line is to get IR
4 // generation to emit available_externally function bodies, but not
5 // actually inline them (and thus remove the emitted bodies).
8 void __attribute__((visibility("default"))) f1() { }
15 inline void X0::f3() { }
19 void __attribute__((visibility("default"))) f1() { }
28 inline void X1
<T
>::f3() { }
31 inline void X1
<int>::f4() { }
33 struct __attribute__((visibility("default"))) X2
{
37 extern template struct X1
<float>;
39 void use(X0
*x0
, X1
<int> *x1
, X2
*x2
, X1
<float> *x3
) {
40 // CHECK-LABEL: define linkonce_odr void @_ZN2X02f1Ev
42 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X02f2Ev
44 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X02f3Ev
46 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X02f5Ev
48 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X02f6Ev
50 // CHECK-LABEL: define linkonce_odr void @_ZN2X1IiE2f1Ev
52 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X1IiE2f2Ev
54 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X1IiE2f3Ev
56 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X1IiE2f4Ev
58 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X1IiE2f5Ev
60 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X1IiE2f6Ev
62 // CHECK-LABEL: define linkonce_odr hidden void @_ZN2X22f2Ev
64 // CHECK-LABEL: define available_externally void @_ZN2X1IfE2f2Ev
68 // rdar://problem/8614470
70 struct __attribute__((visibility("default"))) A
{
79 // CHECK: declare void @_ZN5test11A3fooEv
80 // CHECK: declare {{.*}} @_ZN5test11AD1Ev
86 template <class T
> class B
{};
89 namespace ns
__attribute__((visibility("default"))) {
90 template <class T
> inline void foo() {}
91 extern template void foo
<arg
>();
98 // CHECK-LABEL: define available_externally void @_ZN5test22ns3fooINS_1BINS_1AEEEEEvv()
102 template <typename T
>
105 T
foo(T x
) { return x
; }
107 extern template class Foo
<int>;
108 template class Foo
<int>;
109 // CHECK-LABEL: define weak_odr noundef i32 @_ZN7PR116423FooIiE3fooEi
112 // Test that clang implements the new gcc behaviour for inline functions.
115 inline void foo(void) {
120 template void zed
<float>();
125 // CHECK-LABEL: define weak_odr void @_ZN5test33zedIfEEvv
126 // CHECK-LABEL: define linkonce_odr hidden void @_ZN5test33fooEv
127 // CHECK-LABEL: define linkonce_odr hidden void @_ZN5test33zedIiEEvv
131 extern inline __attribute__ ((__gnu_inline__
))
136 // CHECK-LABEL: define available_externally void @_ZN5test43fooE
141 template <int> inline void Op();
142 class UnaryInstruction
{
147 template <int Idx_nocapture
> void Op() {
153 template <typename T
>
167 template <typename T
> void tf() {}
169 // CHECK-LABEL: define linkonce_odr hidden noundef ptr @_ZN7PR348111fEv(
172 // CHECK-LABEL: define linkonce_odr hidden void @_ZN7PR348112tfIZNS_1fEvEUlvE_EEvv(
173 return (void *)&tf
<decltype(l
)>;