1#include "cxx-templates-common.h"
2
3namespace 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