visibility.cpp revision 87a4ed905e2febe64021dcdfcdc7f00b27e92f32
1// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s 2// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN 3 4#define HIDDEN __attribute__((visibility("hidden"))) 5#define PROTECTED __attribute__((visibility("protected"))) 6#define DEFAULT __attribute__((visibility("default"))) 7 8// CHECK: @_ZN5Test425VariableInHiddenNamespaceE = hidden global i32 10 9// CHECK: @_ZN5Test71aE = hidden global 10// CHECK: @_ZN5Test71bE = global 11// CHECK: @test9_var = global 12// CHECK-HIDDEN: @test9_var = global 13// CHECK: @_ZN6Test121A6hiddenE = external hidden global 14// CHECK: @_ZN6Test121A7visibleE = external global 15// CHECK-HIDDEN: @_ZN6Test121A6hiddenE = external hidden global 16// CHECK-HIDDEN: @_ZN6Test121A7visibleE = external global 17// CHECK: @_ZN6Test131B1aE = hidden global 18// CHECK: @_ZN6Test131C1aE = global 19// CHECK-HIDDEN: @_ZN6Test131B1aE = hidden global 20// CHECK-HIDDEN: @_ZN6Test131C1aE = global 21// CHECK: @_ZTVN5Test63fooE = weak_odr hidden constant 22 23namespace Test1 { 24 // CHECK: define hidden void @_ZN5Test11fEv 25 void HIDDEN f() { } 26 27} 28 29namespace Test2 { 30 struct HIDDEN A { 31 void f(); 32 }; 33 34 // A::f is a member function of a hidden class. 35 // CHECK: define hidden void @_ZN5Test21A1fEv 36 void A::f() { } 37} 38 39namespace Test3 { 40 struct HIDDEN A { 41 struct B { 42 void f(); 43 }; 44 }; 45 46 // B is a nested class where its parent class is hidden. 47 // CHECK: define hidden void @_ZN5Test31A1B1fEv 48 void A::B::f() { } 49} 50 51namespace Test4 HIDDEN { 52 int VariableInHiddenNamespace = 10; 53 54 // Test4::g is in a hidden namespace. 55 // CHECK: define hidden void @_ZN5Test41gEv 56 void g() { } 57 58 struct DEFAULT A { 59 void f(); 60 }; 61 62 // A has default visibility. 63 // CHECK: define void @_ZN5Test41A1fEv 64 void A::f() { } 65} 66 67namespace Test5 { 68 69 namespace NS HIDDEN { 70 // f is in NS which is hidden. 71 // CHECK: define hidden void @_ZN5Test52NS1fEv() 72 void f() { } 73 } 74 75 namespace NS { 76 // g is in NS, but this NS decl is not hidden. 77 // CHECK: define void @_ZN5Test52NS1gEv 78 void g() { } 79 } 80} 81 82// <rdar://problem/8091955> 83namespace Test6 { 84 struct HIDDEN foo { 85 foo() { } 86 void bonk(); 87 virtual void bar() = 0; 88 89 virtual void zonk() {} 90 }; 91 92 struct barc : public foo { 93 barc(); 94 virtual void bar(); 95 }; 96 97 barc::barc() {} 98} 99 100namespace Test7 { 101 class HIDDEN A {}; 102 A a; // top of file 103 104 template <A&> struct Aref { 105 static void foo() {} 106 }; 107 108 class B : public A {}; 109 B b; // top of file 110 111 // CHECK: define linkonce_odr hidden void @_ZN5Test74ArefILZNS_1aEEE3fooEv() 112 void test() { 113 Aref<a>::foo(); 114 } 115} 116 117namespace Test8 { 118 void foo(); 119 void bar() {} 120 // CHECK-HIDDEN: define hidden void @_ZN5Test83barEv() 121 // CHECK-HIDDEN: declare void @_ZN5Test83fooEv() 122 123 void test() { 124 foo(); 125 bar(); 126 } 127} 128 129// PR8457 130namespace Test9 { 131 extern "C" { 132 struct A { int field; }; 133 void DEFAULT test9_fun(struct A *a) { } 134 struct A DEFAULT test9_var; // above 135 } 136 // CHECK: define void @test9_fun( 137 // CHECK-HIDDEN: define void @test9_fun( 138 139 void test() { 140 A a = test9_var; 141 test9_fun(&a); 142 } 143} 144 145// PR8478 146namespace Test10 { 147 struct A; 148 149 DEFAULT class B { 150 void foo(A*); 151 }; 152 153 // CHECK: define void @_ZN6Test101B3fooEPNS_1AE( 154 // CHECK-HIDDEN: define void @_ZN6Test101B3fooEPNS_1AE( 155 void B::foo(A*) {} 156} 157 158// PR8492 159namespace Test11 { 160 struct A { 161 void foo() {} 162 void DEFAULT bar() {} 163 }; 164 165 void test() { 166 A a; 167 a.foo(); 168 a.bar(); 169 } 170 171 // CHECK: define linkonce_odr void @_ZN6Test111A3fooEv( 172 // CHECK: define linkonce_odr void @_ZN6Test111A3barEv( 173 // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6Test111A3fooEv( 174 // CHECK-HIDDEN: define linkonce_odr void @_ZN6Test111A3barEv( 175} 176 177// Tested at top of file. 178namespace Test12 { 179 struct A { 180 // This is hidden in all cases: the explicit attribute takes 181 // priority over -fvisibility on the parent. 182 static int hidden HIDDEN; 183 184 // This is default in all cases because it's only a declaration. 185 static int visible; 186 }; 187 188 void test() { 189 A::hidden = 0; 190 A::visible = 0; 191 } 192} 193 194// Tested at top of file. 195namespace Test13 { 196 struct HIDDEN A {}; 197 198 // Should be hidden in all cases. 199 struct B { 200 static A a; 201 }; 202 A B::a; 203 204 // Should be default in all cases. 205 struct DEFAULT C { 206 static A a; 207 }; 208 A C::a; 209}; 210