1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | namespace test0 { |
4 | char* p = 0; |
5 | template<class T> T g(T x = &p) { return x; } |
6 | template int g<int>(int); // OK even though &p isn't an int. |
7 | } |
8 | |
9 | // Don't impose access restrictions on explicit instantiations. |
10 | namespace test1 { |
11 | class A { |
12 | class Private {}; |
13 | public: |
14 | typedef Private Public; |
15 | }; |
16 | |
17 | template <class T> class Temp { |
18 | static Temp<A::Public> make() { return Temp<A::Public>(); } |
19 | }; |
20 | template class Temp<A::Private>; |
21 | |
22 | // FIXME: this ought to be an error, but it isn't because Sema is |
23 | // silently failing to create a declaration for the explicit |
24 | // instantiation. |
25 | template class Temp<A::Private> Temp<int>::make(); |
26 | } |
27 | |
28 | // Don't impose access restrictions on explicit specializations, |
29 | // either. This goes here because it's an extension of the rule for |
30 | // explicit instantiations and doesn't have any independent support. |
31 | namespace test2 { |
32 | class A { |
33 | class Private {}; // expected-note {{implicitly declared private here}} |
34 | public: |
35 | typedef Private Public; |
36 | }; |
37 | |
38 | template <class T> class Temp { |
39 | static Temp<A::Public> make(); |
40 | }; |
41 | template <> class Temp<A::Private> { |
42 | public: |
43 | Temp(int x) {} |
44 | }; |
45 | |
46 | template <> class Temp<A::Private> Temp<int>::make() { // expected-error {{'Private' is a private member of 'test2::A'}} |
47 | return Temp<A::Public>(0); |
48 | } |
49 | } |
50 | |