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