xref: /llvm-project/clang/test/Modules/Inputs/cxx-templates-unimported.h (revision 6739a10cec3d5681cc1c0f793be58756dfe0537a)
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