1 // RUN: %clang_cc1 -fvisibility-inlines-hidden -emit-llvm -o - %s -O2 -disable-llvm-optzns | FileCheck %s 2 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). 6 7 struct X0 { 8 void __attribute__((visibility("default"))) f1() { } 9 void f2() { } 10 void f3(); 11 static void f5() { } 12 virtual void f6() { } 13 }; 14 15 inline void X0::f3() { } 16 17 template<typename T> 18 struct X1 { 19 void __attribute__((visibility("default"))) f1() { } 20 void f2() { } 21 void f3(); 22 void f4(); 23 static void f5() { } 24 virtual void f6() { } 25 }; 26 27 template<typename T> 28 inline void X1<T>::f3() { } 29 30 template<> 31 inline void X1<int>::f4() { } 32 33 struct __attribute__((visibility("default"))) X2 { 34 void f2() { } 35 }; 36 37 extern template struct X1<float>; 38 39 void use(X0 *x0, X1<int> *x1, X2 *x2, X1<float> *x3) { 40 // CHECK: define linkonce_odr void @_ZN2X02f1Ev 41 x0->f1(); 42 // CHECK: define linkonce_odr hidden void @_ZN2X02f2Ev 43 x0->f2(); 44 // CHECK: define linkonce_odr hidden void @_ZN2X02f3Ev 45 x0->f3(); 46 // CHECK: define linkonce_odr hidden void @_ZN2X02f5Ev 47 X0::f5(); 48 // CHECK: define linkonce_odr hidden void @_ZN2X02f6Ev 49 x0->X0::f6(); 50 // CHECK: define linkonce_odr void @_ZN2X1IiE2f1Ev 51 x1->f1(); 52 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f2Ev 53 x1->f2(); 54 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f3Ev 55 x1->f3(); 56 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f4Ev 57 x1->f4(); 58 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f5Ev 59 X1<int>::f5(); 60 // CHECK: define linkonce_odr hidden void @_ZN2X1IiE2f6Ev 61 x1->X1::f6(); 62 // CHECK: define linkonce_odr hidden void @_ZN2X22f2Ev 63 x2->f2(); 64 // CHECK: define available_externally void @_ZN2X1IfE2f2Ev 65 x3->f2(); 66 } 67 68 // rdar://problem/8614470 69 namespace test1 { 70 struct __attribute__((visibility("default"))) A { 71 inline void foo(); 72 ~A(); 73 }; 74 75 void test() { 76 A a; 77 a.foo(); 78 } 79 // CHECK: declare void @_ZN5test11A3fooEv 80 // CHECK: declare {{.*}} @_ZN5test11AD1Ev 81 } 82 83 // PR8713 84 namespace test2 { 85 struct A {}; 86 template <class T> class B {}; 87 typedef B<A> arg; 88 89 namespace ns __attribute__((visibility("default"))) { 90 template <class T> inline void foo() {} 91 extern template void foo<arg>(); 92 } 93 94 void test() { 95 ns::foo<arg>(); 96 } 97 98 // CHECK: define available_externally void @_ZN5test22ns3fooINS_1BINS_1AEEEEEvv() 99 } 100