1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 
3 namespace test0 {
4   char* p = 0;
g(T x=& p)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 {
make()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:
Temp(int x)43     Temp(int x) {}
44   };
45 
make()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