1*67e74705SXin Li // RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility hidden -ftype-visibility default -emit-llvm -o %t 2*67e74705SXin Li // RUN: FileCheck %s < %t 3*67e74705SXin Li // RUN: FileCheck -check-prefix=CHECK-GLOBAL %s < %t 4*67e74705SXin Li 5*67e74705SXin Li // The two visibility options above are how we translate 6*67e74705SXin Li // -fvisibility-ms-compat in the driver. 7*67e74705SXin Li 8*67e74705SXin Li // rdar://13079314 9*67e74705SXin Li 10*67e74705SXin Li #define HIDDEN __attribute__((visibility("hidden"))) 11*67e74705SXin Li #define PROTECTED __attribute__((visibility("protected"))) 12*67e74705SXin Li #define DEFAULT __attribute__((visibility("default"))) 13*67e74705SXin Li 14*67e74705SXin Li namespace std { 15*67e74705SXin Li class type_info; 16*67e74705SXin Li }; 17*67e74705SXin Li 18*67e74705SXin Li namespace test0 { 19*67e74705SXin Li struct A { 20*67e74705SXin Li static void foo(); 21*67e74705SXin Li static void bar(); 22*67e74705SXin Li }; 23*67e74705SXin Li foo()24*67e74705SXin Li void A::foo() { bar(); } 25*67e74705SXin Li // CHECK-LABEL: define hidden void @_ZN5test01A3fooEv() 26*67e74705SXin Li // CHECK: declare void @_ZN5test01A3barEv() 27*67e74705SXin Li 28*67e74705SXin Li const std::type_info &ti = typeid(A); 29*67e74705SXin Li // CHECK-GLOBAL: @_ZTSN5test01AE = linkonce_odr constant 30*67e74705SXin Li // CHECK-GLOBAL: @_ZTIN5test01AE = linkonce_odr constant 31*67e74705SXin Li // CHECK-GLOBAL: @_ZN5test02tiE = hidden constant 32*67e74705SXin Li } 33*67e74705SXin Li 34*67e74705SXin Li namespace test1 { 35*67e74705SXin Li struct HIDDEN A { 36*67e74705SXin Li static void foo(); 37*67e74705SXin Li static void bar(); 38*67e74705SXin Li }; 39*67e74705SXin Li foo()40*67e74705SXin Li void A::foo() { bar(); } 41*67e74705SXin Li // CHECK-LABEL: define hidden void @_ZN5test11A3fooEv() 42*67e74705SXin Li // CHECK: declare hidden void @_ZN5test11A3barEv() 43*67e74705SXin Li 44*67e74705SXin Li const std::type_info &ti = typeid(A); 45*67e74705SXin Li // CHECK-GLOBAL: @_ZTSN5test11AE = linkonce_odr hidden constant 46*67e74705SXin Li // CHECK-GLOBAL: @_ZTIN5test11AE = linkonce_odr hidden constant 47*67e74705SXin Li // CHECK-GLOBAL: @_ZN5test12tiE = hidden constant 48*67e74705SXin Li } 49*67e74705SXin Li 50*67e74705SXin Li namespace test2 { 51*67e74705SXin Li struct DEFAULT A { 52*67e74705SXin Li static void foo(); 53*67e74705SXin Li static void bar(); 54*67e74705SXin Li }; 55*67e74705SXin Li foo()56*67e74705SXin Li void A::foo() { bar(); } 57*67e74705SXin Li // CHECK-LABEL: define void @_ZN5test21A3fooEv() 58*67e74705SXin Li // CHECK: declare void @_ZN5test21A3barEv() 59*67e74705SXin Li 60*67e74705SXin Li const std::type_info &ti = typeid(A); 61*67e74705SXin Li // CHECK-GLOBAL: @_ZTSN5test21AE = linkonce_odr constant 62*67e74705SXin Li // CHECK-GLOBAL: @_ZTIN5test21AE = linkonce_odr constant 63*67e74705SXin Li // CHECK-GLOBAL: @_ZN5test22tiE = hidden constant 64*67e74705SXin Li } 65*67e74705SXin Li 66*67e74705SXin Li namespace test3 { 67*67e74705SXin Li struct A { int x; }; 68*67e74705SXin Li template <class T> struct B { footest3::B69*67e74705SXin Li static void foo() { bar(); } 70*67e74705SXin Li static void bar(); 71*67e74705SXin Li }; 72*67e74705SXin Li 73*67e74705SXin Li template void B<A>::foo(); 74*67e74705SXin Li // CHECK-LABEL: define weak_odr hidden void @_ZN5test31BINS_1AEE3fooEv() 75*67e74705SXin Li // CHECK: declare void @_ZN5test31BINS_1AEE3barEv() 76*67e74705SXin Li 77*67e74705SXin Li const std::type_info &ti = typeid(B<A>); 78*67e74705SXin Li // CHECK-GLOBAL: @_ZTSN5test31BINS_1AEEE = linkonce_odr constant 79*67e74705SXin Li // CHECK-GLOBAL: @_ZTIN5test31BINS_1AEEE = linkonce_odr constant 80*67e74705SXin Li } 81*67e74705SXin Li 82*67e74705SXin Li namespace test4 { 83*67e74705SXin Li struct A { int x; }; 84*67e74705SXin Li template <class T> struct DEFAULT B { footest4::B85*67e74705SXin Li static void foo() { bar(); } 86*67e74705SXin Li static void bar(); 87*67e74705SXin Li }; 88*67e74705SXin Li 89*67e74705SXin Li template void B<A>::foo(); 90*67e74705SXin Li // CHECK-LABEL: define weak_odr void @_ZN5test41BINS_1AEE3fooEv() 91*67e74705SXin Li // CHECK: declare void @_ZN5test41BINS_1AEE3barEv() 92*67e74705SXin Li 93*67e74705SXin Li const std::type_info &ti = typeid(B<A>); 94*67e74705SXin Li // CHECK-GLOBAL: @_ZTSN5test41BINS_1AEEE = linkonce_odr constant 95*67e74705SXin Li // CHECK-GLOBAL: @_ZTIN5test41BINS_1AEEE = linkonce_odr constant 96*67e74705SXin Li } 97*67e74705SXin Li 98*67e74705SXin Li namespace test5 { 99*67e74705SXin Li struct A { int x; }; 100*67e74705SXin Li template <class T> struct HIDDEN B { footest5::B101*67e74705SXin Li static void foo() { bar(); } 102*67e74705SXin Li static void bar(); 103*67e74705SXin Li }; 104*67e74705SXin Li 105*67e74705SXin Li template void B<A>::foo(); 106*67e74705SXin Li // CHECK-LABEL: define weak_odr hidden void @_ZN5test51BINS_1AEE3fooEv() 107*67e74705SXin Li // CHECK: declare hidden void @_ZN5test51BINS_1AEE3barEv() 108*67e74705SXin Li 109*67e74705SXin Li const std::type_info &ti = typeid(B<A>); 110*67e74705SXin Li // CHECK-GLOBAL: @_ZTSN5test51BINS_1AEEE = linkonce_odr hidden constant 111*67e74705SXin Li // CHECK-GLOBAL: @_ZTIN5test51BINS_1AEEE = linkonce_odr hidden constant 112*67e74705SXin Li } 113