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