1 // RUN: %clang_cc1 -fvisibility-inlines-hidden -emit-llvm -o - %s -O2 -disable-llvm-optzns | 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: define linkonce_odr void @_ZN2X02f1Ev
42 // CHECK: define linkonce_odr hidden void @_ZN2X02f2Ev
44 // CHECK: define linkonce_odr hidden void @_ZN2X02f3Ev
46 // CHECK: define linkonce_odr hidden void @_ZN2X02f5Ev
48 // CHECK: define linkonce_odr hidden void @_ZN2X02f6Ev
50 // CHECK: define linkonce_odr void @_ZN2X1IiE2f1Ev
52 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f2Ev
54 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f3Ev
56 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f4Ev
58 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f5Ev
60 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f6Ev
62 // CHECK: define linkonce_odr hidden void @_ZN2X22f2Ev
64 // CHECK: 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: 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: define weak_odr 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: define weak_odr void @_ZN5test33zedIfEEvv
126 // CHECK: define linkonce_odr hidden void @_ZN5test33fooEv
127 // CHECK: define linkonce_odr hidden void @_ZN5test33zedIiEEvv