xref: /aosp_15_r20/external/clang/test/Modules/Inputs/cxx-templates-unimported.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
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