|  | #include "cxx-templates-common.h" | 
|  |  | 
|  | namespace hidden_specializations { | 
|  | // explicit specializations | 
|  | template<> void fn<int>() {} | 
|  | template<> struct cls<int> { | 
|  | void nested_fn(); | 
|  | struct nested_cls; | 
|  | static int nested_var; | 
|  | enum nested_enum : int; | 
|  | }; | 
|  | template<> int var<int>; | 
|  |  | 
|  | // partial specializations | 
|  | template<typename T> struct cls<T*> { | 
|  | void nested_fn(); | 
|  | struct nested_cls; | 
|  | static int nested_var; | 
|  | enum nested_enum : int; | 
|  | }; | 
|  | template<typename T> int var<T*>; | 
|  |  | 
|  | // member specializations | 
|  | template<> void cls<void>::nested_fn() {} | 
|  | template<> struct cls<void>::nested_cls {}; | 
|  | template<> int cls<void>::nested_var; | 
|  | template<> enum class cls<void>::nested_enum { e }; | 
|  | template<> template<typename U> void cls<void>::nested_fn_t() {} | 
|  | template<> template<typename U> struct cls<void>::nested_cls_t {}; | 
|  | template<> template<typename U> int cls<void>::nested_var_t; | 
|  |  | 
|  | // specializations instantiated here are ok if their pattern is | 
|  | inline void use_stuff() { | 
|  | fn<char>(); | 
|  | cls<char>(); | 
|  | (void)var<char>; | 
|  | cls<char*>(); | 
|  | (void)var<char*>; | 
|  | cls<void>::nested_fn_t<char>(); | 
|  | cls<void>::nested_cls_t<char>(); | 
|  | (void)cls<void>::nested_var_t<char>; | 
|  | } | 
|  | } |