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