1edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
2edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola// RUN: %clang_cc1 %s -std=c++11 -triple=x86_64-apple-darwin10 -fvisibility hidden -emit-llvm -o - | FileCheck %s -check-prefix=CHECK-HIDDEN
339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson#define HIDDEN __attribute__((visibility("hidden")))
539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson#define PROTECTED __attribute__((visibility("protected")))
639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson#define DEFAULT __attribute__((visibility("default")))
739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
860115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindolanamespace test30 {
960115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  // When H is hidden, it should make X hidden, even if the template argument
1060115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  // is not.
1160115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  struct H {
1260115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  };
1360115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  template<H *T>
1460115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  struct X {
1560115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  };
1660115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  H DEFAULT a;
1760115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  X<&a> b;
1860115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  // CHECK: _ZN6test301bE = global
1960115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola  // CHECK-HIDDEN: _ZN6test301bE = hidden global
2060115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola}
2160115a0453ecfbfe215fdb10aceab983e5f802efRafael Espindola
22860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test25 {
23860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  template<typename T>
24860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  struct X {
25860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    template<typename U>
26860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    struct definition {
27860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    };
28860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  };
29860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
30860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  class DEFAULT A { };
31860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
32860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  X<int>::definition<A> a;
33860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  // CHECK: @_ZN6test251aE = global
34860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  // CHECK-HIDDEN: @_ZN6test251aE = hidden global
35860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola}
36860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
372f47c366bcc28f54f22df6b4266b5d14de302cedRafael Espindolanamespace test28 {
382f47c366bcc28f54f22df6b4266b5d14de302cedRafael Espindola  class DEFAULT foo {
392f47c366bcc28f54f22df6b4266b5d14de302cedRafael Espindola  };
402f47c366bcc28f54f22df6b4266b5d14de302cedRafael Espindola  foo myvec;
412f47c366bcc28f54f22df6b4266b5d14de302cedRafael Espindola  // CHECK: @_ZN6test285myvecE = global
422f47c366bcc28f54f22df6b4266b5d14de302cedRafael Espindola  // CHECK-HIDDEN: @_ZN6test285myvecE = hidden global
432f47c366bcc28f54f22df6b4266b5d14de302cedRafael Espindola}
442f47c366bcc28f54f22df6b4266b5d14de302cedRafael Espindola
45c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindolanamespace test29 {
46c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola#pragma GCC visibility push(hidden)
47c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola  struct RECT {
48c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola    int top;
49c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola  };
50b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  DEFAULT extern RECT data_rect;
51c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola  RECT data_rect = { -1};
52c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola#pragma GCC visibility pop
53c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola  // CHECK: @_ZN6test299data_rectE = global
54c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola  // CHECK-HIDDEN: @_ZN6test299data_rectE = global
55c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola}
56c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola
57797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindolanamespace test40 {
58797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola  template<typename T>
59797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola  struct foo {
60797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola    DEFAULT static int bar;
61797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola  };
62797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola  template<typename T>
63797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola  int foo<T>::bar;
64797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola  template struct foo<int>;
65797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola  // CHECK: _ZN6test403fooIiE3barE = weak_odr global
66797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola  // CHECK-HIDDEN: _ZN6test403fooIiE3barE = weak_odr global
67797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola}
68797105a45a838a7c1cefd05dec3fd0cbaeb0a215Rafael Espindola
692de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindolanamespace test41 {
702de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola  // Unlike gcc we propagate the information that foo not only is hidden, but
712de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola  // has been explicitly marked as so. This lets us produce a hidden undefined
722de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola  // reference to bar.
73b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  struct HIDDEN foo {};
742de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola  extern foo bar;
752de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola  foo *zed() {
762de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola    return &bar;
772de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola  }
782de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola  // CHECK: @_ZN6test413barE = external hidden global
792de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola  // CHECK-HIDDEN: @_ZN6test413barE = external hidden global
802de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola}
812de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola
82edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test48 {
83edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // Test that we use the visibility of struct foo when instantiating the
84edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // template. Note that is a case where we disagree with gcc, it produces
85edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // a default symbol.
86edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  struct HIDDEN foo {
87edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  };
88edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  DEFAULT foo x;
89edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
90edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  struct bar {
91edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    template<foo *z>
92edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    struct zed {
93edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    };
94edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  };
95edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
96edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  bar::zed<&x> y;
97edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // CHECK: _ZN6test481yE = hidden global
98edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // CHECK-HIDDEN: _ZN6test481yE = hidden global
99edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola}
100edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
10139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson// CHECK: @_ZN5Test425VariableInHiddenNamespaceE = hidden global i32 10
1021fb0caaa7bef765b85972274e3b434af2572c141John McCall// CHECK: @_ZN5Test71aE = hidden global
1031fb0caaa7bef765b85972274e3b434af2572c141John McCall// CHECK: @_ZN5Test71bE = global
104ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK: @test9_var = global
105ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// CHECK-HIDDEN: @test9_var = global
106110e8e56af30363072c140285961592b0107f789John McCall// CHECK: @_ZN6Test121A6hiddenE = external hidden global
107110e8e56af30363072c140285961592b0107f789John McCall// CHECK: @_ZN6Test121A7visibleE = external global
108110e8e56af30363072c140285961592b0107f789John McCall// CHECK-HIDDEN: @_ZN6Test121A6hiddenE = external hidden global
109110e8e56af30363072c140285961592b0107f789John McCall// CHECK-HIDDEN: @_ZN6Test121A7visibleE = external global
110110e8e56af30363072c140285961592b0107f789John McCall// CHECK: @_ZN6Test131B1aE = hidden global
111110e8e56af30363072c140285961592b0107f789John McCall// CHECK: @_ZN6Test131C1aE = global
112110e8e56af30363072c140285961592b0107f789John McCall// CHECK-HIDDEN: @_ZN6Test131B1aE = hidden global
113110e8e56af30363072c140285961592b0107f789John McCall// CHECK-HIDDEN: @_ZN6Test131C1aE = global
114110e8e56af30363072c140285961592b0107f789John McCall// CHECK: @_ZN6Test143varE = external global
115110e8e56af30363072c140285961592b0107f789John McCall// CHECK-HIDDEN: @_ZN6Test143varE = external global
116ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall// CHECK: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
117ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall// CHECK-HIDDEN: @_ZN6Test154TempINS_1AEE5Inner6bufferE = external global [0 x i8]
118860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
119860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test27 {
120860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  template<typename T>
121860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  class C {
122b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola    class DEFAULT D {
123860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola      void f();
124860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    };
125860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  };
126860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
127860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  template<>
128860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  class C<int>::D {
129860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    virtual void g();
130860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  };
131860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
132860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  void C<int>::D::g() {
133860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  }
134860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  // CHECK: _ZTVN6test271CIiE1DE = unnamed_addr constant
135860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  // CHECK-HIDDEN: _ZTVN6test271CIiE1DE = unnamed_addr constant
136860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola}
137860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
1380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZTVN5Test63fooE = linkonce_odr hidden unnamed_addr constant
1390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-HIDDEN: @_ZTVN6Test161AIcEE = external unnamed_addr constant
1410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-HIDDEN: @_ZTTN6Test161AIcEE = external unnamed_addr constant
1420e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
14393cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman// CHECK: @_ZZN6test681fC1EvE4test = linkonce_odr global
14493cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman// CHECK-HIDDEN: @_ZZN6test681fC1EvE4test = linkonce_odr hidden global
1450e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZGVZN6test681fC1EvE4test = linkonce_odr global
14793cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman// CHECK-HIDDEN: @_ZGVZN6test681fC1EvE4test = linkonce_odr hidden global
1480e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1490e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr global
1500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-HIDDEN: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr hidden global
1510e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
1520e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr global i64
1530e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-HIDDEN: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr hidden global i64
1541fb0caaa7bef765b85972274e3b434af2572c141John McCall
15539de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test1 {
15693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define hidden void @_ZN5Test11fEv
15739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  void HIDDEN f() { }
15839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
15939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson}
16039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
16139de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test2 {
16239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  struct HIDDEN A {
16339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson    void f();
16439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  };
16539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
16639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  // A::f is a member function of a hidden class.
16793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define hidden void @_ZN5Test21A1fEv
16839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  void A::f() { }
16939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson}
17039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
17139de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test3 {
17239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  struct HIDDEN A {
17339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson    struct B {
17439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson      void f();
17539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson    };
17639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  };
17739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
17839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  // B is a nested class where its parent class is hidden.
17993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define hidden void @_ZN5Test31A1B1fEv
18039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  void A::B::f() { }
18139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson}
18239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
18339de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test4 HIDDEN {
18439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  int VariableInHiddenNamespace = 10;
18539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
18639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  // Test4::g is in a hidden namespace.
18793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define hidden void @_ZN5Test41gEv
18839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  void g() { }
18939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
19039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  struct DEFAULT A {
19139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson    void f();
19239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  };
19339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
19439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  // A has default visibility.
19593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN5Test41A1fEv
19639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  void A::f() { }
19739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson}
19839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
19939de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test5 {
20039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
20139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  namespace NS HIDDEN {
20239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson    // f is in NS which is hidden.
20393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define hidden void @_ZN5Test52NS1fEv()
20439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson    void f() { }
20539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  }
20639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson
20739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  namespace NS {
20839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson    // g is in NS, but this NS decl is not hidden.
20993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define void @_ZN5Test52NS1gEv
21039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson    void g() { }
21139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson  }
21239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson}
213c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor
214c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor// <rdar://problem/8091955>
215c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregornamespace Test6 {
216c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor  struct HIDDEN foo {
217c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor    foo() { }
218c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor    void bonk();
219c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor    virtual void bar() = 0;
220c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor
221c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor    virtual void zonk() {}
222c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor  };
223c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor
224c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor  struct barc : public foo {
225c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor    barc();
226c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor    virtual void bar();
227c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor  };
228c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor
229c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor  barc::barc() {}
230c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor}
2311fb0caaa7bef765b85972274e3b434af2572c141John McCall
2321fb0caaa7bef765b85972274e3b434af2572c141John McCallnamespace Test7 {
2331fb0caaa7bef765b85972274e3b434af2572c141John McCall  class HIDDEN A {};
2341fb0caaa7bef765b85972274e3b434af2572c141John McCall  A a; // top of file
2351fb0caaa7bef765b85972274e3b434af2572c141John McCall
2361fb0caaa7bef765b85972274e3b434af2572c141John McCall  template <A&> struct Aref {
2371fb0caaa7bef765b85972274e3b434af2572c141John McCall    static void foo() {}
2381fb0caaa7bef765b85972274e3b434af2572c141John McCall  };
2391fb0caaa7bef765b85972274e3b434af2572c141John McCall
2401fb0caaa7bef765b85972274e3b434af2572c141John McCall  class B : public A {};
2411fb0caaa7bef765b85972274e3b434af2572c141John McCall  B b; // top of file
2421fb0caaa7bef765b85972274e3b434af2572c141John McCall
2430e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  // CHECK-LABEL: define linkonce_odr hidden void @_ZN5Test74ArefIL_ZNS_1aEEE3fooEv()
2441fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test() {
2451fb0caaa7bef765b85972274e3b434af2572c141John McCall    Aref<a>::foo();
2461fb0caaa7bef765b85972274e3b434af2572c141John McCall  }
2471fb0caaa7bef765b85972274e3b434af2572c141John McCall}
2481fb0caaa7bef765b85972274e3b434af2572c141John McCall
2491fb0caaa7bef765b85972274e3b434af2572c141John McCallnamespace Test8 {
2501fb0caaa7bef765b85972274e3b434af2572c141John McCall  void foo();
2511fb0caaa7bef765b85972274e3b434af2572c141John McCall  void bar() {}
25293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define hidden void @_ZN5Test83barEv()
2531fb0caaa7bef765b85972274e3b434af2572c141John McCall  // CHECK-HIDDEN: declare void @_ZN5Test83fooEv()
2541fb0caaa7bef765b85972274e3b434af2572c141John McCall
2551fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test() {
2561fb0caaa7bef765b85972274e3b434af2572c141John McCall    foo();
2571fb0caaa7bef765b85972274e3b434af2572c141John McCall    bar();
2581fb0caaa7bef765b85972274e3b434af2572c141John McCall  }
2591fb0caaa7bef765b85972274e3b434af2572c141John McCall}
260ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall
261ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// PR8457
262ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCallnamespace Test9 {
263ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall  extern "C" {
264ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall    struct A { int field; };
265ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall    void DEFAULT test9_fun(struct A *a) { }
266ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall    struct A DEFAULT test9_var; // above
267ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall  }
26893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @test9_fun(
26993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define void @test9_fun(
270ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall
271ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall  void test() {
272ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall    A a = test9_var;
273ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall    test9_fun(&a);
274ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall  }
275ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall}
27667fa6d5ea630c800c3c96e129129aba93d1487c2John McCall
27767fa6d5ea630c800c3c96e129129aba93d1487c2John McCall// PR8478
27867fa6d5ea630c800c3c96e129129aba93d1487c2John McCallnamespace Test10 {
27967fa6d5ea630c800c3c96e129129aba93d1487c2John McCall  struct A;
28067fa6d5ea630c800c3c96e129129aba93d1487c2John McCall
281fc038e9ef8ed262724f42597ca5c844de97b1202Eli Friedman  class DEFAULT B {
28267fa6d5ea630c800c3c96e129129aba93d1487c2John McCall    void foo(A*);
28367fa6d5ea630c800c3c96e129129aba93d1487c2John McCall  };
28467fa6d5ea630c800c3c96e129129aba93d1487c2John McCall
28593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6Test101B3fooEPNS_1AE(
28693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define void @_ZN6Test101B3fooEPNS_1AE(
28767fa6d5ea630c800c3c96e129129aba93d1487c2John McCall  void B::foo(A*) {}
28867fa6d5ea630c800c3c96e129129aba93d1487c2John McCall}
2890df9587ab011c12968fcbe3518666b2117afe350John McCall
2900df9587ab011c12968fcbe3518666b2117afe350John McCall// PR8492
2910df9587ab011c12968fcbe3518666b2117afe350John McCallnamespace Test11 {
2920df9587ab011c12968fcbe3518666b2117afe350John McCall  struct A {
2930df9587ab011c12968fcbe3518666b2117afe350John McCall    void foo() {}
2940df9587ab011c12968fcbe3518666b2117afe350John McCall    void DEFAULT bar() {}
2950df9587ab011c12968fcbe3518666b2117afe350John McCall  };
2960df9587ab011c12968fcbe3518666b2117afe350John McCall
2970df9587ab011c12968fcbe3518666b2117afe350John McCall  void test() {
2980df9587ab011c12968fcbe3518666b2117afe350John McCall    A a;
2990df9587ab011c12968fcbe3518666b2117afe350John McCall    a.foo();
3000df9587ab011c12968fcbe3518666b2117afe350John McCall    a.bar();
3010df9587ab011c12968fcbe3518666b2117afe350John McCall  }
3020df9587ab011c12968fcbe3518666b2117afe350John McCall
30393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6Test111A3fooEv(
30493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6Test111A3barEv(
30593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6Test111A3fooEv(
30693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define linkonce_odr void @_ZN6Test111A3barEv(
3070df9587ab011c12968fcbe3518666b2117afe350John McCall}
308110e8e56af30363072c140285961592b0107f789John McCall
309110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file.
310110e8e56af30363072c140285961592b0107f789John McCallnamespace Test12 {
311110e8e56af30363072c140285961592b0107f789John McCall  struct A {
312110e8e56af30363072c140285961592b0107f789John McCall    // This is hidden in all cases: the explicit attribute takes
313110e8e56af30363072c140285961592b0107f789John McCall    // priority over -fvisibility on the parent.
314110e8e56af30363072c140285961592b0107f789John McCall    static int hidden HIDDEN;
315110e8e56af30363072c140285961592b0107f789John McCall
316110e8e56af30363072c140285961592b0107f789John McCall    // This is default in all cases because it's only a declaration.
317110e8e56af30363072c140285961592b0107f789John McCall    static int visible;
318110e8e56af30363072c140285961592b0107f789John McCall  };
319110e8e56af30363072c140285961592b0107f789John McCall
320110e8e56af30363072c140285961592b0107f789John McCall  void test() {
321110e8e56af30363072c140285961592b0107f789John McCall    A::hidden = 0;
322110e8e56af30363072c140285961592b0107f789John McCall    A::visible = 0;
323110e8e56af30363072c140285961592b0107f789John McCall  }
324110e8e56af30363072c140285961592b0107f789John McCall}
325110e8e56af30363072c140285961592b0107f789John McCall
326110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file.
327110e8e56af30363072c140285961592b0107f789John McCallnamespace Test13 {
328110e8e56af30363072c140285961592b0107f789John McCall  struct HIDDEN A {};
329110e8e56af30363072c140285961592b0107f789John McCall
330110e8e56af30363072c140285961592b0107f789John McCall  // Should be hidden in all cases.
331110e8e56af30363072c140285961592b0107f789John McCall  struct B {
332110e8e56af30363072c140285961592b0107f789John McCall    static A a;
333110e8e56af30363072c140285961592b0107f789John McCall  };
334110e8e56af30363072c140285961592b0107f789John McCall  A B::a;
335110e8e56af30363072c140285961592b0107f789John McCall
336110e8e56af30363072c140285961592b0107f789John McCall  // Should be default in all cases.
337110e8e56af30363072c140285961592b0107f789John McCall  struct DEFAULT C {
338110e8e56af30363072c140285961592b0107f789John McCall    static A a;
339110e8e56af30363072c140285961592b0107f789John McCall  };
340110e8e56af30363072c140285961592b0107f789John McCall  A C::a;
341110e8e56af30363072c140285961592b0107f789John McCall};
342110e8e56af30363072c140285961592b0107f789John McCall
343110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file.
344110e8e56af30363072c140285961592b0107f789John McCallnamespace Test14 {
345110e8e56af30363072c140285961592b0107f789John McCall  // Neither the visibility of the type nor -fvisibility=hidden should
346110e8e56af30363072c140285961592b0107f789John McCall  // apply to declarations.
347110e8e56af30363072c140285961592b0107f789John McCall  extern struct A *var;
348110e8e56af30363072c140285961592b0107f789John McCall
349110e8e56af30363072c140285961592b0107f789John McCall  struct A *test() { return var; }
350110e8e56af30363072c140285961592b0107f789John McCall}
351ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall
352ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall// rdar://problem/8613093
353ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCallnamespace Test15 {
354ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall  struct A {};
355ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall  template <class T> struct Temp {
356ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall    struct Inner {
357ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall      static char buffer[0];
358ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall    };
359ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall  };
360ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall
361ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall  char *test() {
362ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall    return Temp<A>::Inner::buffer;
363ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall  }
364ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall}
365af14603ca61757cf4361b583b45639a04c57e651John McCall
366af14603ca61757cf4361b583b45639a04c57e651John McCallnamespace Test16 {
367af14603ca61757cf4361b583b45639a04c57e651John McCall  struct Base1 { virtual void foo(); };
368af14603ca61757cf4361b583b45639a04c57e651John McCall  struct Base2 : virtual Base1 { virtual void foo(); };
369af14603ca61757cf4361b583b45639a04c57e651John McCall  template <class T> struct A : virtual Base1, Base2 {
370af14603ca61757cf4361b583b45639a04c57e651John McCall    virtual void foo();
371af14603ca61757cf4361b583b45639a04c57e651John McCall  };
372af14603ca61757cf4361b583b45639a04c57e651John McCall  extern template struct A<char>;
373af14603ca61757cf4361b583b45639a04c57e651John McCall
374af14603ca61757cf4361b583b45639a04c57e651John McCall  void test() {
375af14603ca61757cf4361b583b45639a04c57e651John McCall    A<char> a;
376af14603ca61757cf4361b583b45639a04c57e651John McCall    a.foo();
377af14603ca61757cf4361b583b45639a04c57e651John McCall  }
378af14603ca61757cf4361b583b45639a04c57e651John McCall}
3793698748400478880d2a146ef9eaa111cd0e60522John McCall
3803698748400478880d2a146ef9eaa111cd0e60522John McCallnamespace Test17 {
3813698748400478880d2a146ef9eaa111cd0e60522John McCall  struct HIDDEN A {
3823698748400478880d2a146ef9eaa111cd0e60522John McCall    static void foo();
3833698748400478880d2a146ef9eaa111cd0e60522John McCall    static void DEFAULT bar();
3843698748400478880d2a146ef9eaa111cd0e60522John McCall    static void HIDDEN baz();
3853698748400478880d2a146ef9eaa111cd0e60522John McCall
3863698748400478880d2a146ef9eaa111cd0e60522John McCall    struct DEFAULT B {
3873698748400478880d2a146ef9eaa111cd0e60522John McCall      static void foo();
3883698748400478880d2a146ef9eaa111cd0e60522John McCall      static void DEFAULT bar();
3893698748400478880d2a146ef9eaa111cd0e60522John McCall      static void HIDDEN baz();
3903698748400478880d2a146ef9eaa111cd0e60522John McCall    };
3913698748400478880d2a146ef9eaa111cd0e60522John McCall  };
3923698748400478880d2a146ef9eaa111cd0e60522John McCall
3933698748400478880d2a146ef9eaa111cd0e60522John McCall  void test() {
3943698748400478880d2a146ef9eaa111cd0e60522John McCall    A::foo();
3953698748400478880d2a146ef9eaa111cd0e60522John McCall    A::bar();
3963698748400478880d2a146ef9eaa111cd0e60522John McCall    A::baz();
3973698748400478880d2a146ef9eaa111cd0e60522John McCall    A::B::foo();
3983698748400478880d2a146ef9eaa111cd0e60522John McCall    A::B::bar();
3993698748400478880d2a146ef9eaa111cd0e60522John McCall    A::B::baz();
4003698748400478880d2a146ef9eaa111cd0e60522John McCall  }
4013698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test171A3fooEv()
4023698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare void @_ZN6Test171A3barEv()
4033698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test171A3bazEv()
4043698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare void @_ZN6Test171A1B3fooEv()
4053698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare void @_ZN6Test171A1B3barEv()
4063698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test171A1B3bazEv()
4073698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3fooEv()
4083698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare void @_ZN6Test171A3barEv()
4093698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3bazEv()
4103698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare void @_ZN6Test171A1B3fooEv()
4113698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare void @_ZN6Test171A1B3barEv()
4123698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test171A1B3bazEv()
4133698748400478880d2a146ef9eaa111cd0e60522John McCall}
4143698748400478880d2a146ef9eaa111cd0e60522John McCall
4153698748400478880d2a146ef9eaa111cd0e60522John McCallnamespace Test18 {
4163698748400478880d2a146ef9eaa111cd0e60522John McCall  template <class T> struct HIDDEN A {
4173698748400478880d2a146ef9eaa111cd0e60522John McCall    static void foo();
4183698748400478880d2a146ef9eaa111cd0e60522John McCall    static void DEFAULT bar();
4193698748400478880d2a146ef9eaa111cd0e60522John McCall    static void HIDDEN baz();
4203698748400478880d2a146ef9eaa111cd0e60522John McCall
4213698748400478880d2a146ef9eaa111cd0e60522John McCall    struct DEFAULT B {
4223698748400478880d2a146ef9eaa111cd0e60522John McCall      static void foo();
4233698748400478880d2a146ef9eaa111cd0e60522John McCall      static void DEFAULT bar();
4243698748400478880d2a146ef9eaa111cd0e60522John McCall      static void HIDDEN baz();
4253698748400478880d2a146ef9eaa111cd0e60522John McCall    };
4263698748400478880d2a146ef9eaa111cd0e60522John McCall  };
4273698748400478880d2a146ef9eaa111cd0e60522John McCall  struct HIDDEN H;
4283698748400478880d2a146ef9eaa111cd0e60522John McCall
4293698748400478880d2a146ef9eaa111cd0e60522John McCall  void test() {
4303698748400478880d2a146ef9eaa111cd0e60522John McCall    A<int>::foo();
4313698748400478880d2a146ef9eaa111cd0e60522John McCall    A<int>::bar();
4323698748400478880d2a146ef9eaa111cd0e60522John McCall    A<int>::baz();
4333698748400478880d2a146ef9eaa111cd0e60522John McCall    A<int>::B::foo();
4343698748400478880d2a146ef9eaa111cd0e60522John McCall    A<int>::B::bar();
4353698748400478880d2a146ef9eaa111cd0e60522John McCall    A<int>::B::baz();
4363698748400478880d2a146ef9eaa111cd0e60522John McCall    A<H>::foo();
4373698748400478880d2a146ef9eaa111cd0e60522John McCall    A<H>::bar();
4383698748400478880d2a146ef9eaa111cd0e60522John McCall    A<H>::baz();
4393698748400478880d2a146ef9eaa111cd0e60522John McCall    A<H>::B::foo();
4403698748400478880d2a146ef9eaa111cd0e60522John McCall    A<H>::B::bar();
4413698748400478880d2a146ef9eaa111cd0e60522John McCall    A<H>::B::baz();
4423698748400478880d2a146ef9eaa111cd0e60522John McCall  }
4433698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AIiE3fooEv()
4443698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare void @_ZN6Test181AIiE3barEv()
4453698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AIiE3bazEv()
4463698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare void @_ZN6Test181AIiE1B3fooEv()
4473698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare void @_ZN6Test181AIiE1B3barEv()
4483698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AIiE1B3bazEv()
4493698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
4503698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
4513698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
4523698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
4533698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
4543698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
4553698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3fooEv()
4563698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare void @_ZN6Test181AIiE3barEv()
4573698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3bazEv()
4583698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3fooEv()
4593698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3barEv()
4603698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE1B3bazEv()
4613698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3fooEv()
4623698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3barEv()
4633698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3bazEv()
4643698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv()
4653698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv()
4663698748400478880d2a146ef9eaa111cd0e60522John McCall  // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv()
4673698748400478880d2a146ef9eaa111cd0e60522John McCall}
468112c967bd5c862a0f5d7913aa06700c048807db8John McCall
469112c967bd5c862a0f5d7913aa06700c048807db8John McCallnamespace Test19 {
470112c967bd5c862a0f5d7913aa06700c048807db8John McCall  struct A { A(); ~A(); };
471112c967bd5c862a0f5d7913aa06700c048807db8John McCall
472112c967bd5c862a0f5d7913aa06700c048807db8John McCall  // Tested at top of file.
473112c967bd5c862a0f5d7913aa06700c048807db8John McCall  template <class T> void foo() {
474112c967bd5c862a0f5d7913aa06700c048807db8John McCall    static A a;
475112c967bd5c862a0f5d7913aa06700c048807db8John McCall  }
476112c967bd5c862a0f5d7913aa06700c048807db8John McCall
477112c967bd5c862a0f5d7913aa06700c048807db8John McCall  void test() {
478112c967bd5c862a0f5d7913aa06700c048807db8John McCall    foo<int>();
479112c967bd5c862a0f5d7913aa06700c048807db8John McCall  }
480112c967bd5c862a0f5d7913aa06700c048807db8John McCall}
4817f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
4827f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall// Various things with class template specializations.
4837f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCallnamespace Test20 {
4847f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  template <unsigned> struct HIDDEN A {};
4857f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
4867f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  // An explicit specialization inherits the explicit visibility of
4877f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  // the template.
4887f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  template <> struct A<0> {
4897f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    static void test0();
4907f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    static void test1();
4917f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  };
4927f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
49393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define hidden void @_ZN6Test201AILj0EE5test0Ev()
4947f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  void A<0>::test0() {}
4957f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
4967f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  // CHECK: declare hidden void @_ZN6Test201AILj0EE5test1Ev()
4977f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  void test1() {
4987f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    A<0>::test1();
4997f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  }
5007f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
5017f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  // ...unless that's explicitly overridden.
5027f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  template <> struct DEFAULT A<1> {
5037f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    static void test2();
5047f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    static void test3();
5057f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  };
5067f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
50793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6Test201AILj1EE5test2Ev()
5087f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  void A<1>::test2() {}
5097f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
5107f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  // CHECK: declare void @_ZN6Test201AILj1EE5test3Ev()
5117f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  void test3() {
5127f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    A<1>::test3();
5137f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  }
5147f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
5157f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  // <rdar://problem/8778497>
5167f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  // But we should assume that an unknown specialization has the
5177f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  // explicit visibility settings of the template.
5187f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  template <class T> struct B {
5197f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    static void test4() {}
5207f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    static void test5();
5217f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  };
5227f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
52393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr hidden void @_ZN6Test201BINS_1AILj2EEEE5test4Ev()
5247f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  void test4() {
5257f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    B<A<2> >::test4();
5267f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  }
5277f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall
528093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  // CHECK: declare hidden void @_ZN6Test201BINS_1AILj2EEEE5test5Ev()
5297f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  void test5() {
5307f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall    B<A<2> >::test5();
5317f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall  }
5327f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall}
5331a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall
5341a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall// PR9371
5351a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCallnamespace test21 {
5361a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall  enum En { en };
5371a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall  template<En> struct A {
538b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola    DEFAULT void foo() {}
5391a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall  };
5401a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall
54193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test211AILNS_2EnE0EE3fooEv(
5421a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall  template void A<en>::foo();
5431a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall}
5446ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall
5456ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall// rdar://problem/9616154
5466ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall// Visibility on explicit specializations should take precedence.
5476ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCallnamespace test22 {
5486ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  class A1 {};
5496ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  class A2 {};
5506ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall
5516ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  template <class T> struct B {};
5526ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  template <> struct DEFAULT B<A1> {
5536ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall    static void foo();
5546ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall    static void bar() {}
5556ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  };
5566ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  template <> struct B<A2> {
5576ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall    static void foo();
5586ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall    static void bar() {}
5596ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  };
5606ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall
5616ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  void test() {
5626ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall    B<A1>::foo();
5636ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall    B<A1>::bar();
5646ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall    B<A2>::foo();
5656ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall    B<A2>::bar();
5666ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  }
5676ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  // CHECK: declare void @_ZN6test221BINS_2A1EE3fooEv()
56893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv()
5696ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  // CHECK: declare void @_ZN6test221BINS_2A2EE3fooEv()
57093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6test221BINS_2A2EE3barEv()
5716ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A1EE3fooEv()
57293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv()
5736ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall  // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A2EE3fooEv()
57493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test221BINS_2A2EE3barEv()
5756ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall}
57671cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola
57771cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindolanamespace PR10113 {
578b5d763d87c8ffb969b4d4a59ed98a2e3516e0850Rafael Espindola  namespace foo DEFAULT {
57971cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola    template<typename T>
58071cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola      class bar {
58171cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola      void zed() {}
58271cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola    };
58371cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola  }
58471cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola  template class foo::bar<char>;
58593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv
58693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv
587093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola
588093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  struct zed {
589093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  };
590093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  template class foo::bar<zed>;
59193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv
59293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN7PR101133foo3barINS_3zedEE3zedEv
59371cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola}
5940257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola
5950257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindolanamespace PR11690 {
5960257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola  template<class T> struct Class {
5970257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola    void size() const {
5980257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola    }
5990257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola  };
6000257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola  template class DEFAULT Class<char>;
60193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv
60293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv
603256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola
604256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola  template<class T> void Method() {}
605093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  template  DEFAULT void Method<char>();
60693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN7PR116906MethodIcEEvv
60793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN7PR116906MethodIcEEvv
6080257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola}
609093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola
610093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindolanamespace PR11690_2 {
611093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  namespace foo DEFAULT {
612093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola    class bar;
613093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola    template<typename T1, typename T2 = bar>
614093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola    class zed {
615093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola      void bar() {
616093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola      }
617093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola    };
618093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  }
619093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  struct baz {
620093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  };
621093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola  template class foo::zed<baz>;
62293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv
62393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv
624093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola}
625860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
626860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test23 {
627860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  // Having a template argument that is explicitly visible should not make
628860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  // the template instantiation visible.
629860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  template <typename T>
630860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  struct X {
631860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    static void f() {
632860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    }
633860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  };
634860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
635860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  class DEFAULT A;
636860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
637860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  void g() {
638860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    X<A> y;
639860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    y.f();
640860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  }
64193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6test231XINS_1AEE1fEv
64293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test231XINS_1AEE1fEv
643860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola}
644860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
645860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace PR12001 {
646860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  template <typename P1>
647860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  void Bind(const P1& p1) {
648860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  }
649860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
650860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  class DEFAULT Version { };
651860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
652860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  void f() {
653860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    Bind(Version());
654860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  }
65593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN7PR120014BindINS_7VersionEEEvRKT_
65693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN7PR120014BindINS_7VersionEEEvRKT_
657860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola}
658860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
659860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test24 {
660860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  class DEFAULT A { };
661860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
662860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  struct S {
663860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    template <typename T>
664860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    void mem() {}
665860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  };
666860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
667860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  void test() {
668860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    S s;
669860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola    s.mem<A>();
670860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  }
67193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6test241S3memINS_1AEEEvv
67293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test241S3memINS_1AEEEvv
673860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola}
674860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
675860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test26 {
676860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  template<typename T>
677860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  class C {
678b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola    DEFAULT  void f();
679860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  };
680860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
681860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  template<>
682860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola  void C<int>::f() { }
683860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola
68493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test261CIiE1fEv
68593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define void @_ZN6test261CIiE1fEv
686860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola}
687bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola
688bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindolanamespace test31 {
689bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola  struct A {
690bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola    struct HIDDEN B {
691bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola      static void DEFAULT baz();
692bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola    };
693bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola  };
694bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola  void f() {
695bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola    A::B::baz();
696bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola  }
697bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola  // CHECK: declare void @_ZN6test311A1B3bazEv()
698bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola  // CHECK-HIDDEN: declare void @_ZN6test311A1B3bazEv()
699bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola}
700a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola
701a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindolanamespace test32 {
702a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola  struct HIDDEN A {
703a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola    struct DEFAULT B {
704a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola      void DEFAULT baz();
705a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola    };
706a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola  };
707a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola  void A::B::baz() {
708a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola  }
70993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test321A1B3bazEv
71093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define void @_ZN6test321A1B3bazEv
711a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola}
712f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola
713f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindolanamespace test33 {
714f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola  template<typename T>
715f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola  class foo {
716f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola    void bar() {}
717f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola  };
71871776efce59509b127a02f385c3df9686b852d62Rafael Espindola  struct HIDDEN zed {
719f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola  };
72071776efce59509b127a02f385c3df9686b852d62Rafael Espindola  template class DEFAULT foo<zed>;
72193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv
72293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv
723f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola}
724a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola
725a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindolanamespace test34 {
726a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola  struct foo {
727a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola  };
728a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola  template<class T>
729a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola  void bar() {}
730a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola  template DEFAULT void bar<foo>();
73193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test343barINS_3fooEEEvv
73293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test343barINS_3fooEEEvv
733a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola}
734546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola
735546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindolanamespace test35 {
736546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola  // This is a really ugly testcase. GCC propagates the DEFAULT in zed's
7375a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  // definition. It's not really clear what we can do here, because we
7385a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  // produce the symbols before even seeing the DEFAULT definition of zed.
7395a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  // FIXME: Maybe the best thing to do here is error?  It's certainly hard
7405a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  // to argue that this ought to be valid.
741546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola  template<typename T>
742546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola  struct DEFAULT foo {
743546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola    void bar() {}
744546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola  };
745546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola  class zed;
746546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola  template class foo<zed>;
747546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola  class DEFAULT zed {
748546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola  };
74993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv
75093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test353fooINS_3zedEE3barEv
751546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola}
752923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola
753923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindolanamespace test36 {
754923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola  template<typename T1, typename T2>
755923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola  class foo {
756923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola    void bar() {}
757923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola  };
758923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola  class DEFAULT S1 {};
759923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola  struct HIDDEN S2 {};
760923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola  template class foo<S1, S2>;
76193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
76293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv
763923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola}
76431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola
76531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test37 {
76631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  struct HIDDEN foo {
76731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  };
76831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template<class T>
76931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  DEFAULT void bar() {}
77031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template DEFAULT void bar<foo>();
77193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test373barINS_3fooEEEvv
77293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test373barINS_3fooEEEvv
77331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola}
77431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola
77531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test38 {
77631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template<typename T>
77731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  class DEFAULT foo {
77831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola    void bar() {}
77931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  };
78031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  struct HIDDEN zed {
78131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  };
78231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template class foo<zed>;
78393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv
78493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv
78531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola}
78631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola
78731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test39 {
78831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  class DEFAULT default_t;
78931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  class HIDDEN hidden_t;
79031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template <class T> class A {
79131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola    template <class U> class B {
79231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola      HIDDEN void hidden() {}
79331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola      void noattr() {}
79431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola      template <class V> void temp() {}
79531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola    };
79631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  };
79731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template class DEFAULT A<hidden_t>;
79831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template class DEFAULT A<hidden_t>::B<hidden_t>;
79931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template void A<hidden_t>::B<hidden_t>::temp<default_t>();
80031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  template void A<hidden_t>::B<hidden_t>::temp<hidden_t>();
80131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola
80293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv
80393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv
80493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv
80531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola
80631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  // GCC produces a default for this one. Why?
80793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv
80831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola
80993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv
81093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv
81193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv
81231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola
81331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola  // GCC produces a default for this one. Why?
81493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv
81531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola}
8160b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola
8170b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindolanamespace test42 {
8180b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  struct HIDDEN foo {
8190b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  };
8200b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  template <class P>
8210b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  struct bar {
8220b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  };
8230b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  template <>
8240b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  struct HIDDEN bar<foo> {
8250b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola    DEFAULT static void zed();
8260b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  };
8270b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  void bar<foo>::zed() {
8280b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola  }
82993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test423barINS_3fooEE3zedEv
83093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define void @_ZN6test423barINS_3fooEE3zedEv
8310b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola}
832cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola
833cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindolanamespace test43 {
834cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola  struct HIDDEN foo {
835cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola  };
836cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola  template <class P>
837cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola  void bar() {
838cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola  }
839cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola  template <>
840cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola  DEFAULT void bar<foo>() {
841cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola  }
84293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test433barINS_3fooEEEvv
84393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define void @_ZN6test433barINS_3fooEEEvv
844cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola}
845ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola
846ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindolanamespace test44 {
847ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola  template <typename T>
848ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola  struct foo {
849ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola    foo() {}
850ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola  };
851ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola  namespace {
852ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola    struct bar;
853ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola  }
854ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola  template struct DEFAULT foo<bar>;
855ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola  foo<bar> x;
85693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev
85793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev
858ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola}
85920831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola
86020831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindolanamespace test45 {
86120831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola  template <typename T>
86220831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola  struct foo {
86320831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola    template <typename T2>
86420831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola    struct bar {
86520831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola      bar() {};
86620831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola    };
86720831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola  };
86820831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola  namespace {
86920831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola    struct zed;
87020831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola  }
87120831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola  template struct DEFAULT foo<int>::bar<zed>;
87220831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola  foo<int>::bar<zed> x;
87393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev
87493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev
87520831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola}
8769db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola
8779db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindolanamespace test46 {
8789db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola  template <typename T>
8799db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola  void foo() {
8809db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola  }
8819db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola  namespace {
8829db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola    struct bar;
8839db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola  }
8849db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola  template DEFAULT void foo<bar>();
8859db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola  void zed() {
8869db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola    foo<bar>();
8879db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola  }
88893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv
88993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv
8909db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola}
89141be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola
89241be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindolanamespace test47 {
89341be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola  struct foo {
89441be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola    template <typename T>
89541be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola    static void bar() {
89641be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola    }
89741be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola  };
89841be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola  namespace {
89941be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola    struct zed;
90041be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola  }
901b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  template DEFAULT void foo::bar<zed>();
90241be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola  void baz() {
90341be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola    foo::bar<zed>();
90441be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola  }
90593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv
90693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv
90741be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola}
908edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
909edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test49 {
910edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // Test that we use the visibility of struct foo when instantiating the
911edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // template. Note that is a case where we disagree with gcc, it produces
912edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // a default symbol.
913edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
914edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  struct HIDDEN foo {
915edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  };
916edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
917edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  DEFAULT foo x;
918edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
919edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  struct bar {
920edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    template<foo *z>
921edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    void zed() {
922edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    }
923edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  };
924edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
925edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  template void bar::zed<&x>();
92693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv
92793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv
928edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola}
929edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
930edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test50 {
931edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // Test that we use the visibility of struct foo when instantiating the
932edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // template. Note that is a case where we disagree with gcc, it produces
933edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // a default symbol.
934edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
935edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  struct HIDDEN foo {
936edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  };
937edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  DEFAULT foo x;
938edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  template<foo *z>
939edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  struct DEFAULT bar {
940edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    void zed() {
941edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    }
942edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  };
943edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  template void bar<&x>::zed();
94493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv
94593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv
946edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola}
947edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
948edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test51 {
949edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // Test that we use the visibility of struct foo when instantiating the
950edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // template. Note that is a case where we disagree with gcc, it produces
951edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // a default symbol.
952edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
953edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  struct HIDDEN foo {
954edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  };
955edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  DEFAULT foo x;
956edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  template<foo *z>
957edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  void DEFAULT zed() {
958edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  }
959edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  template void zed<&x>();
96093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv
96193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv
962edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola}
963edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
964edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test52 {
965edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // Test that we use the linkage of struct foo when instantiating the
966edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // template. Note that is a case where we disagree with gcc, it produces
967edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  // an external symbol.
968edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola
969edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  namespace {
970edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    struct foo {
971edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    };
972edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  }
973edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  template<foo *x>
974edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  void zed() {
975edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  }
976edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  void f() {
977edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola    zed<nullptr>();
978edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola  }
97993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv
98093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv
981edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola}
982f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola
983f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindolanamespace test53 {
984f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola  template<typename _Tp > struct vector   {
985f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola    static void       _M_fill_insert();
986f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola  };
987f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola#pragma GCC visibility push(hidden)
9888d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  // GCC doesn't seem to use the visibility of enums at all, we do.
9898d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  enum zed {v1};
9908d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola
9918d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  // GCC fails to mark this specialization hidden, we mark it.
9928d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  template<>
9938d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  struct vector<int> {
9948d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola    static void       _M_fill_insert();
9958d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  };
996f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola  void foo() {
997f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola    vector<unsigned>::_M_fill_insert();
9988d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola    vector<int>::_M_fill_insert();
9998d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola    vector<zed>::_M_fill_insert();
1000f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola  }
1001f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola#pragma GCC visibility pop
1002f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola  // CHECK: declare void @_ZN6test536vectorIjE14_M_fill_insertEv
1003f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola  // CHECK-HIDDEN: declare void @_ZN6test536vectorIjE14_M_fill_insertEv
10048d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  // CHECK: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv
10058d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv
10068d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  // CHECK: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv
10078d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola  // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv
1008f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola}
10095e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola
10105e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindolanamespace test54 {
10115e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  template <class T>
10125e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  struct foo {
10135e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola    static void bar();
10145e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  };
10155e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola#pragma GCC visibility push(hidden)
10165e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  class zed {
10175e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola    zed(const zed &);
10185e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  };
10195e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  void bah() {
10205e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola    foo<zed>::bar();
10215e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  }
10225e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola#pragma GCC visibility pop
10235e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  // CHECK: declare hidden void @_ZN6test543fooINS_3zedEE3barEv
10245e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola  // CHECK-HIDDEN: declare hidden void @_ZN6test543fooINS_3zedEE3barEv
10255e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola}
102623458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola
102723458208b25acd7d2dfa003b029299e30124fe5fRafael Espindolanamespace test55 {
102823458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola  template <class T>
1029b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  struct HIDDEN foo {
103023458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola    static void bar();
103123458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola  };
103223458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola  template <class T> struct foo;
103323458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola  void foobar() {
103423458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola    foo<int>::bar();
103523458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola  }
103623458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola  // CHECK: declare hidden void @_ZN6test553fooIiE3barEv
103723458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola  // CHECK-HIDDEN: declare hidden void @_ZN6test553fooIiE3barEv
103823458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola}
1039d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola
1040d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindolanamespace test56 {
1041d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola  template <class T> struct foo;
1042d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola  template <class T>
1043b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  struct HIDDEN foo {
1044d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola    static void bar();
1045d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola  };
1046d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola  void foobar() {
1047d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola    foo<int>::bar();
1048d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola  }
1049d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola  // CHECK: declare hidden void @_ZN6test563fooIiE3barEv
1050d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola  // CHECK-HIDDEN: declare hidden void @_ZN6test563fooIiE3barEv
1051d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola}
10526b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola
10536b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindolanamespace test57 {
10546b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola#pragma GCC visibility push(hidden)
10556b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  template <class T>
10566b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  struct foo;
10576b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  void bar(foo<int>*);
10586b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  template <class T>
10596b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  struct foo {
10606b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola    static void zed();
10616b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  };
10626b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  void bah() {
10636b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola    foo<int>::zed();
10646b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  }
10656b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola#pragma GCC visibility pop
10666b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  // CHECK: declare hidden void @_ZN6test573fooIiE3zedEv
10676b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola  // CHECK-HIDDEN: declare hidden void @_ZN6test573fooIiE3zedEv
10686b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola}
1069becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola
1070becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindolanamespace test58 {
1071becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola#pragma GCC visibility push(hidden)
1072becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola  struct foo;
1073becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola  template<typename T>
1074b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  struct DEFAULT bar {
1075becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola    static void zed() {
1076becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola    }
1077becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola  };
1078becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola  void bah() {
1079becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola    bar<foo>::zed();
1080becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola  }
1081becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola#pragma GCC visibility pop
108293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv
108393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv
1084becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola}
10856d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola
10866d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindolanamespace test59 {
10876d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola  DEFAULT int f();
10886d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola  HIDDEN int g();
10896d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola  typedef int (*foo)();
10906d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola  template<foo x, foo y>
10916d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola  void test() {}
10926d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola  void use() {
10936d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola    test<&g, &f>();
109493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv
109593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv
10966d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola
10976d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola    test<&f, &g>();
109893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv
109993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv
11006d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola  }
11016d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola}
110298499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola
110398499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindolanamespace test60 {
110498499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola  template<int i>
1105b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  class HIDDEN a {};
110698499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola  template<int i>
1107b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  class DEFAULT b {};
110898499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola  template<template<int> class x, template<int> class y>
110998499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola  void test() {}
111098499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola  void use() {
111198499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola    test<a, b>();
111293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv
111393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv
111498499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola
111598499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola    test<b, a>();
111693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv
111793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin    // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv
111898499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola  }
111998499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola}
1120838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola
1121838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test61 {
1122838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  template <typename T1>
1123838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  struct Class1
1124838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  {
1125838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola    void f1() { f2(); }
1126838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola    inline void f2();
1127838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  };
1128838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  template<>
1129838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  inline void Class1<int>::f2()
1130838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  {
1131838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  }
1132838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  void g(Class1<int> *x) {
1133838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola    x->f1();
1134838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  }
1135838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola}
1136838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test61 {
1137838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  // Just test that we don't crash. Currently we apply this attribute. Current
1138838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  // gcc issues a warning about it being unused since "the type is already
1139838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  // defined". We should probably do the same.
1140b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  template class HIDDEN Class1<int>;
1141838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola}
1142838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola
1143838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test62 {
1144838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  template <typename T1>
1145838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  struct Class1
1146838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  {
1147838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola    void f1() { f2(); }
1148838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola    inline void f2() {}
1149838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  };
1150838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  template<>
1151838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  inline void Class1<int>::f2()
1152838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  {
1153838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  }
1154838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  void g(Class1<int> *x) {
1155838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola    x->f2();
1156838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  }
1157838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola}
1158838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test62 {
1159b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  template class HIDDEN Class1<int>;
1160838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  // Just test that we don't crash. Currently we apply this attribute. Current
1161838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  // gcc issues a warning about it being unused since "the type is already
1162838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola  // defined". We should probably do the same.
1163838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola}
11645a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall
11655a758de93fa2a28a84eb0d918a31d9522472990cJohn McCallnamespace test63 {
11665a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  enum HIDDEN E { E0 };
11675a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  struct A {
11685a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall    template <E> static void foo() {}
11695a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall
11705a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall    template <E> struct B {
11715a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall      static void foo() {}
11725a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall    };
11735a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  };
11745a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall
11755a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  void test() {
11765a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall    A::foo<E0>();
11775a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall    A::B<E0>::foo();
11785a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall  }
117993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test631A3fooILNS_1EE0EEEvv()
118093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test631A1BILNS_1EE0EE3fooEv()
11815a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall}
1182d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
1183d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// Don't ignore the visibility of template arguments just because we
1184d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// explicitly instantiated something.
1185d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace test64 {
1186d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  struct HIDDEN A {};
1187d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template <class P> struct B {
1188d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall    static DEFAULT void foo() {}
1189d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  };
1190d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall
1191d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall  template class B<A>;
119293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr hidden void @_ZN6test641BINS_1AEE3fooEv()
1193d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall}
11943892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall
11953892d022f36ee5bf3be4a55ea01c08d323ef6235John McCallnamespace test65 {
11963892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  class HIDDEN A {};
11973892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  template <class T> struct B {
11983892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    static void func();
11993892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    template <class U> static void funcT1();
12003892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    template <class U> static void funcT2();
12013892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    class Inner {};
12023892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    template <class U> class InnerT {};
12033892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  };
12043892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  template <template <class T> class Temp> struct C {
12053892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    static void foo() {}
12063892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  };
12073892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall
120893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test651BINS_1AEE4funcEv()
12093892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  template <> DEFAULT void B<A>::func() {}
12103892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall
121193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN6test651BINS_1AEE6funcT2IS1_EEvv()
12123892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  template <> template <> DEFAULT void B<A>::funcT2<A>() {}
12133892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall
121493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE6funcT1IiEEvv()
121593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test651BINS_1AEE6funcT1IS1_EEvv()
12163892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  template <> template <class T> DEFAULT void B<A>::funcT1() {}
12173892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall
121893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE5Inner3fooEv()
12193892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  template <> struct DEFAULT B<A>::Inner {
12203892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    static void foo() {}
12213892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  };
12223892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall
122393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE6InnerTIiE3fooEv()
122493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test651BINS_1AEE6InnerTIS1_E3fooEv()
12253892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  template <> template <class U> struct DEFAULT B<A>::InnerT {
12263892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    static void foo() {}
12273892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  };
12283892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall
12293892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  void test() {
12303892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    B<A>::funcT1<int>();
12313892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    B<A>::funcT1<A>();
12323892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    B<A>::Inner::foo();
12333892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    B<A>::InnerT<int>::foo();
12343892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall    B<A>::InnerT<A>::foo();
12353892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  }
12363892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall
12373892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall  template class C<B<A>::InnerT>;
12383892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall}
1239d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola
1240d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindolanamespace test66 {
1241d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  template <typename T>
1242b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  struct DEFAULT barT {
1243d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola    static void zed() {}
1244d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  };
1245d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  class foo;
1246b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  class DEFAULT foo;
1247d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  template struct barT<foo>;
124893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv
124993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv
1250d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola
1251d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  template <int* I>
1252b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  struct DEFAULT barI {
1253d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola    static void zed() {}
1254d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  };
1255d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  extern int I;
1256b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  extern int I DEFAULT;
1257d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  template struct barI<&I>;
125893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv
125993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv
1260d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola
1261d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  typedef void (*fType)(void);
1262d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  template<fType F>
1263b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  struct DEFAULT barF {
1264d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola    static void zed() {}
1265d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  };
1266d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  void F();
1267b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola  void F() DEFAULT;
1268d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola  template struct barF<F>;
126993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv
127093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv
1271d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola}
1272a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola
1273a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindolanamespace test67 {
1274a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola  template <typename T>
1275a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola  struct DEFAULT bar {
1276a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola    static void zed() {}
1277a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola  };
1278a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola
1279a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola  class foo;
1280a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola  class compute {
1281a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola    void f(foo *rootfoo);
1282a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola  };
1283a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola  class DEFAULT foo;
1284a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola
1285a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola  template struct bar<foo>;
128693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define weak_odr void @_ZN6test673barINS_3fooEE3zedEv
128793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test673barINS_3fooEE3zedEv
1288a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola}
128993cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman
129093cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedmannamespace test68 {
129193cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman  class A { public: ~A(); };
129293cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman  class f {
129393cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman  public:
129493cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman    f() {
129593cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman      static A test;
129693cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman    }
129793cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman  };
129893cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman  void g() {
129993cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman    f a;
130093cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman  }
130193cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman  // Check lines at top of file.
130293cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman}
1303525f2f5437929a324a37697f2934fda78931c66aBill Wendling
1304525f2f5437929a324a37697f2934fda78931c66aBill Wendlingnamespace test69 {
1305525f2f5437929a324a37697f2934fda78931c66aBill Wendling  // PR18174
1306525f2f5437929a324a37697f2934fda78931c66aBill Wendling  namespace foo {
1307525f2f5437929a324a37697f2934fda78931c66aBill Wendling    void f();
1308525f2f5437929a324a37697f2934fda78931c66aBill Wendling  }
1309525f2f5437929a324a37697f2934fda78931c66aBill Wendling  namespace foo {
1310525f2f5437929a324a37697f2934fda78931c66aBill Wendling    void f() {};
1311525f2f5437929a324a37697f2934fda78931c66aBill Wendling  }
1312525f2f5437929a324a37697f2934fda78931c66aBill Wendling  namespace foo __attribute__((visibility("hidden"))) {
1313525f2f5437929a324a37697f2934fda78931c66aBill Wendling  }
1314525f2f5437929a324a37697f2934fda78931c66aBill Wendling  // CHECK-LABEL: define void @_ZN6test693foo1fEv
1315525f2f5437929a324a37697f2934fda78931c66aBill Wendling  // CHECK-HIDDEN-LABEL: define hidden void @_ZN6test693foo1fEv
1316525f2f5437929a324a37697f2934fda78931c66aBill Wendling}
1317