visibility.cpp revision d3b2f0ac1cedad284d860acd652f28a05bcbcbed
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 5835a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK-HIDDEN: define weak_odr hidden void @_ZN7PR101133foo3barINS_3zedEE3zedEv 58471cb8a2e10c3f75ca50e2b4f205cbd4cec40ad5eRafael Espindola} 5850257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola 5860257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindolanamespace PR11690 { 5870257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola template<class T> struct Class { 5880257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola void size() const { 5890257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola } 5900257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola }; 5910257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola template class DEFAULT Class<char>; 5920257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola // CHECK: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv 5930257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZNK7PR116905ClassIcE4sizeEv 594256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola 595256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola template<class T> void Method() {} 596093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template DEFAULT void Method<char>(); 597256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola // CHECK: define weak_odr void @_ZN7PR116906MethodIcEEvv 598256fc4d0743d520a2535d6de003aa828f5de8b27Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN7PR116906MethodIcEEvv 5990257b7fbbe2e48bdc4c435a275b5daac195fb1cbRafael Espindola} 600093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola 601093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindolanamespace PR11690_2 { 602093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola namespace foo DEFAULT { 603093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola class bar; 604093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template<typename T1, typename T2 = bar> 605093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola class zed { 606093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola void bar() { 607093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola } 608093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola }; 609093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola } 610093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola struct baz { 611093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola }; 612093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola template class foo::zed<baz>; 613093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola // CHECK: define weak_odr void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv 6145a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK-HIDDEN: define weak_odr hidden void @_ZN9PR11690_23foo3zedINS_3bazENS0_3barEE3barEv 615093ecc92afb70f6125d249eef31f40c0c57b7d24Rafael Espindola} 616860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 617860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test23 { 618860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // Having a template argument that is explicitly visible should not make 619860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // the template instantiation visible. 620860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template <typename T> 621860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola struct X { 622860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola static void f() { 623860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 624860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola }; 625860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 626860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class DEFAULT A; 627860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 628860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void g() { 629860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola X<A> y; 630860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola y.f(); 631860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 632860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK: define linkonce_odr void @_ZN6test231XINS_1AEE1fEv 633860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test231XINS_1AEE1fEv 634860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 635860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 636860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace PR12001 { 637860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template <typename P1> 638860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void Bind(const P1& p1) { 639860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 640860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 641860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class DEFAULT Version { }; 642860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 643860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void f() { 644860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola Bind(Version()); 645860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 646860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK: define linkonce_odr void @_ZN7PR120014BindINS_7VersionEEEvRKT_ 647860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN7PR120014BindINS_7VersionEEEvRKT_ 648860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 649860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 650860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test24 { 651860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class DEFAULT A { }; 652860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 653860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola struct S { 654860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template <typename T> 655860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void mem() {} 656860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola }; 657860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 658860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void test() { 659860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola S s; 660860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola s.mem<A>(); 661860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola } 662860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK: define linkonce_odr void @_ZN6test241S3memINS_1AEEEvv 663860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test241S3memINS_1AEEEvv 664860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 665860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 666860097c4ee7a365b6d462436659082c8355e03fdRafael Espindolanamespace test26 { 667860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template<typename T> 668860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola class C { 669860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola __attribute__((visibility("default"))) void f(); 670860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola }; 671860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 672860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola template<> 673860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola void C<int>::f() { } 674860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola 675860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK: define void @_ZN6test261CIiE1fEv 676860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola // CHECK-HIDDEN: define void @_ZN6test261CIiE1fEv 677860097c4ee7a365b6d462436659082c8355e03fdRafael Espindola} 678bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola 679bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindolanamespace test31 { 680bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola struct A { 681bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola struct HIDDEN B { 682bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola static void DEFAULT baz(); 683bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola }; 684bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola }; 685bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola void f() { 686bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola A::B::baz(); 687bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola } 688bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola // CHECK: declare void @_ZN6test311A1B3bazEv() 689bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola // CHECK-HIDDEN: declare void @_ZN6test311A1B3bazEv() 690bc356d0aa9c25c0831fa0ae9830b5e5e4be23b0aRafael Espindola} 691a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola 692a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindolanamespace test32 { 693a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola struct HIDDEN A { 694a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola struct DEFAULT B { 695a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola void DEFAULT baz(); 696a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola }; 697a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola }; 698a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola void A::B::baz() { 699a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola } 700a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola // CHECK: define void @_ZN6test321A1B3bazEv 701a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola // CHECK-HIDDEN: define void @_ZN6test321A1B3bazEv 702a77e0726341a4afbe9c25b05cf944edf17f64543Rafael Espindola} 703f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola 704f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindolanamespace test33 { 705f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola template<typename T> 706f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola class foo { 707f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola void bar() {} 708f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola }; 70971776efce59509b127a02f385c3df9686b852d62Rafael Espindola struct HIDDEN zed { 710f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola }; 71171776efce59509b127a02f385c3df9686b852d62Rafael Espindola template class DEFAULT foo<zed>; 712f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola // CHECK: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv 713f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test333fooINS_3zedEE3barEv 714f6a8b9cba4893b552704f64dd279b4cdc8c13f6fRafael Espindola} 715a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola 716a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindolanamespace test34 { 717a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola struct foo { 718a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola }; 719a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola template<class T> 720a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola void bar() {} 721a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola template DEFAULT void bar<foo>(); 722a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola // CHECK: define weak_odr void @_ZN6test343barINS_3fooEEEvv 723a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test343barINS_3fooEEEvv 724a5416bd3caae812563eea12b3b2e21da9c5b5904Rafael Espindola} 725546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola 726546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindolanamespace test35 { 727546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // This is a really ugly testcase. GCC propagates the DEFAULT in zed's 7285a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // definition. It's not really clear what we can do here, because we 7295a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // produce the symbols before even seeing the DEFAULT definition of zed. 7305a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // FIXME: Maybe the best thing to do here is error? It's certainly hard 7315a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // to argue that this ought to be valid. 732546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola template<typename T> 733546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola struct DEFAULT foo { 734546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola void bar() {} 735546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola }; 736546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola class zed; 737546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola template class foo<zed>; 738546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola class DEFAULT zed { 739546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola }; 740546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola // CHECK: define weak_odr void @_ZN6test353fooINS_3zedEE3barEv 7415a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test353fooINS_3zedEE3barEv 742546ee6dbcafa8a0dc6342497573fafa560be66f8Rafael Espindola} 743923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola 744923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindolanamespace test36 { 745923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola template<typename T1, typename T2> 746923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola class foo { 747923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola void bar() {} 748923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola }; 749923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola class DEFAULT S1 {}; 750923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola struct HIDDEN S2 {}; 751923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola template class foo<S1, S2>; 752923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola // CHECK: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv 753923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test363fooINS_2S1ENS_2S2EE3barEv 754923b0c93375db7e75a02bceb487f6f3d3da2766fRafael Espindola} 75531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 75631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test37 { 75731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola struct HIDDEN foo { 75831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 75931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template<class T> 76031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola DEFAULT void bar() {} 76131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template DEFAULT void bar<foo>(); 76231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr void @_ZN6test373barINS_3fooEEEvv 76331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test373barINS_3fooEEEvv 76431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola} 76531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 76631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test38 { 76731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template<typename T> 76831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola class DEFAULT foo { 76931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola void bar() {} 77031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 77131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola struct HIDDEN zed { 77231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 77331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template class foo<zed>; 77431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv 77531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test383fooINS_3zedEE3barEv 77631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola} 77731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 77831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindolanamespace test39 { 77931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola class DEFAULT default_t; 78031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola class HIDDEN hidden_t; 78131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template <class T> class A { 78231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template <class U> class B { 78331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola HIDDEN void hidden() {} 78431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola void noattr() {} 78531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template <class V> void temp() {} 78631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 78731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola }; 78831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template class DEFAULT A<hidden_t>; 78931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template class DEFAULT A<hidden_t>::B<hidden_t>; 79031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template void A<hidden_t>::B<hidden_t>::temp<default_t>(); 79131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola template void A<hidden_t>::B<hidden_t>::temp<hidden_t>(); 79231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 79331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv 79431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv 79531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv 79631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 79731c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // GCC produces a default for this one. Why? 79831c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv 79931c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 80031c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E6hiddenEv 80131c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E6noattrEv 80231c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempINS_9default_tEEEvv 80331c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola 80431c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // GCC produces a default for this one. Why? 80531c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test391AINS_8hidden_tEE1BIS1_E4tempIS1_EEvv 80631c195ac0f3869e742d42f9d02b6cd33442fb630Rafael Espindola} 8070b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola 8080b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindolanamespace test42 { 8090b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola struct HIDDEN foo { 8100b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola }; 8110b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola template <class P> 8120b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola struct bar { 8130b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola }; 8140b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola template <> 8150b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola struct HIDDEN bar<foo> { 8160b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola DEFAULT static void zed(); 8170b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola }; 8180b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola void bar<foo>::zed() { 8190b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola } 8205a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK: define void @_ZN6test423barINS_3fooEE3zedEv 8215a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK-HIDDEN: define void @_ZN6test423barINS_3fooEE3zedEv 8220b0ad0abd8518742c57d0c6fc01c79982ba2bfdfRafael Espindola} 823cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola 824cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindolanamespace test43 { 825cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola struct HIDDEN foo { 826cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola }; 827cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola template <class P> 828cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola void bar() { 829cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola } 830cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola template <> 831cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola DEFAULT void bar<foo>() { 832cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola } 8335a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK: define void @_ZN6test433barINS_3fooEEEvv 8345a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK-HIDDEN: define void @_ZN6test433barINS_3fooEEEvv 835cae1c623b638f91e848ed81a2510b86b403992e4Rafael Espindola} 836ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola 837ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindolanamespace test44 { 838ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola template <typename T> 839ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola struct foo { 840ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola foo() {} 841ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola }; 842ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola namespace { 843ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola struct bar; 844ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola } 845ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola template struct DEFAULT foo<bar>; 846ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola foo<bar> x; 847ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola // CHECK: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev 848ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola // CHECK-HIDDEN: define internal void @_ZN6test443fooINS_12_GLOBAL__N_13barEEC1Ev 849ad359beadbe2b91acf6888546e39083ae74321d9Rafael Espindola} 85020831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola 85120831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindolanamespace test45 { 85220831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola template <typename T> 85320831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola struct foo { 85420831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola template <typename T2> 85520831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola struct bar { 85620831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola bar() {}; 85720831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola }; 85820831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola }; 85920831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola namespace { 86020831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola struct zed; 86120831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola } 86220831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola template struct DEFAULT foo<int>::bar<zed>; 86320831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola foo<int>::bar<zed> x; 86420831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola // CHECK: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev 86520831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola // CHECK-HIDDEN: define internal void @_ZN6test453fooIiE3barINS_12_GLOBAL__N_13zedEEC1Ev 86620831e21ae00ee10e9d9d906f565a66f9fe1d2d1Rafael Espindola} 8679db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola 8689db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindolanamespace test46 { 8699db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola template <typename T> 8709db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola void foo() { 8719db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola } 8729db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola namespace { 8739db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola struct bar; 8749db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola } 8759db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola template DEFAULT void foo<bar>(); 8769db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola void zed() { 8779db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola foo<bar>(); 8789db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola } 8799db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola // CHECK: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv 8809db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola // CHECK-HIDDEN: define internal void @_ZN6test463fooINS_12_GLOBAL__N_13barEEEvv 8819db614f339f7596e2c0e0e04d6c714cd264ce883Rafael Espindola} 88241be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola 88341be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindolanamespace test47 { 88441be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola struct foo { 88541be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola template <typename T> 88641be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola static void bar() { 88741be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola } 88841be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola }; 88941be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola namespace { 89041be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola struct zed; 89141be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola } 89241be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola template __attribute__((visibility("default"))) void foo::bar<zed>(); 89341be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola void baz() { 89441be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola foo::bar<zed>(); 89541be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola } 89641be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola // CHECK: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv 89741be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola // CHECK-HIDDEN: define internal void @_ZN6test473foo3barINS_12_GLOBAL__N_13zedEEEvv 89841be8cd0593f2e08e41eed218e1b91f419e829a1Rafael Espindola} 899edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 900edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test49 { 901edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // Test that we use the visibility of struct foo when instantiating the 902edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // template. Note that is a case where we disagree with gcc, it produces 903edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // a default symbol. 904edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 905edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct HIDDEN foo { 906edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 907edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 908edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola DEFAULT foo x; 909edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 910edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct bar { 911edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template<foo *z> 912edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void zed() { 913edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 914edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 915edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 916edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template void bar::zed<&x>(); 917edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv 918edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test493bar3zedIXadL_ZNS_1xEEEEEvv 919edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola} 920edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 921edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test50 { 922edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // Test that we use the visibility of struct foo when instantiating the 923edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // template. Note that is a case where we disagree with gcc, it produces 924edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // a default symbol. 925edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 926edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct HIDDEN foo { 927edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 928edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola DEFAULT foo x; 929edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template<foo *z> 930edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct DEFAULT bar { 931edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void zed() { 932edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 933edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 934edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template void bar<&x>::zed(); 935edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv 936edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test503barIXadL_ZNS_1xEEEE3zedEv 937edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola} 938edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 939edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test51 { 940edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // Test that we use the visibility of struct foo when instantiating the 941edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // template. Note that is a case where we disagree with gcc, it produces 942edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // a default symbol. 943edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 944edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct HIDDEN foo { 945edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 946edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola DEFAULT foo x; 947edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template<foo *z> 948edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void DEFAULT zed() { 949edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 950edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template void zed<&x>(); 951edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv 952edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK-HIDDEN: define weak_odr hidden void @_ZN6test513zedIXadL_ZNS_1xEEEEEvv 953edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola} 954edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 955edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindolanamespace test52 { 956edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // Test that we use the linkage of struct foo when instantiating the 957edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // template. Note that is a case where we disagree with gcc, it produces 958edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // an external symbol. 959edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola 960edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola namespace { 961edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola struct foo { 962edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola }; 963edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 964edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola template<foo *x> 965edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void zed() { 966edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 967edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola void f() { 968edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola zed<nullptr>(); 969edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola } 970edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv 971edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola // CHECK-HIDDEN: define internal void @_ZN6test523zedILPNS_12_GLOBAL__N_13fooE0EEEvv 972edb4b626130cc8268b1d7a3f9a9fdc7fb4c3a2bbRafael Espindola} 973f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola 974f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindolanamespace test53 { 975f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola template<typename _Tp > struct vector { 976f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola static void _M_fill_insert(); 977f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola }; 978f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola#pragma GCC visibility push(hidden) 9798d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // GCC doesn't seem to use the visibility of enums at all, we do. 9808d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola enum zed {v1}; 9818d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola 9828d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // GCC fails to mark this specialization hidden, we mark it. 9838d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola template<> 9848d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola struct vector<int> { 9858d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola static void _M_fill_insert(); 9868d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola }; 987f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola void foo() { 988f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola vector<unsigned>::_M_fill_insert(); 9898d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola vector<int>::_M_fill_insert(); 9908d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola vector<zed>::_M_fill_insert(); 991f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola } 992f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola#pragma GCC visibility pop 993f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola // CHECK: declare void @_ZN6test536vectorIjE14_M_fill_insertEv 994f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola // CHECK-HIDDEN: declare void @_ZN6test536vectorIjE14_M_fill_insertEv 9958d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // CHECK: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv 9968d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorIiE14_M_fill_insertEv 9978d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // CHECK: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv 9988d71918ec9899b07a649ba3a3de2fb6a2e07ec4aRafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test536vectorINS_3zedEE14_M_fill_insertEv 999f2f15b3bc6820469024db170c87ffe885ec53cf9Rafael Espindola} 10005e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola 10015e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindolanamespace test54 { 10025e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola template <class T> 10035e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola struct foo { 10045e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola static void bar(); 10055e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola }; 10065e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola#pragma GCC visibility push(hidden) 10075e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola class zed { 10085e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola zed(const zed &); 10095e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola }; 10105e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola void bah() { 10115e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola foo<zed>::bar(); 10125e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola } 10135e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola#pragma GCC visibility pop 10145e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola // CHECK: declare hidden void @_ZN6test543fooINS_3zedEE3barEv 10155e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test543fooINS_3zedEE3barEv 10165e06529f3bbb4459be21b57dd918880a02f95cb2Rafael Espindola} 101723458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola 101823458208b25acd7d2dfa003b029299e30124fe5fRafael Espindolanamespace test55 { 101923458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola template <class T> 102023458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola struct __attribute__((visibility("hidden"))) foo { 102123458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola static void bar(); 102223458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola }; 102323458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola template <class T> struct foo; 102423458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola void foobar() { 102523458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola foo<int>::bar(); 102623458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola } 102723458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola // CHECK: declare hidden void @_ZN6test553fooIiE3barEv 102823458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test553fooIiE3barEv 102923458208b25acd7d2dfa003b029299e30124fe5fRafael Espindola} 1030d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola 1031d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindolanamespace test56 { 1032d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola template <class T> struct foo; 1033d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola template <class T> 1034d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola struct __attribute__((visibility("hidden"))) foo { 1035d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola static void bar(); 1036d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola }; 1037d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola void foobar() { 1038d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola foo<int>::bar(); 1039d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola } 1040d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola // CHECK: declare hidden void @_ZN6test563fooIiE3barEv 1041d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test563fooIiE3barEv 1042d3d02dd0ae17eabc8e0b8972ac6a3863534b39d2Rafael Espindola} 10436b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola 10446b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindolanamespace test57 { 10456b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola#pragma GCC visibility push(hidden) 10466b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola template <class T> 10476b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola struct foo; 10486b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola void bar(foo<int>*); 10496b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola template <class T> 10506b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola struct foo { 10516b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola static void zed(); 10526b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola }; 10536b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola void bah() { 10546b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola foo<int>::zed(); 10556b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola } 10566b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola#pragma GCC visibility pop 10576b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola // CHECK: declare hidden void @_ZN6test573fooIiE3zedEv 10586b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola // CHECK-HIDDEN: declare hidden void @_ZN6test573fooIiE3zedEv 10596b60370ddb5b63e93f25dfbed920be0f335ddad3Rafael Espindola} 1060becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola 1061becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindolanamespace test58 { 1062becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola#pragma GCC visibility push(hidden) 1063becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola struct foo; 1064becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola template<typename T> 1065becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola struct __attribute__((visibility("default"))) bar { 1066becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola static void zed() { 1067becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola } 1068becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola }; 1069becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola void bah() { 1070becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola bar<foo>::zed(); 1071becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola } 1072becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola#pragma GCC visibility pop 1073becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv 1074becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test583barINS_3fooEE3zedEv 1075becfc2325c9b645d2208b2a5389b709fd3d75576Rafael Espindola} 10766d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola 10776d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindolanamespace test59 { 10786d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola DEFAULT int f(); 10796d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola HIDDEN int g(); 10806d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola typedef int (*foo)(); 10816d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola template<foo x, foo y> 10826d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola void test() {} 10836d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola void use() { 10846d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola test<&g, &f>(); 10856d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv 10866d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1gEvEEXadL_ZNS_1fEvEEEEvv 10876d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola 10886d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola test<&f, &g>(); 10896d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv 10906d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test594testIXadL_ZNS_1fEvEEXadL_ZNS_1gEvEEEEvv 10916d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola } 10926d4a40edb5854d4723e7d25b0e908310b54cc6a0Rafael Espindola} 109398499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola 109498499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindolanamespace test60 { 109598499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola template<int i> 109698499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola class __attribute__((visibility("hidden"))) a {}; 109798499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola template<int i> 109898499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola class __attribute__((visibility("default"))) b {}; 109998499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola template<template<int> class x, template<int> class y> 110098499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola void test() {} 110198499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola void use() { 110298499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola test<a, b>(); 110398499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv 110498499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test604testINS_1aENS_1bEEEvv 110598499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola 110698499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola test<b, a>(); 110798499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola // CHECK: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv 110898499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola // CHECK-HIDDEN: define linkonce_odr hidden void @_ZN6test604testINS_1bENS_1aEEEvv 110998499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola } 111098499013bd70ec584f4c01c45106ec3e8203f16cRafael Espindola} 1111838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola 1112838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test61 { 1113838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template <typename T1> 1114838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola struct Class1 1115838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola { 1116838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola void f1() { f2(); } 1117838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola inline void f2(); 1118838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola }; 1119838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template<> 1120838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola inline void Class1<int>::f2() 1121838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola { 1122838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola } 1123838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola void g(Class1<int> *x) { 1124838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola x->f1(); 1125838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola } 1126838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola} 1127838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test61 { 1128838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // Just test that we don't crash. Currently we apply this attribute. Current 1129838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // gcc issues a warning about it being unused since "the type is already 1130838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // defined". We should probably do the same. 1131838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template class __attribute__ ((visibility("hidden"))) Class1<int>; 1132838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola} 1133838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola 1134838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test62 { 1135838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template <typename T1> 1136838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola struct Class1 1137838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola { 1138838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola void f1() { f2(); } 1139838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola inline void f2() {} 1140838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola }; 1141838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template<> 1142838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola inline void Class1<int>::f2() 1143838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola { 1144838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola } 1145838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola void g(Class1<int> *x) { 1146838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola x->f2(); 1147838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola } 1148838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola} 1149838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindolanamespace test62 { 1150838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola template class __attribute__ ((visibility("hidden"))) Class1<int>; 1151838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // Just test that we don't crash. Currently we apply this attribute. Current 1152838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // gcc issues a warning about it being unused since "the type is already 1153838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola // defined". We should probably do the same. 1154838dc597e25614c653a062a124b06a04d6b7f5ebRafael Espindola} 11555a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall 11565a758de93fa2a28a84eb0d918a31d9522472990cJohn McCallnamespace test63 { 11575a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall enum HIDDEN E { E0 }; 11585a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall struct A { 11595a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall template <E> static void foo() {} 11605a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall 11615a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall template <E> struct B { 11625a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall static void foo() {} 11635a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall }; 11645a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall }; 11655a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall 11665a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall void test() { 11675a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall A::foo<E0>(); 11685a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall A::B<E0>::foo(); 11695a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall } 11705a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK: define linkonce_odr hidden void @_ZN6test631A3fooILNS_1EE0EEEvv() 11715a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall // CHECK: define linkonce_odr hidden void @_ZN6test631A1BILNS_1EE0EE3fooEv() 11725a758de93fa2a28a84eb0d918a31d9522472990cJohn McCall} 1173d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 1174d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// Don't ignore the visibility of template arguments just because we 1175d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall// explicitly instantiated something. 1176d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCallnamespace test64 { 1177d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall struct HIDDEN A {}; 1178d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template <class P> struct B { 1179d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall static DEFAULT void foo() {} 1180d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall }; 1181d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall 1182d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall template class B<A>; 1183d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall // CHECK: define weak_odr hidden void @_ZN6test641BINS_1AEE3fooEv() 1184d4c3d66be70ae2d0bd828329022dc428cc277a1cJohn McCall} 11853892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 11863892d022f36ee5bf3be4a55ea01c08d323ef6235John McCallnamespace test65 { 11873892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall class HIDDEN A {}; 11883892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <class T> struct B { 11893892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall static void func(); 11903892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <class U> static void funcT1(); 11913892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <class U> static void funcT2(); 11923892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall class Inner {}; 11933892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <class U> class InnerT {}; 11943892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall }; 11953892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <template <class T> class Temp> struct C { 11963892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall static void foo() {} 11973892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall }; 11983892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 11993892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall // CHECK: define void @_ZN6test651BINS_1AEE4funcEv() 12003892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> DEFAULT void B<A>::func() {} 12013892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 12023892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall // CHECK: define void @_ZN6test651BINS_1AEE6funcT2IS1_EEvv() 12033892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> template <> DEFAULT void B<A>::funcT2<A>() {} 12043892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 12053892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall // CHECK: define linkonce_odr void @_ZN6test651BINS_1AEE6funcT1IiEEvv() 12063892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall // CHECK: define linkonce_odr hidden void @_ZN6test651BINS_1AEE6funcT1IS1_EEvv() 12073892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> template <class T> DEFAULT void B<A>::funcT1() {} 12083892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 12093892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall // CHECK: define linkonce_odr void @_ZN6test651BINS_1AEE5Inner3fooEv() 12103892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> struct DEFAULT B<A>::Inner { 12113892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall static void foo() {} 12123892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall }; 12133892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 12143892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall // CHECK: define linkonce_odr void @_ZN6test651BINS_1AEE6InnerTIiE3fooEv() 12153892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall // CHECK: define linkonce_odr hidden void @_ZN6test651BINS_1AEE6InnerTIS1_E3fooEv() 12163892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template <> template <class U> struct DEFAULT B<A>::InnerT { 12173892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall static void foo() {} 12183892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall }; 12193892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 12203892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall void test() { 12213892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::funcT1<int>(); 12223892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::funcT1<A>(); 12233892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::Inner::foo(); 12243892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::InnerT<int>::foo(); 12253892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall B<A>::InnerT<A>::foo(); 12263892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall } 12273892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall 12283892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall template class C<B<A>::InnerT>; 12293892d022f36ee5bf3be4a55ea01c08d323ef6235John McCall} 1230d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola 1231d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindolanamespace test66 { 1232d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template <typename T> 1233d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola struct __attribute__((visibility("default"))) barT { 1234d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola static void zed() {} 1235d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola }; 1236d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola class foo; 1237d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola class __attribute__((visibility("default"))) foo; 1238d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template struct barT<foo>; 1239d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola // CHECK: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv 1240d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test664barTINS_3fooEE3zedEv 1241d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola 1242d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template <int* I> 1243d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola struct __attribute__((visibility("default"))) barI { 1244d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola static void zed() {} 1245d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola }; 1246d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola extern int I; 1247d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola extern int I __attribute__((visibility("default"))); 1248d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template struct barI<&I>; 1249d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola // CHECK: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv 1250d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test664barIIXadL_ZNS_1IEEEE3zedEv 1251d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola 1252d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola typedef void (*fType)(void); 1253d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template<fType F> 1254d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola struct __attribute__((visibility("default"))) barF { 1255d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola static void zed() {} 1256d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola }; 1257d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola void F(); 1258d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola void F() __attribute__((visibility("default")));; 1259d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola template struct barF<F>; 1260d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola // CHECK: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv 1261d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola // CHECK-HIDDEN: define weak_odr void @_ZN6test664barFIXadL_ZNS_1FEvEEE3zedEv 1262d3b2f0ac1cedad284d860acd652f28a05bcbcbedRafael Espindola} 1263