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
4 #define HIDDEN __attribute__((visibility("hidden")))
5 #define PROTECTED __attribute__((visibility("protected")))
6 #define DEFAULT __attribute__((visibility("default")))
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: @_ZN6Test143varE = external global
22 // CHECK-HIDDEN: @_ZN6Test143varE = external global
23 // CHECK: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
24 // CHECK-HIDDEN: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
25 // CHECK: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr global
26 // CHECK: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr global i64
27 // CHECK-HIDDEN: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr hidden global
28 // CHECK-HIDDEN: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr hidden global i64
29 // CHECK-HIDDEN: @_ZTTN6Test161AIcEE = external unnamed_addr constant
30 // CHECK-HIDDEN: @_ZTVN6Test161AIcEE = external unnamed_addr constant
31 // CHECK: @_ZTVN5Test63fooE = linkonce_odr hidden unnamed_addr constant
34 // CHECK: define hidden void @_ZN5Test11fEv
44 // A::f is a member function of a hidden class.
45 // CHECK: define hidden void @_ZN5Test21A1fEv
56 // B is a nested class where its parent class is hidden.
57 // CHECK: define hidden void @_ZN5Test31A1B1fEv
61 namespace Test4 HIDDEN
{
62 int VariableInHiddenNamespace
= 10;
64 // Test4::g is in a hidden namespace.
65 // CHECK: define hidden void @_ZN5Test41gEv
72 // A has default visibility.
73 // CHECK: define void @_ZN5Test41A1fEv
80 // f is in NS which is hidden.
81 // CHECK: define hidden void @_ZN5Test52NS1fEv()
86 // g is in NS, but this NS decl is not hidden.
87 // CHECK: define void @_ZN5Test52NS1gEv
92 // <rdar://problem/8091955>
97 virtual void bar() = 0;
99 virtual void zonk() {}
102 struct barc
: public foo
{
114 template <A
&> struct Aref
{
118 class B
: public A
{};
121 // CHECK: define linkonce_odr hidden void @_ZN5Test74ArefILZNS_1aEEE3fooEv()
130 // CHECK-HIDDEN: define hidden void @_ZN5Test83barEv()
131 // CHECK-HIDDEN: declare void @_ZN5Test83fooEv()
142 struct A
{ int field
; };
143 void DEFAULT
test9_fun(struct A
*a
) { }
144 struct A DEFAULT test9_var
; // above
146 // CHECK: define void @test9_fun(
147 // CHECK-HIDDEN: define void @test9_fun(
163 // CHECK: define void @_ZN6Test101B3fooEPNS_1AE(
164 // CHECK-HIDDEN: define void @_ZN6Test101B3fooEPNS_1AE(
172 void DEFAULT
bar() {}
181 // CHECK: define linkonce_odr void @_ZN6Test111A3fooEv(
182 // CHECK: define linkonce_odr void @_ZN6Test111A3barEv(
183 // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6Test111A3fooEv(
184 // CHECK-HIDDEN: define linkonce_odr void @_ZN6Test111A3barEv(
187 // Tested at top of file.
190 // This is hidden in all cases: the explicit attribute takes
191 // priority over -fvisibility on the parent.
192 static int hidden HIDDEN
;
194 // This is default in all cases because it's only a declaration.
204 // Tested at top of file.
208 // Should be hidden in all cases.
214 // Should be default in all cases.
221 // Tested at top of file.
223 // Neither the visibility of the type nor -fvisibility=hidden should
224 // apply to declarations.
225 extern struct A
*var
;
227 struct A
*test() { return var
; }
230 // rdar://problem/8613093
233 template <class T
> struct Temp
{
235 static char buffer
[0];
240 return Temp
<A
>::Inner::buffer
;
245 struct Base1
{ virtual void foo(); };
246 struct Base2
: virtual Base1
{ virtual void foo(); };
247 template <class T
> struct A
: virtual Base1
, Base2
{
250 extern template struct A
<char>;
261 static void DEFAULT
bar();
262 static void HIDDEN
baz();
266 static void DEFAULT
bar();
267 static void HIDDEN
baz();
279 // CHECK: declare hidden void @_ZN6Test171A3fooEv()
280 // CHECK: declare void @_ZN6Test171A3barEv()
281 // CHECK: declare hidden void @_ZN6Test171A3bazEv()
282 // CHECK: declare void @_ZN6Test171A1B3fooEv()
283 // CHECK: declare void @_ZN6Test171A1B3barEv()
284 // CHECK: declare hidden void @_ZN6Test171A1B3bazEv()
285 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3fooEv()
286 // CHECK-HIDDEN: declare void @_ZN6Test171A3barEv()
287 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3bazEv()
288 // CHECK-HIDDEN: declare void @_ZN6Test171A1B3fooEv()
289 // CHECK-HIDDEN: declare void @_ZN6Test171A1B3barEv()
290 // CHECK-HIDDEN: declare hidden void @_ZN6Test171A1B3bazEv()
294 template <class T
> struct HIDDEN A
{
296 static void DEFAULT
bar();
297 static void HIDDEN
baz();
301 static void DEFAULT
bar();
302 static void HIDDEN
baz();
321 // CHECK: declare hidden void @_ZN6Test181AIiE3fooEv()
322 // CHECK: declare void @_ZN6Test181AIiE3barEv()
323 // CHECK: declare hidden void @_ZN6Test181AIiE3bazEv()
324 // CHECK: declare void @_ZN6Test181AIiE1B3fooEv()
325 // CHECK: declare void @_ZN6Test181AIiE1B3barEv()
326 // CHECK: declare hidden void @_ZN6Test181AIiE1B3bazEv()
327 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
328 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
329 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
330 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
331 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
332 // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
333 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3fooEv()
334 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE3barEv()
335 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3bazEv()
336 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3fooEv()
337 // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3barEv()
338 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE1B3bazEv()
339 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
340 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
341 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
342 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
343 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
344 // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
348 struct A
{ A(); ~A(); };
350 // Tested at top of file.
351 template <class T
> void foo() {
360 // Various things with class template specializations.
362 template <unsigned> struct HIDDEN A
{};
364 // An explicit specialization inherits the explicit visibility of
366 template <> struct A
<0> {
371 // CHECK: define hidden void @_ZN6Test201AILj0EE5test0Ev()
372 void A
<0>::test0() {}
374 // CHECK: declare hidden void @_ZN6Test201AILj0EE5test1Ev()
379 // ...unless that's explicitly overridden.
380 template <> struct DEFAULT A
<1> {
385 // CHECK: define void @_ZN6Test201AILj1EE5test2Ev()
386 void A
<1>::test2() {}
388 // CHECK: declare void @_ZN6Test201AILj1EE5test3Ev()
393 // <rdar://problem/8778497>
394 // But we should assume that an unknown specialization has the
395 // explicit visibility settings of the template.
396 template <class T
> struct B
{
397 static void test4() {}
401 // CHECK: define linkonce_odr hidden void @_ZN6Test201BINS_1AILj2EEEE5test4Ev()
406 // CHECK: declare void @_ZN6Test201BINS_1AILj2EEEE5test5Ev()
407 // (but explicit visibility on a template argument doesn't count as
408 // explicit visibility for the template for purposes of deciding
409 // whether an external symbol gets visibility)