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