blob: 61f4d8ad8dbd92c31aee0eae36955d930f71992b [file] [log] [blame]
Anders Carlsson39de84d2010-02-07 01:44:36 +00001// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
John McCall1fb0caa2010-10-22 21:05:15 +00002// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN
Anders Carlsson39de84d2010-02-07 01:44:36 +00003
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
John McCall1fb0caa2010-10-22 21:05:15 +00009// CHECK: @_ZN5Test71aE = hidden global
10// CHECK: @_ZN5Test71bE = global
John McCallac65c622010-10-26 04:59:26 +000011// CHECK: @test9_var = global
12// CHECK-HIDDEN: @test9_var = global
Douglas Gregorc66bcfd2010-06-14 23:41:45 +000013// CHECK: @_ZTVN5Test63fooE = weak_odr hidden constant
John McCall1fb0caa2010-10-22 21:05:15 +000014
Anders Carlsson39de84d2010-02-07 01:44:36 +000015namespace Test1 {
16 // CHECK: define hidden void @_ZN5Test11fEv
17 void HIDDEN f() { }
18
19}
20
21namespace Test2 {
22 struct HIDDEN A {
23 void f();
24 };
25
26 // A::f is a member function of a hidden class.
27 // CHECK: define hidden void @_ZN5Test21A1fEv
28 void A::f() { }
29}
30
31namespace Test3 {
32 struct HIDDEN A {
33 struct B {
34 void f();
35 };
36 };
37
38 // B is a nested class where its parent class is hidden.
39 // CHECK: define hidden void @_ZN5Test31A1B1fEv
40 void A::B::f() { }
41}
42
43namespace Test4 HIDDEN {
44 int VariableInHiddenNamespace = 10;
45
46 // Test4::g is in a hidden namespace.
47 // CHECK: define hidden void @_ZN5Test41gEv
48 void g() { }
49
50 struct DEFAULT A {
51 void f();
52 };
53
54 // A has default visibility.
55 // CHECK: define void @_ZN5Test41A1fEv
56 void A::f() { }
57}
58
59namespace Test5 {
60
61 namespace NS HIDDEN {
62 // f is in NS which is hidden.
63 // CHECK: define hidden void @_ZN5Test52NS1fEv()
64 void f() { }
65 }
66
67 namespace NS {
68 // g is in NS, but this NS decl is not hidden.
69 // CHECK: define void @_ZN5Test52NS1gEv
70 void g() { }
71 }
72}
Douglas Gregorc66bcfd2010-06-14 23:41:45 +000073
74// <rdar://problem/8091955>
75namespace Test6 {
76 struct HIDDEN foo {
77 foo() { }
78 void bonk();
79 virtual void bar() = 0;
80
81 virtual void zonk() {}
82 };
83
84 struct barc : public foo {
85 barc();
86 virtual void bar();
87 };
88
89 barc::barc() {}
90}
John McCall1fb0caa2010-10-22 21:05:15 +000091
92namespace Test7 {
93 class HIDDEN A {};
94 A a; // top of file
95
96 template <A&> struct Aref {
97 static void foo() {}
98 };
99
100 class B : public A {};
101 B b; // top of file
102
103 // CHECK: define linkonce_odr hidden void @_ZN5Test74ArefILZNS_1aEEE3fooEv()
104 void test() {
105 Aref<a>::foo();
106 }
107}
108
109namespace Test8 {
110 void foo();
111 void bar() {}
112 // CHECK-HIDDEN: define hidden void @_ZN5Test83barEv()
113 // CHECK-HIDDEN: declare void @_ZN5Test83fooEv()
114
115 void test() {
116 foo();
117 bar();
118 }
119}
John McCallac65c622010-10-26 04:59:26 +0000120
121// PR8457
122namespace Test9 {
123 extern "C" {
124 struct A { int field; };
125 void DEFAULT test9_fun(struct A *a) { }
126 struct A DEFAULT test9_var; // above
127 }
128 // CHECK: define void @test9_fun(
129 // CHECK-HIDDEN: define void @test9_fun(
130
131 void test() {
132 A a = test9_var;
133 test9_fun(&a);
134 }
135}
John McCall67fa6d52010-10-28 07:07:52 +0000136
137// PR8478
138namespace Test10 {
139 struct A;
140
141 DEFAULT class B {
142 void foo(A*);
143 };
144
145 // CHECK: define void @_ZN6Test101B3fooEPNS_1AE(
146 // CHECK-HIDDEN: define void @_ZN6Test101B3fooEPNS_1AE(
147 void B::foo(A*) {}
148}