blob: c0ba9046c8c4d8fee2c889b8a13ec9f9d236e780 [file] [log] [blame]
Ulrich Weigand35668cc2012-10-24 12:22:56 +00001// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck %s
Eli Friedmand986fc82010-08-05 07:00:53 +00002
3#pragma GCC visibility push(hidden)
4struct x {
5 static int y;
6};
7#pragma GCC visibility pop
8int x::y = 10;
9// CHECK: @_ZN1x1yE = hidden global
10
11#pragma GCC visibility push(hidden)
12struct __attribute((visibility("default"))) x2 {
13 static int y;
14};
15int x2::y = 10;
16// CHECK: @_ZN2x21yE = global
17#pragma GCC visibility pop
18
19#pragma GCC visibility push(hidden)
Eli Friedmand986fc82010-08-05 07:00:53 +000020template<class T> struct x4 {
21 static int y;
22};
23#pragma GCC visibility pop
24template<> int x4<int>::y = 10;
25// CHECK: @_ZN2x4IiE1yE = hidden global i32
26
27#pragma GCC visibility push(hidden)
28template<int x> int f() { return x; }
29extern "C" int g() { return f<3>(); }
30#pragma GCC visibility pop
Stephen Lin43622612013-08-15 06:47:53 +000031// CHECK-LABEL: define hidden i32 @g()
32// CHECK-LABEL: define linkonce_odr hidden i32 @_Z1fILi3EEiv()
Eli Friedmand986fc82010-08-05 07:00:53 +000033
34#pragma GCC visibility push(hidden)
35template<class T> struct x5 {
36 void y();
37};
38#pragma GCC visibility pop
39template<> void x5<int>::y() {}
Stephen Lin43622612013-08-15 06:47:53 +000040// CHECK-LABEL: define hidden void @_ZN2x5IiE1yEv
Eli Friedmand986fc82010-08-05 07:00:53 +000041
42#pragma GCC visibility push(hidden)
43namespace n __attribute((visibility("default"))) {
44 void f() {}
Stephen Lin43622612013-08-15 06:47:53 +000045 // CHECK-LABEL: define void @_ZN1n1fEv
Eli Friedmand986fc82010-08-05 07:00:53 +000046}
47#pragma GCC visibility pop
48
49namespace n __attribute((visibility("default"))) {
Eli Friedmand986fc82010-08-05 07:00:53 +000050#pragma GCC visibility push(hidden)
51 void g() {}
Stephen Lin43622612013-08-15 06:47:53 +000052 // CHECK-LABEL: define hidden void @_ZN1n1gEv
Eli Friedmand986fc82010-08-05 07:00:53 +000053#pragma GCC visibility pop
54}
Rafael Espindolae3a14bb2012-07-17 15:14:47 +000055
56namespace test2 {
57#pragma GCC visibility push(default)
58#pragma GCC visibility push(hidden)
59 struct foo { // foo is hidden
60 };
61#pragma GCC visibility pop
62 struct foo; // declaration is ok, we ignore the default in the stack
63 template<typename T>
64 struct bar { // bar is default
65 static void f(){}
66 };
67#pragma GCC visibility pop
68 void zed() {
69 bar<foo>::f();
70 bar<int>::f();
71 }
Stephen Lin43622612013-08-15 06:47:53 +000072 // CHECK-LABEL: define linkonce_odr hidden void @_ZN5test23barINS_3fooEE1fEv
73 // CHECK-LABEL: define linkonce_odr void @_ZN5test23barIiE1fEv
Rafael Espindolae3a14bb2012-07-17 15:14:47 +000074}