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