visibility.cpp revision 838dc597e25614c653a062a124b06a04d6b7f5eb
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 }; 50c7e606086a8d44c4e84ac3d47289288534c79bc6Rafael Espindola __attribute__ ((visibility ("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. 732de54fcf8511344d888f445bf159e5dee69cd6b9Rafael Espindola struct __attribute__((visibility("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 { 122860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class __attribute__((visibility("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 142cd3ac4bd96cb19af5117eded84bfe8320c5d787eRafael Espindola// CHECK-HIDDEN: @_ZTVN6Test161AIcEE = external unnamed_addr constant 143bf1c5aeadc5d4bb7fca5b0ee12208a94971f8492Peter Collingbourne// CHECK-HIDDEN: @_ZTTN6Test161AIcEE = external unnamed_addr constant 144f502d93b0ea970bfbd897e657f8d940a20984de2Anders Carlsson// CHECK: @_ZTVN5Test63fooE = linkonce_odr hidden unnamed_addr constant 1451fb0caaa7bef765b85972274e3b434af2572c141John McCall 14639de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test1 { 14739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // CHECK: define hidden void @_ZN5Test11fEv 14839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void HIDDEN f() { } 14939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 15039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 15139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 15239de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test2 { 15339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson struct HIDDEN A { 15439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void f(); 15539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson }; 15639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 15739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // A::f is a member function of a hidden class. 15839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // CHECK: define hidden void @_ZN5Test21A1fEv 15939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void A::f() { } 16039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 16139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 16239de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test3 { 16339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson struct HIDDEN A { 16439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson struct B { 16539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void f(); 16639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson }; 16739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson }; 16839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 16939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // B is a nested class where its parent class is hidden. 17039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // CHECK: define hidden void @_ZN5Test31A1B1fEv 17139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void A::B::f() { } 17239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 17339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 17439de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test4 HIDDEN { 17539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson int VariableInHiddenNamespace = 10; 17639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 17739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // Test4::g is in a hidden namespace. 17839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // CHECK: define hidden void @_ZN5Test41gEv 17939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void g() { } 18039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 18139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson struct DEFAULT A { 18239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void f(); 18339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson }; 18439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 18539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // A has default visibility. 18639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // CHECK: define void @_ZN5Test41A1fEv 18739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void A::f() { } 18839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 18939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 19039de84d671bac60662251e98f20a5a6039795dfcAnders Carlssonnamespace Test5 { 19139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 19239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson namespace NS HIDDEN { 19339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // f is in NS which is hidden. 19439de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // CHECK: define hidden void @_ZN5Test52NS1fEv() 19539de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void f() { } 19639de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson } 19739de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson 19839de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson namespace NS { 19939de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // g is in NS, but this NS decl is not hidden. 20039de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson // CHECK: define void @_ZN5Test52NS1gEv 20139de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson void g() { } 20239de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson } 20339de84d671bac60662251e98f20a5a6039795dfcAnders Carlsson} 204c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor 205c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor// <rdar://problem/8091955> 206c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregornamespace Test6 { 207c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor struct HIDDEN foo { 208c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor foo() { } 209c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor void bonk(); 210c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor virtual void bar() = 0; 211c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor 212c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor virtual void zonk() {} 213c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor }; 214c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor 215c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor struct barc : public foo { 216c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor barc(); 217c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor virtual void bar(); 218c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor }; 219c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor 220c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor barc::barc() {} 221c66bcfd32b941d8008284ecae9d16d7d47c96b0bDouglas Gregor} 2221fb0caaa7bef765b85972274e3b434af2572c141John McCall 2231fb0caaa7bef765b85972274e3b434af2572c141John McCallnamespace Test7 { 2241fb0caaa7bef765b85972274e3b434af2572c141John McCall class HIDDEN A {}; 2251fb0caaa7bef765b85972274e3b434af2572c141John McCall A a; // top of file 2261fb0caaa7bef765b85972274e3b434af2572c141John McCall 2271fb0caaa7bef765b85972274e3b434af2572c141John McCall template <A&> struct Aref { 2281fb0caaa7bef765b85972274e3b434af2572c141John McCall static void foo() {} 2291fb0caaa7bef765b85972274e3b434af2572c141John McCall }; 2301fb0caaa7bef765b85972274e3b434af2572c141John McCall 2311fb0caaa7bef765b85972274e3b434af2572c141John McCall class B : public A {}; 2321fb0caaa7bef765b85972274e3b434af2572c141John McCall B b; // top of file 2331fb0caaa7bef765b85972274e3b434af2572c141John McCall 2341fb0caaa7bef765b85972274e3b434af2572c141John McCall // CHECK: define linkonce_odr hidden void @_ZN5Test74ArefILZNS_1aEEE3fooEv() 2351fb0caaa7bef765b85972274e3b434af2572c141John McCall void test() { 2361fb0caaa7bef765b85972274e3b434af2572c141John McCall Aref<a>::foo(); 2371fb0caaa7bef765b85972274e3b434af2572c141John McCall } 2381fb0caaa7bef765b85972274e3b434af2572c141John McCall} 2391fb0caaa7bef765b85972274e3b434af2572c141John McCall 2401fb0caaa7bef765b85972274e3b434af2572c141John McCallnamespace Test8 { 2411fb0caaa7bef765b85972274e3b434af2572c141John McCall void foo(); 2421fb0caaa7bef765b85972274e3b434af2572c141John McCall void bar() {} 2431fb0caaa7bef765b85972274e3b434af2572c141John McCall // CHECK-HIDDEN: define hidden void @_ZN5Test83barEv() 2441fb0caaa7bef765b85972274e3b434af2572c141John McCall // CHECK-HIDDEN: declare void @_ZN5Test83fooEv() 2451fb0caaa7bef765b85972274e3b434af2572c141John McCall 2461fb0caaa7bef765b85972274e3b434af2572c141John McCall void test() { 2471fb0caaa7bef765b85972274e3b434af2572c141John McCall foo(); 2481fb0caaa7bef765b85972274e3b434af2572c141John McCall bar(); 2491fb0caaa7bef765b85972274e3b434af2572c141John McCall } 2501fb0caaa7bef765b85972274e3b434af2572c141John McCall} 251ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall 252ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall// PR8457 253ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCallnamespace Test9 { 254ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall extern "C" { 255ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall struct A { int field; }; 256ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall void DEFAULT test9_fun(struct A *a) { } 257ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall struct A DEFAULT test9_var; // above 258ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall } 259ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall // CHECK: define void @test9_fun( 260ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall // CHECK-HIDDEN: define void @test9_fun( 261ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall 262ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall void test() { 263ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall A a = test9_var; 264ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall test9_fun(&a); 265ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall } 266ac65c6208d48b0f9b4661c30c28997a280ac5ba6John McCall} 26767fa6d5ea630c800c3c96e129129aba93d1487c2John McCall 26867fa6d5ea630c800c3c96e129129aba93d1487c2John McCall// PR8478 26967fa6d5ea630c800c3c96e129129aba93d1487c2John McCallnamespace Test10 { 27067fa6d5ea630c800c3c96e129129aba93d1487c2John McCall struct A; 27167fa6d5ea630c800c3c96e129129aba93d1487c2John McCall 272fc038e9ef8ed262724f42597ca5c844de97b1202Eli Friedman class DEFAULT B { 27367fa6d5ea630c800c3c96e129129aba93d1487c2John McCall void foo(A*); 27467fa6d5ea630c800c3c96e129129aba93d1487c2John McCall }; 27567fa6d5ea630c800c3c96e129129aba93d1487c2John McCall 27667fa6d5ea630c800c3c96e129129aba93d1487c2John McCall // CHECK: define void @_ZN6Test101B3fooEPNS_1AE( 27767fa6d5ea630c800c3c96e129129aba93d1487c2John McCall // CHECK-HIDDEN: define void @_ZN6Test101B3fooEPNS_1AE( 27867fa6d5ea630c800c3c96e129129aba93d1487c2John McCall void B::foo(A*) {} 27967fa6d5ea630c800c3c96e129129aba93d1487c2John McCall} 2800df9587ab011c12968fcbe3518666b2117afe350John McCall 2810df9587ab011c12968fcbe3518666b2117afe350John McCall// PR8492 2820df9587ab011c12968fcbe3518666b2117afe350John McCallnamespace Test11 { 2830df9587ab011c12968fcbe3518666b2117afe350John McCall struct A { 2840df9587ab011c12968fcbe3518666b2117afe350John McCall void foo() {} 2850df9587ab011c12968fcbe3518666b2117afe350John McCall void DEFAULT bar() {} 2860df9587ab011c12968fcbe3518666b2117afe350John McCall }; 2870df9587ab011c12968fcbe3518666b2117afe350John McCall 2880df9587ab011c12968fcbe3518666b2117afe350John McCall void test() { 2890df9587ab011c12968fcbe3518666b2117afe350John McCall A a; 2900df9587ab011c12968fcbe3518666b2117afe350John McCall a.foo(); 2910df9587ab011c12968fcbe3518666b2117afe350John McCall a.bar(); 2920df9587ab011c12968fcbe3518666b2117afe350John McCall } 2930df9587ab011c12968fcbe3518666b2117afe350John McCall 2940df9587ab011c12968fcbe3518666b2117afe350John McCall // CHECK: define linkonce_odr void @_ZN6Test111A3fooEv( 2950df9587ab011c12968fcbe3518666b2117afe350John McCall // CHECK: define linkonce_odr void @_ZN6Test111A3barEv( 2960df9587ab011c12968fcbe3518666b2117afe350John McCall // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6Test111A3fooEv( 2970df9587ab011c12968fcbe3518666b2117afe350John McCall // CHECK-HIDDEN: define linkonce_odr void @_ZN6Test111A3barEv( 2980df9587ab011c12968fcbe3518666b2117afe350John McCall} 299110e8e56af30363072c140285961592b0107f789John McCall 300110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file. 301110e8e56af30363072c140285961592b0107f789John McCallnamespace Test12 { 302110e8e56af30363072c140285961592b0107f789John McCall struct A { 303110e8e56af30363072c140285961592b0107f789John McCall // This is hidden in all cases: the explicit attribute takes 304110e8e56af30363072c140285961592b0107f789John McCall // priority over -fvisibility on the parent. 305110e8e56af30363072c140285961592b0107f789John McCall static int hidden HIDDEN; 306110e8e56af30363072c140285961592b0107f789John McCall 307110e8e56af30363072c140285961592b0107f789John McCall // This is default in all cases because it's only a declaration. 308110e8e56af30363072c140285961592b0107f789John McCall static int visible; 309110e8e56af30363072c140285961592b0107f789John McCall }; 310110e8e56af30363072c140285961592b0107f789John McCall 311110e8e56af30363072c140285961592b0107f789John McCall void test() { 312110e8e56af30363072c140285961592b0107f789John McCall A::hidden = 0; 313110e8e56af30363072c140285961592b0107f789John McCall A::visible = 0; 314110e8e56af30363072c140285961592b0107f789John McCall } 315110e8e56af30363072c140285961592b0107f789John McCall} 316110e8e56af30363072c140285961592b0107f789John McCall 317110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file. 318110e8e56af30363072c140285961592b0107f789John McCallnamespace Test13 { 319110e8e56af30363072c140285961592b0107f789John McCall struct HIDDEN A {}; 320110e8e56af30363072c140285961592b0107f789John McCall 321110e8e56af30363072c140285961592b0107f789John McCall // Should be hidden in all cases. 322110e8e56af30363072c140285961592b0107f789John McCall struct B { 323110e8e56af30363072c140285961592b0107f789John McCall static A a; 324110e8e56af30363072c140285961592b0107f789John McCall }; 325110e8e56af30363072c140285961592b0107f789John McCall A B::a; 326110e8e56af30363072c140285961592b0107f789John McCall 327110e8e56af30363072c140285961592b0107f789John McCall // Should be default in all cases. 328110e8e56af30363072c140285961592b0107f789John McCall struct DEFAULT C { 329110e8e56af30363072c140285961592b0107f789John McCall static A a; 330110e8e56af30363072c140285961592b0107f789John McCall }; 331110e8e56af30363072c140285961592b0107f789John McCall A C::a; 332110e8e56af30363072c140285961592b0107f789John McCall}; 333110e8e56af30363072c140285961592b0107f789John McCall 334110e8e56af30363072c140285961592b0107f789John McCall// Tested at top of file. 335110e8e56af30363072c140285961592b0107f789John McCallnamespace Test14 { 336110e8e56af30363072c140285961592b0107f789John McCall // Neither the visibility of the type nor -fvisibility=hidden should 337110e8e56af30363072c140285961592b0107f789John McCall // apply to declarations. 338110e8e56af30363072c140285961592b0107f789John McCall extern struct A *var; 339110e8e56af30363072c140285961592b0107f789John McCall 340110e8e56af30363072c140285961592b0107f789John McCall struct A *test() { return var; } 341110e8e56af30363072c140285961592b0107f789John McCall} 342ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall 343ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall// rdar://problem/8613093 344ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCallnamespace Test15 { 345ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall struct A {}; 346ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall template <class T> struct Temp { 347ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall struct Inner { 348ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall static char buffer[0]; 349ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall }; 350ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall }; 351ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall 352ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall char *test() { 353ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall return Temp<A>::Inner::buffer; 354ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall } 355ee30102a9ef32cdbf0afe0e4c07a53d265a18f98John McCall} 356af14603ca61757cf4361b583b45639a04c57e651John McCall 357af14603ca61757cf4361b583b45639a04c57e651John McCallnamespace Test16 { 358af14603ca61757cf4361b583b45639a04c57e651John McCall struct Base1 { virtual void foo(); }; 359af14603ca61757cf4361b583b45639a04c57e651John McCall struct Base2 : virtual Base1 { virtual void foo(); }; 360af14603ca61757cf4361b583b45639a04c57e651John McCall template <class T> struct A : virtual Base1, Base2 { 361af14603ca61757cf4361b583b45639a04c57e651John McCall virtual void foo(); 362af14603ca61757cf4361b583b45639a04c57e651John McCall }; 363af14603ca61757cf4361b583b45639a04c57e651John McCall extern template struct A<char>; 364af14603ca61757cf4361b583b45639a04c57e651John McCall 365af14603ca61757cf4361b583b45639a04c57e651John McCall void test() { 366af14603ca61757cf4361b583b45639a04c57e651John McCall A<char> a; 367af14603ca61757cf4361b583b45639a04c57e651John McCall a.foo(); 368af14603ca61757cf4361b583b45639a04c57e651John McCall } 369af14603ca61757cf4361b583b45639a04c57e651John McCall} 3703698748400478880d2a146ef9eaa111cd0e60522John McCall 3713698748400478880d2a146ef9eaa111cd0e60522John McCallnamespace Test17 { 3723698748400478880d2a146ef9eaa111cd0e60522John McCall struct HIDDEN A { 3733698748400478880d2a146ef9eaa111cd0e60522John McCall static void foo(); 3743698748400478880d2a146ef9eaa111cd0e60522John McCall static void DEFAULT bar(); 3753698748400478880d2a146ef9eaa111cd0e60522John McCall static void HIDDEN baz(); 3763698748400478880d2a146ef9eaa111cd0e60522John McCall 3773698748400478880d2a146ef9eaa111cd0e60522John McCall struct DEFAULT B { 3783698748400478880d2a146ef9eaa111cd0e60522John McCall static void foo(); 3793698748400478880d2a146ef9eaa111cd0e60522John McCall static void DEFAULT bar(); 3803698748400478880d2a146ef9eaa111cd0e60522John McCall static void HIDDEN baz(); 3813698748400478880d2a146ef9eaa111cd0e60522John McCall }; 3823698748400478880d2a146ef9eaa111cd0e60522John McCall }; 3833698748400478880d2a146ef9eaa111cd0e60522John McCall 3843698748400478880d2a146ef9eaa111cd0e60522John McCall void test() { 3853698748400478880d2a146ef9eaa111cd0e60522John McCall A::foo(); 3863698748400478880d2a146ef9eaa111cd0e60522John McCall A::bar(); 3873698748400478880d2a146ef9eaa111cd0e60522John McCall A::baz(); 3883698748400478880d2a146ef9eaa111cd0e60522John McCall A::B::foo(); 3893698748400478880d2a146ef9eaa111cd0e60522John McCall A::B::bar(); 3903698748400478880d2a146ef9eaa111cd0e60522John McCall A::B::baz(); 3913698748400478880d2a146ef9eaa111cd0e60522John McCall } 3923698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test171A3fooEv() 3933698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test171A3barEv() 3943698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test171A3bazEv() 3953698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test171A1B3fooEv() 3963698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test171A1B3barEv() 3973698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test171A1B3bazEv() 3983698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3fooEv() 3993698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test171A3barEv() 4003698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test171A3bazEv() 4013698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test171A1B3fooEv() 4023698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test171A1B3barEv() 4033698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test171A1B3bazEv() 4043698748400478880d2a146ef9eaa111cd0e60522John McCall} 4053698748400478880d2a146ef9eaa111cd0e60522John McCall 4063698748400478880d2a146ef9eaa111cd0e60522John McCallnamespace Test18 { 4073698748400478880d2a146ef9eaa111cd0e60522John McCall template <class T> struct HIDDEN A { 4083698748400478880d2a146ef9eaa111cd0e60522John McCall static void foo(); 4093698748400478880d2a146ef9eaa111cd0e60522John McCall static void DEFAULT bar(); 4103698748400478880d2a146ef9eaa111cd0e60522John McCall static void HIDDEN baz(); 4113698748400478880d2a146ef9eaa111cd0e60522John McCall 4123698748400478880d2a146ef9eaa111cd0e60522John McCall struct DEFAULT B { 4133698748400478880d2a146ef9eaa111cd0e60522John McCall static void foo(); 4143698748400478880d2a146ef9eaa111cd0e60522John McCall static void DEFAULT bar(); 4153698748400478880d2a146ef9eaa111cd0e60522John McCall static void HIDDEN baz(); 4163698748400478880d2a146ef9eaa111cd0e60522John McCall }; 4173698748400478880d2a146ef9eaa111cd0e60522John McCall }; 4183698748400478880d2a146ef9eaa111cd0e60522John McCall struct HIDDEN H; 4193698748400478880d2a146ef9eaa111cd0e60522John McCall 4203698748400478880d2a146ef9eaa111cd0e60522John McCall void test() { 4213698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::foo(); 4223698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::bar(); 4233698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::baz(); 4243698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::B::foo(); 4253698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::B::bar(); 4263698748400478880d2a146ef9eaa111cd0e60522John McCall A<int>::B::baz(); 4273698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::foo(); 4283698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::bar(); 4293698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::baz(); 4303698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::B::foo(); 4313698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::B::bar(); 4323698748400478880d2a146ef9eaa111cd0e60522John McCall A<H>::B::baz(); 4333698748400478880d2a146ef9eaa111cd0e60522John McCall } 4343698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AIiE3fooEv() 4353698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test181AIiE3barEv() 4363698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AIiE3bazEv() 4373698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test181AIiE1B3fooEv() 4383698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare void @_ZN6Test181AIiE1B3barEv() 4393698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AIiE1B3bazEv() 4403698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3fooEv() 4413698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3barEv() 4423698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE3bazEv() 4433698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv() 4443698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv() 4453698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv() 4463698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3fooEv() 4473698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test181AIiE3barEv() 4483698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE3bazEv() 4493698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3fooEv() 4503698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare void @_ZN6Test181AIiE1B3barEv() 4513698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AIiE1B3bazEv() 4523698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3fooEv() 4533698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3barEv() 4543698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE3bazEv() 4553698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3fooEv() 4563698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3barEv() 4573698748400478880d2a146ef9eaa111cd0e60522John McCall // CHECK-HIDDEN: declare hidden void @_ZN6Test181AINS_1HEE1B3bazEv() 4583698748400478880d2a146ef9eaa111cd0e60522John McCall} 459112c967bd5c862a0f5d7913aa06700c048807db8John McCall 460112c967bd5c862a0f5d7913aa06700c048807db8John McCallnamespace Test19 { 461112c967bd5c862a0f5d7913aa06700c048807db8John McCall struct A { A(); ~A(); }; 462112c967bd5c862a0f5d7913aa06700c048807db8John McCall 463112c967bd5c862a0f5d7913aa06700c048807db8John McCall // Tested at top of file. 464112c967bd5c862a0f5d7913aa06700c048807db8John McCall template <class T> void foo() { 465112c967bd5c862a0f5d7913aa06700c048807db8John McCall static A a; 466112c967bd5c862a0f5d7913aa06700c048807db8John McCall } 467112c967bd5c862a0f5d7913aa06700c048807db8John McCall 468112c967bd5c862a0f5d7913aa06700c048807db8John McCall void test() { 469112c967bd5c862a0f5d7913aa06700c048807db8John McCall foo<int>(); 470112c967bd5c862a0f5d7913aa06700c048807db8John McCall } 471112c967bd5c862a0f5d7913aa06700c048807db8John McCall} 4727f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4737f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall// Various things with class template specializations. 4747f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCallnamespace Test20 { 4757f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall template <unsigned> struct HIDDEN A {}; 4767f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4777f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // An explicit specialization inherits the explicit visibility of 4787f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // the template. 4797f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall template <> struct A<0> { 4807f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test0(); 4817f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test1(); 4827f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall }; 4837f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4847f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // CHECK: define hidden void @_ZN6Test201AILj0EE5test0Ev() 4857f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void A<0>::test0() {} 4867f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4877f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // CHECK: declare hidden void @_ZN6Test201AILj0EE5test1Ev() 4887f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void test1() { 4897f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall A<0>::test1(); 4907f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall } 4917f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4927f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // ...unless that's explicitly overridden. 4937f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall template <> struct DEFAULT A<1> { 4947f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test2(); 4957f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test3(); 4967f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall }; 4977f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 4987f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // CHECK: define void @_ZN6Test201AILj1EE5test2Ev() 4997f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void A<1>::test2() {} 5007f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 5017f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // CHECK: declare void @_ZN6Test201AILj1EE5test3Ev() 5027f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void test3() { 5037f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall A<1>::test3(); 5047f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall } 5057f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 5067f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // <rdar://problem/8778497> 5077f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // But we should assume that an unknown specialization has the 5087f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // explicit visibility settings of the template. 5097f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall template <class T> struct B { 5107f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test4() {} 5117f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall static void test5(); 5127f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall }; 5137f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 5147f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall // CHECK: define linkonce_odr hidden void @_ZN6Test201BINS_1AILj2EEEE5test4Ev() 5157f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void test4() { 5167f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall B<A<2> >::test4(); 5177f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall } 5187f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall 519093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola // CHECK: declare hidden void @_ZN6Test201BINS_1AILj2EEEE5test5Ev() 5207f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall void test5() { 5217f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall B<A<2> >::test5(); 5227f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall } 5237f1b98760d419a09b2261c1ef901f6bc1ff33e19John McCall} 5241a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall 5251a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall// PR9371 5261a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCallnamespace test21 { 5271a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall enum En { en }; 5281a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall template<En> struct A { 5291a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall __attribute__((visibility("default"))) void foo() {} 5301a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall }; 5311a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall 5321a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall // CHECK: define weak_odr void @_ZN6test211AILNS_2EnE0EE3fooEv( 5331a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall template void A<en>::foo(); 5341a0918ade0a3490c7aff243f9cd519156dfcb0bdJohn McCall} 5356ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall 5366ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall// rdar://problem/9616154 5376ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall// Visibility on explicit specializations should take precedence. 5386ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCallnamespace test22 { 5396ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall class A1 {}; 5406ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall class A2 {}; 5416ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall 5426ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall template <class T> struct B {}; 5436ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall template <> struct DEFAULT B<A1> { 5446ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall static void foo(); 5456ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall static void bar() {} 5466ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall }; 5476ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall template <> struct B<A2> { 5486ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall static void foo(); 5496ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall static void bar() {} 5506ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall }; 5516ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall 5526ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall void test() { 5536ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall B<A1>::foo(); 5546ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall B<A1>::bar(); 5556ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall B<A2>::foo(); 5566ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall B<A2>::bar(); 5576ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall } 5586ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK: declare void @_ZN6test221BINS_2A1EE3fooEv() 5596ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv() 5606ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK: declare void @_ZN6test221BINS_2A2EE3fooEv() 5616ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK: define linkonce_odr void @_ZN6test221BINS_2A2EE3barEv() 5626ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A1EE3fooEv() 5636ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK-HIDDEN: define linkonce_odr void @_ZN6test221BINS_2A1EE3barEv() 5646ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK-HIDDEN: declare void @_ZN6test221BINS_2A2EE3fooEv() 5656ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test221BINS_2A2EE3barEv() 5666ce51ee94bd300c5f30930d96436fd53e4ea89a7John McCall} 56771cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola 56871cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindolanamespace PR10113 { 569b5d763d87c8ffb969b4d4a59ed98a2e3516e0850Rafael Espindola namespace foo DEFAULT { 57071cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola template<typename T> 57171cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola class bar { 57271cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola void zed() {} 57371cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola }; 57471cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola } 57571cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola template class foo::bar<char>; 57671cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola // CHECK: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv 57771cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN7PR101133foo3barIcE3zedEv 578093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola 579093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola struct zed { 580093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola }; 581093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template class foo::bar<zed>; 582093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola // CHECK: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv 58351183374a54448c54f1b53035cea5b8d885c1c82Rafael Espindola 58451183374a54448c54f1b53035cea5b8d885c1c82Rafael Espindola // FIXME: This should be hidden as zed is hidden. 58551183374a54448c54f1b53035cea5b8d885c1c82Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN7PR101133foo3barINS_3zedEE3zedEv 58671cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola} 5870257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola 5880257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindolanamespace PR11690 { 5890257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola template<class T> struct Class { 5900257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola void size() const { 5910257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola } 5920257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola }; 5930257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola template class DEFAULT Class<char>; 5940257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola // CHECK: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv 5950257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv 596256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola 597256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola template<class T> void Method() {} 598093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template DEFAULT void Method<char>(); 599256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola // CHECK: define weak_odr void @_ZN7PR116906MethodIcEEvv 600256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN7PR116906MethodIcEEvv 6010257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola} 602093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola 603093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindolanamespace PR11690_2 { 604093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola namespace foo DEFAULT { 605093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola class bar; 606093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template<typename T1, typename T2 = bar> 607093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola class zed { 608093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola void bar() { 609093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola } 610093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola }; 611093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola } 612093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola struct baz { 613093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola }; 614093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template class foo::zed<baz>; 615093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola // CHECK: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv 61651183374a54448c54f1b53035cea5b8d885c1c82Rafael Espindola 61751183374a54448c54f1b53035cea5b8d885c1c82Rafael Espindola // FIXME: This should be hidden as baz is hidden. 61851183374a54448c54f1b53035cea5b8d885c1c82Rafael Espindola // CHECK-HIDDEN: define weak_odr 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 } 636860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK: define linkonce_odr void @_ZN6test231XINS_1AEE1fEv 637860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK-HIDDEN: 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 } 650860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK: define linkonce_odr void @_ZN7PR120014BindINS_7VersionEEEvRKT_ 651860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK-HIDDEN: 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 } 666860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK: define linkonce_odr void @_ZN6test241S3memINS_1AEEEvv 667860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test241S3memINS_1AEEEvv 668860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 669860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 670860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test26 { 671860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template<typename T> 672860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class C { 673860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola __attribute__((visibility("default"))) void f(); 674860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola }; 675860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 676860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template<> 677860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void C<int>::f() { } 678860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 679860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK: define void @_ZN6test261CIiE1fEv 680860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK-HIDDEN: 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 } 704a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola // CHECK: define void @_ZN6test321A1B3bazEv 705a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola // CHECK-HIDDEN: 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>; 716f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola // CHECK: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv 717f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola // CHECK-HIDDEN: 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>(); 726a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola // CHECK: define weak_odr void @_ZN6test343barINS_3fooEEEvv 727a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola // CHECK-HIDDEN: 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 732546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // definition. What we do instead is be conservative about merging 733546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // implicit visibilities. 734546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // FIXME: Maybe the best thing to do here is error? The test at least 735546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // makes sure we don't produce a hidden symbol for foo<zed>::bar. 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 }; 744546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // CHECK: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv 745546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // CHECK-HIDDEN: define weak_odr 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>; 756923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola // CHECK: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv 757923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola // CHECK-HIDDEN: 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>(); 76631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr void @_ZN6test373barINS_3fooEEEvv 76731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: 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>; 77831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv 77931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: 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 79731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv 79831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv 79931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv 80031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 80131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // GCC produces a default for this one. Why? 80231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv 80331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 80431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv 80531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv 80631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv 80731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 80831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // GCC produces a default for this one. Why? 80931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: 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 } 8240b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola // CHECK: define hidden void @_ZN6test423barINS_3fooEE3zedEv 8250b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola // CHECK-HIDDEN: define hidden 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 } 837cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola // CHECK: define hidden void @_ZN6test433barINS_3fooEEEvv 838cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola // CHECK-HIDDEN: define hidden 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; 851ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola // CHECK: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev 852ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola // CHECK-HIDDEN: 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; 86820831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola // CHECK: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev 86920831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola // CHECK-HIDDEN: 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 } 8839db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola // CHECK: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv 8849db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola // CHECK-HIDDEN: 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 } 89641be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola template __attribute__((visibility("default"))) void foo::bar<zed>(); 89741be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola void baz() { 89841be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola foo::bar<zed>(); 89941be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola } 90041be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola // CHECK: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv 90141be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola // CHECK-HIDDEN: 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>(); 921edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv 922edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK-HIDDEN: 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(); 939edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv 940edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK-HIDDEN: 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>(); 955edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv 956edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK-HIDDEN: 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 } 974edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv 975edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK-HIDDEN: 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> 102423458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola struct __attribute__((visibility("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> 1038d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola struct __attribute__((visibility("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> 1069becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola struct __attribute__((visibility("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 1077becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv 1078becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola // CHECK-HIDDEN: 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>(); 10896d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv 10906d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv 10916d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola 10926d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola test<&f, &g>(); 10936d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv 10946d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv 10956d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola } 10966d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola} 109798499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola 109898499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindolanamespace test60 { 109998499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola template<int i> 110098499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola class __attribute__((visibility("hidden"))) a {}; 110198499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola template<int i> 110298499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola class __attribute__((visibility("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>(); 110798499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv 110898499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv 110998499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola 111098499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola test<b, a>(); 111198499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv 111298499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola // CHECK-HIDDEN: 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. 1135838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template class __attribute__ ((visibility("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 { 1154838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template class __attribute__ ((visibility("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} 1159