Home | History | Annotate | Download | only in Inputs
      1 #include "cxx-templates-common.h"
      2 
      3 namespace hidden_specializations {
      4   // explicit specializations
      5   template<> void fn<int>() {}
      6   template<> struct cls<int> {
      7     void nested_fn();
      8     struct nested_cls;
      9     static int nested_var;
     10     enum nested_enum : int;
     11   };
     12   template<> int var<int>;
     13 
     14   // partial specializations
     15   template<typename T> struct cls<T*> {
     16     void nested_fn();
     17     struct nested_cls;
     18     static int nested_var;
     19     enum nested_enum : int;
     20   };
     21   template<typename T> int var<T*>;
     22 
     23   // member specializations
     24   template<> void cls<void>::nested_fn() {}
     25   template<> struct cls<void>::nested_cls {};
     26   template<> int cls<void>::nested_var;
     27   template<> enum class cls<void>::nested_enum { e };
     28   template<> template<typename U> void cls<void>::nested_fn_t() {}
     29   template<> template<typename U> struct cls<void>::nested_cls_t {};
     30   template<> template<typename U> int cls<void>::nested_var_t;
     31 
     32   // specializations instantiated here are ok if their pattern is
     33   inline void use_stuff() {
     34     fn<char>();
     35     cls<char>();
     36     (void)var<char>;
     37     cls<char*>();
     38     (void)var<char*>;
     39     cls<void>::nested_fn_t<char>();
     40     cls<void>::nested_cls_t<char>();
     41     (void)cls<void>::nested_var_t<char>;
     42   }
     43 }
     44