1// Test for explicit visibility on template vs. #pragma vis at explicit 2// instantiation/specialization point for plain function templates. 3 4// { dg-require-visibility "" } 5// { dg-final { scan-hidden "_Z3fooIdEvT_" } } 6// { dg-final { scan-hidden "_Z3fooIlEvT_" } } 7// { dg-final { scan-hidden "_Z3fooIcEvT_" } } 8// { dg-final { scan-hidden "_Z3fooIiEvT_" } } 9// { dg-final { scan-not-hidden "_Z3fooIfEvT_" } } 10// { dg-final { scan-not-hidden "_Z3fooIsEvT_" } } 11 12// { dg-final { scan-hidden "_Z3barIdEvT_" } } 13// { dg-final { scan-hidden "_Z3barIlEvT_" } } 14// { dg-final { scan-hidden "_Z3barIiEvT_" } } 15// { dg-final { scan-hidden "_Z3barIcEvT_" } } 16// { dg-final { scan-not-hidden "_Z3barIfEvT_" } } 17// { dg-final { scan-not-hidden "_Z3barIsEvT_" } } 18 19#pragma GCC visibility push(hidden) 20template <class T> void bar(T) { } 21#pragma GCC visibility pop 22template void bar (long); 23template<> void bar (double) { } 24template __attribute ((visibility ("default"))) void bar (short); 25template<> __attribute ((visibility ("default"))) void bar (float) { } 26#pragma GCC visibility push(default) 27template<> void bar(char) { } 28template void bar(int); 29#pragma GCC visibility pop 30 31template <class T> __attribute ((visibility ("hidden"))) void foo(T) { } 32template void foo (long); 33template<> void foo (double) { } 34template __attribute ((visibility ("default"))) void foo (short); 35template<> __attribute ((visibility ("default"))) void foo (float) { } 36#pragma GCC visibility push(default) 37template<> void foo(char) { } 38template void foo(int); 39#pragma GCC visibility pop 40