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 void @_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()