1923099773fe4bbc52a25a5d3d92236b5e37cef93Ulrich Weigand// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm -o - %s | FileCheck %s 262e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman 362e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility push(hidden) 462e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmanstruct x { 562e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman static int y; 662e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman}; 762e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility pop 862e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmanint x::y = 10; 962e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman// CHECK: @_ZN1x1yE = hidden global 1062e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman 1162e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility push(hidden) 1262e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmanstruct __attribute((visibility("default"))) x2 { 1362e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman static int y; 1462e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman}; 1562e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmanint x2::y = 10; 1662e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman// CHECK: @_ZN2x21yE = global 1762e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility pop 1862e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman 1962e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility push(hidden) 2062e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmantemplate<class T> struct x4 { 2162e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman static int y; 2262e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman}; 2362e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility pop 2462e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmantemplate<> int x4<int>::y = 10; 2562e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman// CHECK: @_ZN2x4IiE1yE = hidden global i32 2662e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman 2762e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility push(hidden) 2862e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmantemplate<int x> int f() { return x; } 2962e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmanextern "C" int g() { return f<3>(); } 3062e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility pop 3162e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman// CHECK: define hidden i32 @g() 3262e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman// CHECK: define linkonce_odr hidden i32 @_Z1fILi3EEiv() 3362e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman 3462e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility push(hidden) 3562e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmantemplate<class T> struct x5 { 3662e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman void y(); 3762e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman}; 3862e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility pop 3962e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmantemplate<> void x5<int>::y() {} 4062e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman// CHECK: define hidden void @_ZN2x5IiE1yEv 4162e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman 4262e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility push(hidden) 4362e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmannamespace n __attribute((visibility("default"))) { 4462e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman void f() {} 4562e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman // CHECK: define void @_ZN1n1fEv 4662e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman} 4762e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility pop 4862e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman 4962e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedmannamespace n __attribute((visibility("default"))) { 5062e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility push(hidden) 5162e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman void g() {} 5262e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman // CHECK: define hidden void @_ZN1n1gEv 5362e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman#pragma GCC visibility pop 5462e22ee7a17bbba427367ec2f9c8c4f60d778ac5Eli Friedman} 5571adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola 5671adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindolanamespace test2 { 5771adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola#pragma GCC visibility push(default) 5871adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola#pragma GCC visibility push(hidden) 5971adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola struct foo { // foo is hidden 6071adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola }; 6171adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola#pragma GCC visibility pop 6271adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola struct foo; // declaration is ok, we ignore the default in the stack 6371adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola template<typename T> 6471adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola struct bar { // bar is default 6571adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola static void f(){} 6671adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola }; 6771adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola#pragma GCC visibility pop 6871adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola void zed() { 6971adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola bar<foo>::f(); 7071adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola bar<int>::f(); 7171adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola } 7271adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola // CHECK: define linkonce_odr hidden void @_ZN5test23barINS_3fooEE1fEv 7371adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola // CHECK: define linkonce_odr void @_ZN5test23barIiE1fEv 7471adc5b587e4612e23d5ba234967b77a5f74b773Rafael Espindola} 75