visibility.cpp revision 1fb0caaa7bef765b85972274e3b434af2572c141
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: @_ZTVN5Test63fooE = weak_odr hidden constant 12 13namespace Test1 { 14 // CHECK: define hidden void @_ZN5Test11fEv 15 void HIDDEN f() { } 16 17} 18 19namespace Test2 { 20 struct HIDDEN A { 21 void f(); 22 }; 23 24 // A::f is a member function of a hidden class. 25 // CHECK: define hidden void @_ZN5Test21A1fEv 26 void A::f() { } 27} 28 29namespace Test3 { 30 struct HIDDEN A { 31 struct B { 32 void f(); 33 }; 34 }; 35 36 // B is a nested class where its parent class is hidden. 37 // CHECK: define hidden void @_ZN5Test31A1B1fEv 38 void A::B::f() { } 39} 40 41namespace Test4 HIDDEN { 42 int VariableInHiddenNamespace = 10; 43 44 // Test4::g is in a hidden namespace. 45 // CHECK: define hidden void @_ZN5Test41gEv 46 void g() { } 47 48 struct DEFAULT A { 49 void f(); 50 }; 51 52 // A has default visibility. 53 // CHECK: define void @_ZN5Test41A1fEv 54 void A::f() { } 55} 56 57namespace Test5 { 58 59 namespace NS HIDDEN { 60 // f is in NS which is hidden. 61 // CHECK: define hidden void @_ZN5Test52NS1fEv() 62 void f() { } 63 } 64 65 namespace NS { 66 // g is in NS, but this NS decl is not hidden. 67 // CHECK: define void @_ZN5Test52NS1gEv 68 void g() { } 69 } 70} 71 72// <rdar://problem/8091955> 73namespace Test6 { 74 struct HIDDEN foo { 75 foo() { } 76 void bonk(); 77 virtual void bar() = 0; 78 79 virtual void zonk() {} 80 }; 81 82 struct barc : public foo { 83 barc(); 84 virtual void bar(); 85 }; 86 87 barc::barc() {} 88} 89 90namespace Test7 { 91 class HIDDEN A {}; 92 A a; // top of file 93 94 template <A&> struct Aref { 95 static void foo() {} 96 }; 97 98 class B : public A {}; 99 B b; // top of file 100 101 // CHECK: define linkonce_odr hidden void @_ZN5Test74ArefILZNS_1aEEE3fooEv() 102 void test() { 103 Aref<a>::foo(); 104 } 105} 106 107namespace Test8 { 108 void foo(); 109 void bar() {} 110 // CHECK-HIDDEN: define hidden void @_ZN5Test83barEv() 111 // CHECK-HIDDEN: declare void @_ZN5Test83fooEv() 112 113 void test() { 114 foo(); 115 bar(); 116 } 117} 118