blob: 2dc8bcc74fac42884853f047fe14f32eb51cf80f [file] [log] [blame]
Eli Friedmand986fc82010-08-05 07:00:53 +00001// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
2
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)
20struct x3 {
21 static int y;
22} __attribute((visibility("default")));
23int x3::y = 10;
24// CHECK: @_ZN2x31yE = global
25#pragma GCC visibility pop
26
27#pragma GCC visibility push(hidden)
28template<class T> struct x4 {
29 static int y;
30};
31#pragma GCC visibility pop
32template<> int x4<int>::y = 10;
33// CHECK: @_ZN2x4IiE1yE = hidden global i32
34
35#pragma GCC visibility push(hidden)
36template<int x> int f() { return x; }
37extern "C" int g() { return f<3>(); }
38#pragma GCC visibility pop
39// CHECK: define hidden i32 @g()
40// CHECK: define linkonce_odr hidden i32 @_Z1fILi3EEiv()
41
42#pragma GCC visibility push(hidden)
43template<class T> struct x5 {
44 void y();
45};
46#pragma GCC visibility pop
47template<> void x5<int>::y() {}
48// CHECK: define hidden void @_ZN2x5IiE1yEv
49
50#pragma GCC visibility push(hidden)
51namespace n __attribute((visibility("default"))) {
52 void f() {}
53 // CHECK: define void @_ZN1n1fEv
54}
55#pragma GCC visibility pop
56
57namespace n __attribute((visibility("default"))) {
58 extern int foofoo; // FIXME: Shouldn't be necessary, but otherwise the pragma
59 // gets to Sema before the namespace!
60#pragma GCC visibility push(hidden)
61 void g() {}
62 // CHECK: define hidden void @_ZN1n1gEv
63#pragma GCC visibility pop
64}
65
John McCall2faf32c2010-12-10 02:59:44 +000066// We used to test this, but it's insane, so unless it happens in
67// headers, we should not support it.
Eli Friedmand986fc82010-08-05 07:00:53 +000068namespace n __attribute((visibility("hidden"))) {
69 extern int foofoo; // FIXME: Shouldn't be necessary, but otherwise the pragma
70 // gets to Sema before the namespace!
71 #pragma GCC visibility pop
72 void h() {}
John McCall2faf32c2010-12-10 02:59:44 +000073 // CHECK disabled: define void @_ZN1n1hEv
Eli Friedmand986fc82010-08-05 07:00:53 +000074}