| #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>; |
| } |
| } |