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 138112c967bd5c862a0f5d7913aa06700c048807db8John McCall// CHECK: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr global 139112c967bd5c862a0f5d7913aa06700c048807db8John McCall// CHECK: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr global i64 140112c967bd5c862a0f5d7913aa06700c048807db8John McCall// CHECK-HIDDEN: @_ZZN6Test193fooIiEEvvE1a = linkonce_odr hidden global 141112c967bd5c862a0f5d7913aa06700c048807db8John McCall// CHECK-HIDDEN: @_ZGVZN6Test193fooIiEEvvE1a = linkonce_odr hidden global i64 14293cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman// CHECK: @_ZZN6test681fC1EvE4test = linkonce_odr global 14393cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman// CHECK: @_ZGVZN6test681fC1EvE4test = linkonce_odr global 14493cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman// CHECK-HIDDEN: @_ZZN6test681fC1EvE4test = linkonce_odr hidden global 14593cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman// CHECK-HIDDEN: @_ZGVZN6test681fC1EvE4test = linkonce_odr hidden global 146cd3ac4bd96cb19af5117eded84bfe8320c5d787eRafael Espindola// CHECK-HIDDEN: @_ZTVN6Test161AIcEE = external unnamed_addr constant 147bf1c5aeadc5d4bb7fca5b0ee12208a94971f8492Peter Collingbourne// CHECK-HIDDEN: @_ZTTN6Test161AIcEE = external unnamed_addr constant 148f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: @_ZTVN5Test63fooE = linkonce_odr hidden unnamed_addr constant 1491fb0caaa7bef765b85972274e3b434af2572c141John McCall 15039de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test1 { 15193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define hidden void @_ZN5Test11fEv 15239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void HIDDEN f() { } 15339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 15439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 15539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 15639de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test2 { 15739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson struct HIDDEN A { 15839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void f(); 15939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson }; 16039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 16139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // A::f is a member function of a hidden class. 16293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define hidden void @_ZN5Test21A1fEv 16339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void A::f() { } 16439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 16539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 16639de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test3 { 16739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson struct HIDDEN A { 16839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson struct B { 16939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void f(); 17039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson }; 17139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson }; 17239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 17339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // B is a nested class where its parent class is hidden. 17493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define hidden void @_ZN5Test31A1B1fEv 17539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void A::B::f() { } 17639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 17739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 17839de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test4 HIDDEN { 17939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson int VariableInHiddenNamespace = 10; 18039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 18139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // Test4::g is in a hidden namespace. 18293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define hidden void @_ZN5Test41gEv 18339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void g() { } 18439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 18539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson struct DEFAULT A { 18639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void f(); 18739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson }; 18839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 18939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // A has default visibility. 19093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5Test41A1fEv 19139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void A::f() { } 19239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 19339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 19439de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test5 { 19539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 19639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson namespace NS HIDDEN { 19739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // f is in NS which is hidden. 19893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define hidden void @_ZN5Test52NS1fEv() 19939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void f() { } 20039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson } 20139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 20239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson namespace NS { 20339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // g is in NS, but this NS decl is not hidden. 20493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN5Test52NS1gEv 20539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void g() { } 20639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson } 20739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 208c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor 209c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor// <rdar://problem/8091955> 210c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregornamespace Test6 { 211c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor struct HIDDEN foo { 212c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor foo() { } 213c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor void bonk(); 214c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor virtual void bar() = 0; 215c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor 216c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor virtual void zonk() {} 217c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor }; 218c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor 219c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor struct barc : public foo { 220c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor barc(); 221c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor virtual void bar(); 222c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor }; 223c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor 224c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor barc::barc() {} 225c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor} 2261fb0caaa7bef765b85972274e3b434af2572c141John McCall 2271fb0caaa7bef765b85972274e3b434af2572c141John McCallnamespace Test7 { 2281fb0caaa7bef765b85972274e3b434af2572c141John McCall class HIDDEN A {}; 2291fb0caaa7bef765b85972274e3b434af2572c141John McCall A a; // top of file 2301fb0caaa7bef765b85972274e3b434af2572c141John McCall 2311fb0caaa7bef765b85972274e3b434af2572c141John McCall template <A&> struct Aref { 2321fb0caaa7bef765b85972274e3b434af2572c141John McCall static void foo() {} 2331fb0caaa7bef765b85972274e3b434af2572c141John McCall }; 2341fb0caaa7bef765b85972274e3b434af2572c141John McCall 2351fb0caaa7bef765b85972274e3b434af2572c141John McCall class B : public A {}; 2361fb0caaa7bef765b85972274e3b434af2572c141John McCall B b; // top of file 2371fb0caaa7bef765b85972274e3b434af2572c141John McCall 23893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN5Test74ArefILZNS_1aEEE3fooEv() 2391fb0caaa7bef765b85972274e3b434af2572c141John McCall void test() { 2401fb0caaa7bef765b85972274e3b434af2572c141John McCall Aref<a>::foo(); 2411fb0caaa7bef765b85972274e3b434af2572c141John McCall } 2421fb0caaa7bef765b85972274e3b434af2572c141John McCall} 2431fb0caaa7bef765b85972274e3b434af2572c141John McCall 2441fb0caaa7bef765b85972274e3b434af2572c141John McCallnamespace Test8 { 2451fb0caaa7bef765b85972274e3b434af2572c141John McCall void foo(); 2461fb0caaa7bef765b85972274e3b434af2572c141John McCall void bar() {} 24793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define hidden void @_ZN5Test83barEv() 2481fb0caaa7bef765b85972274e3b434af2572c141John McCall // CHECK-HIDDEN: declare void @_ZN5Test83fooEv() 2491fb0caaa7bef765b85972274e3b434af2572c141John McCall 2501fb0caaa7bef765b85972274e3b434af2572c141John McCall void test() { 2511fb0caaa7bef765b85972274e3b434af2572c141John McCall foo(); 2521fb0caaa7bef765b85972274e3b434af2572c141John McCall bar(); 2531fb0caaa7bef765b85972274e3b434af2572c141John McCall } 2541fb0caaa7bef765b85972274e3b434af2572c141John McCall} 255ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall 256ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// PR8457 257ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCallnamespace Test9 { 258ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall extern "C" { 259ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall struct A { int field; }; 260ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall void DEFAULT test9_fun(struct A *a) { } 261ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall struct A DEFAULT test9_var; // above 262ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall } 26393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @test9_fun( 26493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define void @test9_fun( 265ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall 266ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall void test() { 267ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall A a = test9_var; 268ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall test9_fun(&a); 269ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall } 270ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall} 27167fa6d5ea630c800c3c96e129129aba93d1487c2John McCall 27267fa6d5ea630c800c3c96e129129aba93d1487c2John McCall// PR8478 27367fa6d5ea630c800c3c96e129129aba93d1487c2John McCallnamespace Test10 { 27467fa6d5ea630c800c3c96e129129aba93d1487c2John McCall struct A; 27567fa6d5ea630c800c3c96e129129aba93d1487c2John McCall 276fc038e9ef8ed262724f42597ca5c844de97b1202Eli Friedman class DEFAULT B { 27767fa6d5ea630c800c3c96e129129aba93d1487c2John McCall void foo(A*); 27867fa6d5ea630c800c3c96e129129aba93d1487c2John McCall }; 27967fa6d5ea630c800c3c96e129129aba93d1487c2John McCall 28093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6Test101B3fooEPNS_1AE( 28193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define void @_ZN6Test101B3fooEPNS_1AE( 28267fa6d5ea630c800c3c96e129129aba93d1487c2John McCall void B::foo(A*) {} 28367fa6d5ea630c800c3c96e129129aba93d1487c2John McCall} 2840df9587ab011c12968fcbe3518666b2117afe350John McCall 2850df9587ab011c12968fcbe3518666b2117afe350John McCall// PR8492 2860df9587ab011c12968fcbe3518666b2117afe350John McCallnamespace Test11 { 2870df9587ab011c12968fcbe3518666b2117afe350John McCall struct A { 2880df9587ab011c12968fcbe3518666b2117afe350John McCall void foo() {} 2890df9587ab011c12968fcbe3518666b2117afe350John McCall void DEFAULT bar() {} 2900df9587ab011c12968fcbe3518666b2117afe350John McCall }; 2910df9587ab011c12968fcbe3518666b2117afe350John McCall 2920df9587ab011c12968fcbe3518666b2117afe350John McCall void test() { 2930df9587ab011c12968fcbe3518666b2117afe350John McCall A a; 2940df9587ab011c12968fcbe3518666b2117afe350John McCall a.foo(); 2950df9587ab011c12968fcbe3518666b2117afe350John McCall a.bar(); 2960df9587ab011c12968fcbe3518666b2117afe350John McCall } 2970df9587ab011c12968fcbe3518666b2117afe350John McCall 29893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6Test111A3fooEv( 29993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6Test111A3barEv( 30093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6Test111A3fooEv( 30193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr void @_ZN6Test111A3barEv( 3020df9587ab011c12968fcbe3518666b2117afe350John McCall} 303110e8e56af30363072c140285961592b0107f789John McCall 304110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file. 305110e8e56af30363072c140285961592b0107f789John McCallnamespace Test12 { 306110e8e56af30363072c140285961592b0107f789John McCall struct A { 307110e8e56af30363072c140285961592b0107f789John McCall // This is hidden in all cases: the explicit attribute takes 308110e8e56af30363072c140285961592b0107f789John McCall // priority over -fvisibility on the parent. 309110e8e56af30363072c140285961592b0107f789John McCall static int hidden HIDDEN; 310110e8e56af30363072c140285961592b0107f789John McCall 311110e8e56af30363072c140285961592b0107f789John McCall // This is default in all cases because it's only a declaration. 312110e8e56af30363072c140285961592b0107f789John McCall static int visible; 313110e8e56af30363072c140285961592b0107f789John McCall }; 314110e8e56af30363072c140285961592b0107f789John McCall 315110e8e56af30363072c140285961592b0107f789John McCall void test() { 316110e8e56af30363072c140285961592b0107f789John McCall A::hidden = 0; 317110e8e56af30363072c140285961592b0107f789John McCall A::visible = 0; 318110e8e56af30363072c140285961592b0107f789John McCall } 319110e8e56af30363072c140285961592b0107f789John McCall} 320110e8e56af30363072c140285961592b0107f789John McCall 321110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file. 322110e8e56af30363072c140285961592b0107f789John McCallnamespace Test13 { 323110e8e56af30363072c140285961592b0107f789John McCall struct HIDDEN A {}; 324110e8e56af30363072c140285961592b0107f789John McCall 325110e8e56af30363072c140285961592b0107f789John McCall // Should be hidden in all cases. 326110e8e56af30363072c140285961592b0107f789John McCall struct B { 327110e8e56af30363072c140285961592b0107f789John McCall static A a; 328110e8e56af30363072c140285961592b0107f789John McCall }; 329110e8e56af30363072c140285961592b0107f789John McCall A B::a; 330110e8e56af30363072c140285961592b0107f789John McCall 331110e8e56af30363072c140285961592b0107f789John McCall // Should be default in all cases. 332110e8e56af30363072c140285961592b0107f789John McCall struct DEFAULT C { 333110e8e56af30363072c140285961592b0107f789John McCall static A a; 334110e8e56af30363072c140285961592b0107f789John McCall }; 335110e8e56af30363072c140285961592b0107f789John McCall A C::a; 336110e8e56af30363072c140285961592b0107f789John McCall}; 337110e8e56af30363072c140285961592b0107f789John McCall 338110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file. 339110e8e56af30363072c140285961592b0107f789John McCallnamespace Test14 { 340110e8e56af30363072c140285961592b0107f789John McCall // Neither the visibility of the type nor -fvisibility=hidden should 341110e8e56af30363072c140285961592b0107f789John McCall // apply to declarations. 342110e8e56af30363072c140285961592b0107f789John McCall extern struct A *var; 343110e8e56af30363072c140285961592b0107f789John McCall 344110e8e56af30363072c140285961592b0107f789John McCall struct A *test() { return var; } 345110e8e56af30363072c140285961592b0107f789John McCall} 346ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall 347ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall// rdar://problem/8613093 348ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCallnamespace Test15 { 349ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall struct A {}; 350ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall template <class T> struct Temp { 351ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall struct Inner { 352ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall static char buffer[0]; 353ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall }; 354ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall }; 355ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall 356ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall char *test() { 357ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall return Temp<A>::Inner::buffer; 358ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall } 359ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall} 360af14603ca61757cf4361b583b45639a04c57e651John McCall 361af14603ca61757cf4361b583b45639a04c57e651John McCallnamespace Test16 { 362af14603ca61757cf4361b583b45639a04c57e651John McCall struct Base1 { virtual void foo(); }; 363af14603ca61757cf4361b583b45639a04c57e651John McCall struct Base2 : virtual Base1 { virtual void foo(); }; 364af14603ca61757cf4361b583b45639a04c57e651John McCall template <class T> struct A : virtual Base1, Base2 { 365af14603ca61757cf4361b583b45639a04c57e651John McCall virtual void foo(); 366af14603ca61757cf4361b583b45639a04c57e651John McCall }; 367af14603ca61757cf4361b583b45639a04c57e651John McCall extern template struct A<char>; 368af14603ca61757cf4361b583b45639a04c57e651John McCall 369af14603ca61757cf4361b583b45639a04c57e651John McCall void test() { 370af14603ca61757cf4361b583b45639a04c57e651John McCall A<char> a; 371af14603ca61757cf4361b583b45639a04c57e651John McCall a.foo(); 372af14603ca61757cf4361b583b45639a04c57e651John McCall } 373af14603ca61757cf4361b583b45639a04c57e651John McCall} 3743698748400478880d2a146ef9eaa111cd0e60522John McCall 3753698748400478880d2a146ef9eaa111cd0e60522John McCallnamespace Test17 { 3763698748400478880d2a146ef9eaa111cd0e60522John McCall struct HIDDEN A { 3773698748400478880d2a146ef9eaa111cd0e60522John McCall static void foo(); 3783698748400478880d2a146ef9eaa111cd0e60522John McCall static void DEFAULT bar(); 3793698748400478880d2a146ef9eaa111cd0e60522John McCall static void HIDDEN baz(); 3803698748400478880d2a146ef9eaa111cd0e60522John McCall 3813698748400478880d2a146ef9eaa111cd0e60522John McCall struct DEFAULT B { 3823698748400478880d2a146ef9eaa111cd0e60522John McCall static void foo(); 3833698748400478880d2a146ef9eaa111cd0e60522John McCall static void DEFAULT bar(); 3843698748400478880d2a146ef9eaa111cd0e60522John McCall static void HIDDEN baz(); 3853698748400478880d2a146ef9eaa111cd0e60522John McCall }; 3863698748400478880d2a146ef9eaa111cd0e60522John McCall }; 3873698748400478880d2a146ef9eaa111cd0e60522John McCall 3883698748400478880d2a146ef9eaa111cd0e60522John McCall void test() { 3893698748400478880d2a146ef9eaa111cd0e60522John McCall A::foo(); 3903698748400478880d2a146ef9eaa111cd0e60522John McCall A::bar(); 3913698748400478880d2a146ef9eaa111cd0e60522John McCall A::baz(); 3923698748400478880d2a146ef9eaa111cd0e60522John McCall A::B::foo(); 3933698748400478880d2a146ef9eaa111cd0e60522John McCall A::B::bar(); 3943698748400478880d2a146ef9eaa111cd0e60522John McCall A::B::baz(); 3953698748400478880d2a146ef9eaa111cd0e60522John McCall } 3963698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test171A3fooEv() 3973698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test171A3barEv() 3983698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test171A3bazEv() 3993698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test171A1B3fooEv() 4003698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test171A1B3barEv() 4013698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test171A1B3bazEv() 4023698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3fooEv() 4033698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test171A3barEv() 4043698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3bazEv() 4053698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test171A1B3fooEv() 4063698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test171A1B3barEv() 4073698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test171A1B3bazEv() 4083698748400478880d2a146ef9eaa111cd0e60522John McCall} 4093698748400478880d2a146ef9eaa111cd0e60522John McCall 4103698748400478880d2a146ef9eaa111cd0e60522John McCallnamespace Test18 { 4113698748400478880d2a146ef9eaa111cd0e60522John McCall template <class T> struct HIDDEN A { 4123698748400478880d2a146ef9eaa111cd0e60522John McCall static void foo(); 4133698748400478880d2a146ef9eaa111cd0e60522John McCall static void DEFAULT bar(); 4143698748400478880d2a146ef9eaa111cd0e60522John McCall static void HIDDEN baz(); 4153698748400478880d2a146ef9eaa111cd0e60522John McCall 4163698748400478880d2a146ef9eaa111cd0e60522John McCall struct DEFAULT B { 4173698748400478880d2a146ef9eaa111cd0e60522John McCall static void foo(); 4183698748400478880d2a146ef9eaa111cd0e60522John McCall static void DEFAULT bar(); 4193698748400478880d2a146ef9eaa111cd0e60522John McCall static void HIDDEN baz(); 4203698748400478880d2a146ef9eaa111cd0e60522John McCall }; 4213698748400478880d2a146ef9eaa111cd0e60522John McCall }; 4223698748400478880d2a146ef9eaa111cd0e60522John McCall struct HIDDEN H; 4233698748400478880d2a146ef9eaa111cd0e60522John McCall 4243698748400478880d2a146ef9eaa111cd0e60522John McCall void test() { 4253698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::foo(); 4263698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::bar(); 4273698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::baz(); 4283698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::B::foo(); 4293698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::B::bar(); 4303698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::B::baz(); 4313698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::foo(); 4323698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::bar(); 4333698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::baz(); 4343698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::B::foo(); 4353698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::B::bar(); 4363698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::B::baz(); 4373698748400478880d2a146ef9eaa111cd0e60522John McCall } 4383698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AIiE3fooEv() 4393698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test181AIiE3barEv() 4403698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AIiE3bazEv() 4413698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test181AIiE1B3fooEv() 4423698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test181AIiE1B3barEv() 4433698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AIiE1B3bazEv() 4443698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3fooEv() 4453698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3barEv() 4463698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3bazEv() 4473698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv() 4483698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv() 4493698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv() 4503698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3fooEv() 4513698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test181AIiE3barEv() 4523698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3bazEv() 4533698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3fooEv() 4543698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3barEv() 4553698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE1B3bazEv() 4563698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3fooEv() 4573698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3barEv() 4583698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3bazEv() 4593698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv() 4603698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv() 4613698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv() 4623698748400478880d2a146ef9eaa111cd0e60522John McCall} 463112c967bd5c862a0f5d7913aa06700c048807db8John McCall 464112c967bd5c862a0f5d7913aa06700c048807db8John McCallnamespace Test19 { 465112c967bd5c862a0f5d7913aa06700c048807db8John McCall struct A { A(); ~A(); }; 466112c967bd5c862a0f5d7913aa06700c048807db8John McCall 467112c967bd5c862a0f5d7913aa06700c048807db8John McCall // Tested at top of file. 468112c967bd5c862a0f5d7913aa06700c048807db8John McCall template <class T> void foo() { 469112c967bd5c862a0f5d7913aa06700c048807db8John McCall static A a; 470112c967bd5c862a0f5d7913aa06700c048807db8John McCall } 471112c967bd5c862a0f5d7913aa06700c048807db8John McCall 472112c967bd5c862a0f5d7913aa06700c048807db8John McCall void test() { 473112c967bd5c862a0f5d7913aa06700c048807db8John McCall foo<int>(); 474112c967bd5c862a0f5d7913aa06700c048807db8John McCall } 475112c967bd5c862a0f5d7913aa06700c048807db8John McCall} 4767f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4777f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall// Various things with class template specializations. 4787f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCallnamespace Test20 { 4797f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall template <unsigned> struct HIDDEN A {}; 4807f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4817f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // An explicit specialization inherits the explicit visibility of 4827f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // the template. 4837f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall template <> struct A<0> { 4847f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test0(); 4857f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test1(); 4867f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall }; 4877f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 48893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define hidden void @_ZN6Test201AILj0EE5test0Ev() 4897f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void A<0>::test0() {} 4907f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4917f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // CHECK: declare hidden void @_ZN6Test201AILj0EE5test1Ev() 4927f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void test1() { 4937f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall A<0>::test1(); 4947f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall } 4957f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4967f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // ...unless that's explicitly overridden. 4977f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall template <> struct DEFAULT A<1> { 4987f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test2(); 4997f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test3(); 5007f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall }; 5017f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 50293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6Test201AILj1EE5test2Ev() 5037f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void A<1>::test2() {} 5047f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 5057f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // CHECK: declare void @_ZN6Test201AILj1EE5test3Ev() 5067f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void test3() { 5077f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall A<1>::test3(); 5087f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall } 5097f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 5107f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // <rdar://problem/8778497> 5117f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // But we should assume that an unknown specialization has the 5127f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // explicit visibility settings of the template. 5137f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall template <class T> struct B { 5147f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test4() {} 5157f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test5(); 5167f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall }; 5177f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 51893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6Test201BINS_1AILj2EEEE5test4Ev() 5197f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void test4() { 5207f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall B<A<2> >::test4(); 5217f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall } 5227f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 523093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola // CHECK: declare hidden void @_ZN6Test201BINS_1AILj2EEEE5test5Ev() 5247f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void test5() { 5257f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall B<A<2> >::test5(); 5267f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall } 5277f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall} 5281a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall 5291a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall// PR9371 5301a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCallnamespace test21 { 5311a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall enum En { en }; 5321a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall template<En> struct A { 533b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola DEFAULT void foo() {} 5341a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall }; 5351a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall 53693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test211AILNS_2EnE0EE3fooEv( 5371a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall template void A<en>::foo(); 5381a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall} 5396ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall 5406ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall// rdar://problem/9616154 5416ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall// Visibility on explicit specializations should take precedence. 5426ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCallnamespace test22 { 5436ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall class A1 {}; 5446ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall class A2 {}; 5456ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall 5466ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall template <class T> struct B {}; 5476ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall template <> struct DEFAULT B<A1> { 5486ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall static void foo(); 5496ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall static void bar() {} 5506ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall }; 5516ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall template <> struct B<A2> { 5526ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall static void foo(); 5536ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall static void bar() {} 5546ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall }; 5556ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall 5566ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall void test() { 5576ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall B<A1>::foo(); 5586ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall B<A1>::bar(); 5596ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall B<A2>::foo(); 5606ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall B<A2>::bar(); 5616ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall } 5626ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK: declare void @_ZN6test221BINS_2A1EE3fooEv() 56393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv() 5646ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK: declare void @_ZN6test221BINS_2A2EE3fooEv() 56593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6test221BINS_2A2EE3barEv() 5666ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A1EE3fooEv() 56793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv() 5686ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A2EE3fooEv() 56993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test221BINS_2A2EE3barEv() 5706ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall} 57171cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola 57271cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindolanamespace PR10113 { 573b5d763d87c8ffb969b4d4a59ed98a2e3516e0850Rafael Espindola namespace foo DEFAULT { 57471cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola template<typename T> 57571cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola class bar { 57671cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola void zed() {} 57771cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola }; 57871cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola } 57971cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola template class foo::bar<char>; 58093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv 58193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv 582093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola 583093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola struct zed { 584093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola }; 585093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template class foo::bar<zed>; 58693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv 58793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN7PR101133foo3barINS_3zedEE3zedEv 58871cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola} 5890257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola 5900257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindolanamespace PR11690 { 5910257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola template<class T> struct Class { 5920257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola void size() const { 5930257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola } 5940257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola }; 5950257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola template class DEFAULT Class<char>; 59693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv 59793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv 598256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola 599256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola template<class T> void Method() {} 600093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template DEFAULT void Method<char>(); 60193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN7PR116906MethodIcEEvv 60293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN7PR116906MethodIcEEvv 6030257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola} 604093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola 605093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindolanamespace PR11690_2 { 606093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola namespace foo DEFAULT { 607093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola class bar; 608093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template<typename T1, typename T2 = bar> 609093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola class zed { 610093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola void bar() { 611093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola } 612093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola }; 613093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola } 614093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola struct baz { 615093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola }; 616093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template class foo::zed<baz>; 61793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv 61893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv 619093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola} 620860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 621860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test23 { 622860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // Having a template argument that is explicitly visible should not make 623860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // the template instantiation visible. 624860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template <typename T> 625860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola struct X { 626860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola static void f() { 627860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 628860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola }; 629860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 630860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class DEFAULT A; 631860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 632860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void g() { 633860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola X<A> y; 634860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola y.f(); 635860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 63693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6test231XINS_1AEE1fEv 63793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test231XINS_1AEE1fEv 638860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 639860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 640860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace PR12001 { 641860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template <typename P1> 642860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void Bind(const P1& p1) { 643860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 644860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 645860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class DEFAULT Version { }; 646860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 647860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void f() { 648860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola Bind(Version()); 649860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 65093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN7PR120014BindINS_7VersionEEEvRKT_ 65193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN7PR120014BindINS_7VersionEEEvRKT_ 652860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 653860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 654860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test24 { 655860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class DEFAULT A { }; 656860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 657860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola struct S { 658860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template <typename T> 659860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void mem() {} 660860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola }; 661860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 662860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void test() { 663860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola S s; 664860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola s.mem<A>(); 665860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 66693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6test241S3memINS_1AEEEvv 66793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test241S3memINS_1AEEEvv 668860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 669860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 670860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test26 { 671860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template<typename T> 672860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class C { 673b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola DEFAULT void f(); 674860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola }; 675860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 676860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template<> 677860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void C<int>::f() { } 678860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 67993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test261CIiE1fEv 68093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define void @_ZN6test261CIiE1fEv 681860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 682bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola 683bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindolanamespace test31 { 684bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola struct A { 685bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola struct HIDDEN B { 686bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola static void DEFAULT baz(); 687bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola }; 688bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola }; 689bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola void f() { 690bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola A::B::baz(); 691bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola } 692bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola // CHECK: declare void @_ZN6test311A1B3bazEv() 693bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola // CHECK-HIDDEN: declare void @_ZN6test311A1B3bazEv() 694bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola} 695a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola 696a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindolanamespace test32 { 697a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola struct HIDDEN A { 698a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola struct DEFAULT B { 699a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola void DEFAULT baz(); 700a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola }; 701a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola }; 702a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola void A::B::baz() { 703a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola } 70493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test321A1B3bazEv 70593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define void @_ZN6test321A1B3bazEv 706a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola} 707f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola 708f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindolanamespace test33 { 709f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola template<typename T> 710f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola class foo { 711f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola void bar() {} 712f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola }; 71371776efce59509b127a02f385c3df9686b852d62Rafael Espindola struct HIDDEN zed { 714f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola }; 71571776efce59509b127a02f385c3df9686b852d62Rafael Espindola template class DEFAULT foo<zed>; 71693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv 71793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv 718f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola} 719a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola 720a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindolanamespace test34 { 721a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola struct foo { 722a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola }; 723a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola template<class T> 724a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola void bar() {} 725a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola template DEFAULT void bar<foo>(); 72693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test343barINS_3fooEEEvv 72793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test343barINS_3fooEEEvv 728a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola} 729546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola 730546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindolanamespace test35 { 731546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // This is a really ugly testcase. GCC propagates the DEFAULT in zed's 7325a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // definition. It's not really clear what we can do here, because we 7335a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // produce the symbols before even seeing the DEFAULT definition of zed. 7345a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // FIXME: Maybe the best thing to do here is error? It's certainly hard 7355a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // to argue that this ought to be valid. 736546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola template<typename T> 737546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola struct DEFAULT foo { 738546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola void bar() {} 739546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola }; 740546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola class zed; 741546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola template class foo<zed>; 742546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola class DEFAULT zed { 743546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola }; 74493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv 74593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test353fooINS_3zedEE3barEv 746546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola} 747923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola 748923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindolanamespace test36 { 749923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola template<typename T1, typename T2> 750923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola class foo { 751923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola void bar() {} 752923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola }; 753923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola class DEFAULT S1 {}; 754923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola struct HIDDEN S2 {}; 755923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola template class foo<S1, S2>; 75693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv 75793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv 758923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola} 75931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 76031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test37 { 76131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola struct HIDDEN foo { 76231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 76331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template<class T> 76431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola DEFAULT void bar() {} 76531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template DEFAULT void bar<foo>(); 76693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test373barINS_3fooEEEvv 76793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test373barINS_3fooEEEvv 76831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola} 76931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 77031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test38 { 77131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template<typename T> 77231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola class DEFAULT foo { 77331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola void bar() {} 77431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 77531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola struct HIDDEN zed { 77631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 77731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template class foo<zed>; 77893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv 77993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv 78031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola} 78131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 78231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test39 { 78331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola class DEFAULT default_t; 78431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola class HIDDEN hidden_t; 78531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template <class T> class A { 78631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template <class U> class B { 78731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola HIDDEN void hidden() {} 78831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola void noattr() {} 78931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template <class V> void temp() {} 79031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 79131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 79231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template class DEFAULT A<hidden_t>; 79331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template class DEFAULT A<hidden_t>::B<hidden_t>; 79431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template void A<hidden_t>::B<hidden_t>::temp<default_t>(); 79531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template void A<hidden_t>::B<hidden_t>::temp<hidden_t>(); 79631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 79793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv 79893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv 79993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv 80031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 80131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // GCC produces a default for this one. Why? 80293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv 80331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 80493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv 80593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv 80693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv 80731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 80831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // GCC produces a default for this one. Why? 80993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv 81031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola} 8110b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola 8120b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindolanamespace test42 { 8130b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola struct HIDDEN foo { 8140b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola }; 8150b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola template <class P> 8160b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola struct bar { 8170b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola }; 8180b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola template <> 8190b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola struct HIDDEN bar<foo> { 8200b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola DEFAULT static void zed(); 8210b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola }; 8220b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola void bar<foo>::zed() { 8230b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola } 82493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test423barINS_3fooEE3zedEv 82593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define void @_ZN6test423barINS_3fooEE3zedEv 8260b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola} 827cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola 828cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindolanamespace test43 { 829cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola struct HIDDEN foo { 830cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola }; 831cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola template <class P> 832cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola void bar() { 833cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola } 834cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola template <> 835cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola DEFAULT void bar<foo>() { 836cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola } 83793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test433barINS_3fooEEEvv 83893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define void @_ZN6test433barINS_3fooEEEvv 839cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola} 840ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola 841ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindolanamespace test44 { 842ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola template <typename T> 843ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola struct foo { 844ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola foo() {} 845ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola }; 846ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola namespace { 847ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola struct bar; 848ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola } 849ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola template struct DEFAULT foo<bar>; 850ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola foo<bar> x; 85193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev 85293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev 853ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola} 85420831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola 85520831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindolanamespace test45 { 85620831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola template <typename T> 85720831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola struct foo { 85820831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola template <typename T2> 85920831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola struct bar { 86020831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola bar() {}; 86120831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola }; 86220831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola }; 86320831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola namespace { 86420831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola struct zed; 86520831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola } 86620831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola template struct DEFAULT foo<int>::bar<zed>; 86720831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola foo<int>::bar<zed> x; 86893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev 86993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev 87020831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola} 8719db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola 8729db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindolanamespace test46 { 8739db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola template <typename T> 8749db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola void foo() { 8759db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola } 8769db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola namespace { 8779db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola struct bar; 8789db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola } 8799db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola template DEFAULT void foo<bar>(); 8809db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola void zed() { 8819db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola foo<bar>(); 8829db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola } 88393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv 88493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv 8859db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola} 88641be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola 88741be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindolanamespace test47 { 88841be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola struct foo { 88941be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola template <typename T> 89041be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola static void bar() { 89141be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola } 89241be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola }; 89341be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola namespace { 89441be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola struct zed; 89541be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola } 896b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola template DEFAULT void foo::bar<zed>(); 89741be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola void baz() { 89841be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola foo::bar<zed>(); 89941be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola } 90093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv 90193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv 90241be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola} 903edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 904edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test49 { 905edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // Test that we use the visibility of struct foo when instantiating the 906edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // template. Note that is a case where we disagree with gcc, it produces 907edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // a default symbol. 908edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 909edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct HIDDEN foo { 910edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 911edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 912edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola DEFAULT foo x; 913edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 914edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct bar { 915edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template<foo *z> 916edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void zed() { 917edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 918edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 919edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 920edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template void bar::zed<&x>(); 92193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv 92293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv 923edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola} 924edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 925edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test50 { 926edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // Test that we use the visibility of struct foo when instantiating the 927edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // template. Note that is a case where we disagree with gcc, it produces 928edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // a default symbol. 929edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 930edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct HIDDEN foo { 931edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 932edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola DEFAULT foo x; 933edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template<foo *z> 934edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct DEFAULT bar { 935edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void zed() { 936edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 937edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 938edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template void bar<&x>::zed(); 93993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv 94093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv 941edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola} 942edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 943edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test51 { 944edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // Test that we use the visibility of struct foo when instantiating the 945edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // template. Note that is a case where we disagree with gcc, it produces 946edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // a default symbol. 947edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 948edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct HIDDEN foo { 949edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 950edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola DEFAULT foo x; 951edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template<foo *z> 952edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void DEFAULT zed() { 953edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 954edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template void zed<&x>(); 95593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv 95693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv 957edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola} 958edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 959edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test52 { 960edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // Test that we use the linkage of struct foo when instantiating the 961edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // template. Note that is a case where we disagree with gcc, it produces 962edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // an external symbol. 963edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 964edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola namespace { 965edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct foo { 966edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 967edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 968edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template<foo *x> 969edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void zed() { 970edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 971edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void f() { 972edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola zed<nullptr>(); 973edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 97493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv 97593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv 976edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola} 977f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola 978f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindolanamespace test53 { 979f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola template<typename _Tp > struct vector { 980f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola static void _M_fill_insert(); 981f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola }; 982f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola#pragma GCC visibility push(hidden) 9838d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // GCC doesn't seem to use the visibility of enums at all, we do. 9848d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola enum zed {v1}; 9858d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola 9868d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // GCC fails to mark this specialization hidden, we mark it. 9878d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola template<> 9888d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola struct vector<int> { 9898d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola static void _M_fill_insert(); 9908d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola }; 991f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola void foo() { 992f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola vector<unsigned>::_M_fill_insert(); 9938d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola vector<int>::_M_fill_insert(); 9948d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola vector<zed>::_M_fill_insert(); 995f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola } 996f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola#pragma GCC visibility pop 997f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola // CHECK: declare void @_ZN6test536vectorIjE14_M_fill_insertEv 998f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola // CHECK-HIDDEN: declare void @_ZN6test536vectorIjE14_M_fill_insertEv 9998d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // CHECK: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv 10008d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv 10018d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // CHECK: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv 10028d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv 1003f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola} 10045e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola 10055e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindolanamespace test54 { 10065e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola template <class T> 10075e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola struct foo { 10085e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola static void bar(); 10095e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola }; 10105e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola#pragma GCC visibility push(hidden) 10115e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola class zed { 10125e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola zed(const zed &); 10135e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola }; 10145e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola void bah() { 10155e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola foo<zed>::bar(); 10165e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola } 10175e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola#pragma GCC visibility pop 10185e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola // CHECK: declare hidden void @_ZN6test543fooINS_3zedEE3barEv 10195e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test543fooINS_3zedEE3barEv 10205e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola} 102123458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola 102223458208b25acd7d2dfa003b029299e30124fe5fRafael Espindolanamespace test55 { 102323458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola template <class T> 1024b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola struct HIDDEN foo { 102523458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola static void bar(); 102623458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola }; 102723458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola template <class T> struct foo; 102823458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola void foobar() { 102923458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola foo<int>::bar(); 103023458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola } 103123458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola // CHECK: declare hidden void @_ZN6test553fooIiE3barEv 103223458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test553fooIiE3barEv 103323458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola} 1034d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola 1035d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindolanamespace test56 { 1036d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola template <class T> struct foo; 1037d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola template <class T> 1038b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola struct HIDDEN foo { 1039d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola static void bar(); 1040d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola }; 1041d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola void foobar() { 1042d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola foo<int>::bar(); 1043d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola } 1044d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola // CHECK: declare hidden void @_ZN6test563fooIiE3barEv 1045d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test563fooIiE3barEv 1046d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola} 10476b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola 10486b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindolanamespace test57 { 10496b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola#pragma GCC visibility push(hidden) 10506b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola template <class T> 10516b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola struct foo; 10526b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola void bar(foo<int>*); 10536b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola template <class T> 10546b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola struct foo { 10556b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola static void zed(); 10566b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola }; 10576b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola void bah() { 10586b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola foo<int>::zed(); 10596b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola } 10606b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola#pragma GCC visibility pop 10616b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola // CHECK: declare hidden void @_ZN6test573fooIiE3zedEv 10626b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test573fooIiE3zedEv 10636b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola} 1064becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola 1065becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindolanamespace test58 { 1066becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola#pragma GCC visibility push(hidden) 1067becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola struct foo; 1068becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola template<typename T> 1069b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola struct DEFAULT bar { 1070becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola static void zed() { 1071becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola } 1072becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola }; 1073becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola void bah() { 1074becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola bar<foo>::zed(); 1075becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola } 1076becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola#pragma GCC visibility pop 107793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv 107893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv 1079becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola} 10806d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola 10816d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindolanamespace test59 { 10826d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola DEFAULT int f(); 10836d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola HIDDEN int g(); 10846d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola typedef int (*foo)(); 10856d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola template<foo x, foo y> 10866d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola void test() {} 10876d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola void use() { 10886d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola test<&g, &f>(); 108993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv 109093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv 10916d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola 10926d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola test<&f, &g>(); 109393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv 109493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv 10956d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola } 10966d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola} 109798499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola 109898499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindolanamespace test60 { 109998499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola template<int i> 1100b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola class HIDDEN a {}; 110198499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola template<int i> 1102b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola class DEFAULT b {}; 110398499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola template<template<int> class x, template<int> class y> 110498499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola void test() {} 110598499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola void use() { 110698499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola test<a, b>(); 110793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv 110893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv 110998499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola 111098499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola test<b, a>(); 111193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv 111293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv 111398499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola } 111498499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola} 1115838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola 1116838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test61 { 1117838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template <typename T1> 1118838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola struct Class1 1119838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola { 1120838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola void f1() { f2(); } 1121838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola inline void f2(); 1122838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola }; 1123838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template<> 1124838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola inline void Class1<int>::f2() 1125838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola { 1126838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola } 1127838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola void g(Class1<int> *x) { 1128838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola x->f1(); 1129838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola } 1130838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola} 1131838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test61 { 1132838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // Just test that we don't crash. Currently we apply this attribute. Current 1133838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // gcc issues a warning about it being unused since "the type is already 1134838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // defined". We should probably do the same. 1135b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola template class HIDDEN Class1<int>; 1136838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola} 1137838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola 1138838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test62 { 1139838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template <typename T1> 1140838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola struct Class1 1141838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola { 1142838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola void f1() { f2(); } 1143838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola inline void f2() {} 1144838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola }; 1145838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template<> 1146838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola inline void Class1<int>::f2() 1147838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola { 1148838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola } 1149838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola void g(Class1<int> *x) { 1150838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola x->f2(); 1151838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola } 1152838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola} 1153838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test62 { 1154b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola template class HIDDEN Class1<int>; 1155838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // Just test that we don't crash. Currently we apply this attribute. Current 1156838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // gcc issues a warning about it being unused since "the type is already 1157838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // defined". We should probably do the same. 1158838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola} 11595a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall 11605a758de93fa2a28a84eb0d918a31d9522472990cJohn McCallnamespace test63 { 11615a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall enum HIDDEN E { E0 }; 11625a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall struct A { 11635a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall template <E> static void foo() {} 11645a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall 11655a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall template <E> struct B { 11665a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall static void foo() {} 11675a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall }; 11685a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall }; 11695a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall 11705a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall void test() { 11715a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall A::foo<E0>(); 11725a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall A::B<E0>::foo(); 11735a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall } 117493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test631A3fooILNS_1EE0EEEvv() 117593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test631A1BILNS_1EE0EE3fooEv() 11765a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall} 1177d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 1178d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// Don't ignore the visibility of template arguments just because we 1179d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// explicitly instantiated something. 1180d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace test64 { 1181d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct HIDDEN A {}; 1182d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template <class P> struct B { 1183d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall static DEFAULT void foo() {} 1184d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 1185d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 1186d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template class B<A>; 118793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr hidden void @_ZN6test641BINS_1AEE3fooEv() 1188d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 11893892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 11903892d022f36ee5bf3be4a55ea01c08d323ef6235John McCallnamespace test65 { 11913892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall class HIDDEN A {}; 11923892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <class T> struct B { 11933892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall static void func(); 11943892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <class U> static void funcT1(); 11953892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <class U> static void funcT2(); 11963892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall class Inner {}; 11973892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <class U> class InnerT {}; 11983892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall }; 11993892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <template <class T> class Temp> struct C { 12003892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall static void foo() {} 12013892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall }; 12023892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 120393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test651BINS_1AEE4funcEv() 12043892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> DEFAULT void B<A>::func() {} 12053892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 120693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define void @_ZN6test651BINS_1AEE6funcT2IS1_EEvv() 12073892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> template <> DEFAULT void B<A>::funcT2<A>() {} 12083892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 120993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE6funcT1IiEEvv() 121093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test651BINS_1AEE6funcT1IS1_EEvv() 12113892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> template <class T> DEFAULT void B<A>::funcT1() {} 12123892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 121393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE5Inner3fooEv() 12143892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> struct DEFAULT B<A>::Inner { 12153892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall static void foo() {} 12163892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall }; 12173892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 121893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr void @_ZN6test651BINS_1AEE6InnerTIiE3fooEv() 121993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define linkonce_odr hidden void @_ZN6test651BINS_1AEE6InnerTIS1_E3fooEv() 12203892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> template <class U> struct DEFAULT B<A>::InnerT { 12213892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall static void foo() {} 12223892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall }; 12233892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 12243892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall void test() { 12253892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::funcT1<int>(); 12263892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::funcT1<A>(); 12273892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::Inner::foo(); 12283892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::InnerT<int>::foo(); 12293892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::InnerT<A>::foo(); 12303892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall } 12313892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 12323892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template class C<B<A>::InnerT>; 12333892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall} 1234d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola 1235d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindolanamespace test66 { 1236d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template <typename T> 1237b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola struct DEFAULT barT { 1238d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola static void zed() {} 1239d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola }; 1240d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola class foo; 1241b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola class DEFAULT foo; 1242d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template struct barT<foo>; 124393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv 124493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv 1245d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola 1246d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template <int* I> 1247b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola struct DEFAULT barI { 1248d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola static void zed() {} 1249d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola }; 1250d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola extern int I; 1251b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola extern int I DEFAULT; 1252d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template struct barI<&I>; 125393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv 125493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv 1255d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola 1256d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola typedef void (*fType)(void); 1257d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template<fType F> 1258b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola struct DEFAULT barF { 1259d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola static void zed() {} 1260d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola }; 1261d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola void F(); 1262b58f810669d9c17bcc025b7560de01d162856f34Rafael Espindola void F() DEFAULT; 1263d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template struct barF<F>; 126493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv 126593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv 1266d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola} 1267a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola 1268a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindolanamespace test67 { 1269a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola template <typename T> 1270a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola struct DEFAULT bar { 1271a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola static void zed() {} 1272a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola }; 1273a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola 1274a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola class foo; 1275a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola class compute { 1276a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola void f(foo *rootfoo); 1277a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola }; 1278a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola class DEFAULT foo; 1279a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola 1280a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola template struct bar<foo>; 128193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-LABEL: define weak_odr void @_ZN6test673barINS_3fooEE3zedEv 128293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin // CHECK-HIDDEN-LABEL: define weak_odr void @_ZN6test673barINS_3fooEE3zedEv 1283a2bb8923334ecd35b8f914dff7d105330abbad22Rafael Espindola} 128493cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman 128593cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedmannamespace test68 { 128693cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman class A { public: ~A(); }; 128793cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman class f { 128893cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman public: 128993cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman f() { 129093cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman static A test; 129193cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman } 129293cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman }; 129393cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman void g() { 129493cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman f a; 129593cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman } 129693cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman // Check lines at top of file. 129793cc515d3b99dca18d287d200e19355a2e9c02b2Eli Friedman} 1298525f2f5437929a324a37697f2934fda78931c66aBill Wendling 1299525f2f5437929a324a37697f2934fda78931c66aBill Wendlingnamespace test69 { 1300525f2f5437929a324a37697f2934fda78931c66aBill Wendling // PR18174 1301525f2f5437929a324a37697f2934fda78931c66aBill Wendling namespace foo { 1302525f2f5437929a324a37697f2934fda78931c66aBill Wendling void f(); 1303525f2f5437929a324a37697f2934fda78931c66aBill Wendling } 1304525f2f5437929a324a37697f2934fda78931c66aBill Wendling namespace foo { 1305525f2f5437929a324a37697f2934fda78931c66aBill Wendling void f() {}; 1306525f2f5437929a324a37697f2934fda78931c66aBill Wendling } 1307525f2f5437929a324a37697f2934fda78931c66aBill Wendling namespace foo __attribute__((visibility("hidden"))) { 1308525f2f5437929a324a37697f2934fda78931c66aBill Wendling } 1309525f2f5437929a324a37697f2934fda78931c66aBill Wendling // CHECK-LABEL: define void @_ZN6test693foo1fEv 1310525f2f5437929a324a37697f2934fda78931c66aBill Wendling // CHECK-HIDDEN-LABEL: define hidden void @_ZN6test693foo1fEv 1311525f2f5437929a324a37697f2934fda78931c66aBill Wendling} 1312