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