|  | // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck %s | 
|  |  | 
|  | #pragma GCC visibility push(hidden) | 
|  | struct x { | 
|  | static int y; | 
|  | }; | 
|  | #pragma GCC visibility pop | 
|  | int x::y = 10; | 
|  | // CHECK: @_ZN1x1yE = hidden global | 
|  |  | 
|  | #pragma GCC visibility push(hidden) | 
|  | struct __attribute((visibility("default"))) x2 { | 
|  | static int y; | 
|  | }; | 
|  | int x2::y = 10; | 
|  | // CHECK: @_ZN2x21yE = global | 
|  | #pragma GCC visibility pop | 
|  |  | 
|  | #pragma GCC visibility push(hidden) | 
|  | template<class T> struct x4 { | 
|  | static int y; | 
|  | }; | 
|  | #pragma GCC visibility pop | 
|  | template<> int x4<int>::y = 10; | 
|  | // CHECK: @_ZN2x4IiE1yE = hidden global i32 | 
|  |  | 
|  | #pragma GCC visibility push(hidden) | 
|  | template<int x> int f() { return x; } | 
|  | extern "C" int g() { return f<3>(); } | 
|  | #pragma GCC visibility pop | 
|  | // CHECK-LABEL: define hidden i32 @g() | 
|  | // CHECK-LABEL: define linkonce_odr hidden i32 @_Z1fILi3EEiv() | 
|  |  | 
|  | #pragma GCC visibility push(hidden) | 
|  | template<class T> struct x5 { | 
|  | void y(); | 
|  | }; | 
|  | #pragma GCC visibility pop | 
|  | template<> void x5<int>::y() {} | 
|  | // CHECK-LABEL: define hidden void @_ZN2x5IiE1yEv | 
|  |  | 
|  | #pragma GCC visibility push(hidden) | 
|  | namespace n __attribute((visibility("default"))) { | 
|  | void f() {} | 
|  | // CHECK-LABEL: define void @_ZN1n1fEv | 
|  | } | 
|  | #pragma GCC visibility pop | 
|  |  | 
|  | namespace n __attribute((visibility("default")))  { | 
|  | #pragma GCC visibility push(hidden) | 
|  | void g() {} | 
|  | // CHECK-LABEL: define hidden void @_ZN1n1gEv | 
|  | #pragma GCC visibility pop | 
|  | } | 
|  |  | 
|  | namespace test2 { | 
|  | #pragma GCC visibility push(default) | 
|  | #pragma GCC visibility push(hidden) | 
|  | struct foo { // foo is hidden | 
|  | }; | 
|  | #pragma GCC visibility pop | 
|  | struct foo; // declaration is ok, we ignore the default in the stack | 
|  | template<typename T> | 
|  | struct bar { // bar is default | 
|  | static void f(){} | 
|  | }; | 
|  | #pragma GCC visibility pop | 
|  | void zed() { | 
|  | bar<foo>::f(); | 
|  | bar<int>::f(); | 
|  | } | 
|  | // CHECK-LABEL: define linkonce_odr hidden void @_ZN5test23barINS_3fooEE1fEv | 
|  | // CHECK-LABEL: define linkonce_odr void @_ZN5test23barIiE1fEv | 
|  | } |