Home | History | Annotate | Download | only in temp.explicit
      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