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 7struct X0 { 8 void __attribute__((visibility("default"))) f1() { } 9 void f2() { } 10 void f3(); 11 static void f5() { } 12 virtual void f6() { } 13}; 14 15inline void X0::f3() { } 16 17template<typename T> 18struct 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 27template<typename T> 28inline void X1<T>::f3() { } 29 30template<> 31inline void X1<int>::f4() { } 32 33struct __attribute__((visibility("default"))) X2 { 34 void f2() { } 35}; 36 37extern template struct X1<float>; 38 39void 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 69namespace 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 84namespace 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