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