1 // CWG 1001/1322
2 
3 // PR c++/101402
4 // PR c++/102033
5 // PR c++/102034
6 // PR c++/102039
7 // PR c++/102044
8 
9 namespace test2{
10 template <class T>
11 void f(const T);
12 
13 template<>
14 void f<int[]>(const int*){}
15 }
16 
17 namespace test3{
18 template <class T>
19 struct A{
20 void f(T);
21 };
22 
23 template<class T>
f(const T)24 void A<T>::f(const T){}
25 
26 template<>
f(const int *)27 void A<int[3]>::f(const int*){}
28 }
29 
30 namespace test4 {
31 template<class TA>
32 struct A{
33   template<class TB>
34   struct B{
35     typedef TB Arr3[3];
36   };
37 };
38 template<class TA, class TB>
f(const typename A<TA>::template B<TB>::Arr3)39 void f(const typename A<TA>::template B<TB>::Arr3){}
40 template <>
41 void f<int, char>(const typename A<int>::B<char>::Arr3){}
42 }
43 
44 namespace test5
45 {
46 struct A{
47   typedef int Arr3[3];
48 };
49 
50 template<class T>
f(const typename T::Arr3)51 void f(const typename T::Arr3){}
52 
53 template<>
54 void f<A>(const int[3]){}
55 }
56 
57 namespace test6
58 {
59 struct A{
60   typedef int Arr3[3];
61 };
62 template<class T>
f(const typename T::Arr3)63 void f(const typename T::Arr3){}
64 template<>
65 void f<A>(const int*){}
66 }
67 
68 #if __cpp_alias_templates
69 namespace test7
70 {
71 template<class TA>
72 struct A{
73   template<class TB>
74   using Type=TB[3];
75 };
76 template<class TA, class TB>
f(const typename A<TA>::template Type<TB>)77 void f(const typename A<TA>::template Type<TB>){}
78 template <>
79 void f<int, char>(const typename A<int>::template Type<char>){}
80 }
81 namespace test8
82 {
83 template<class TA>
84 struct A{
85   template<class TB>
86   struct B{
87     using TB_Alias=TB;
88     template<class TC=TB_Alias>
89     struct C{
90       typedef TC Arr3[3];
91     };
92   };
93 };
94 template<class TA, class TB>
f(const typename A<TA>::template B<TB>::template C<>::Arr3)95 void f(const typename A<TA>::template B<TB>::template C<>::Arr3){}
96 template <>
97 void f<int, char>(const typename A<int>::template B<char>::template C<>::Arr3){}
98 }
99 #endif
100 
101 #if __cpp_decltype
102 namespace test0
103 {
104 template <class T>
105 struct A{
106   T arr3[3];
107 };
108 template <class T>
f(const decltype (A<T>::arr3))109 void f(const decltype(A<T>::arr3)){}
110 template <>
111 void f<int>(const int[3]){}
112 }
113 
114 #if __cpp_variable_templates
115 namespace test9
116 {
117 template<unsigned int N, class T>
f(const T[N])118 void f(const T[N]){}
119 
120 template<unsigned int N, class T>
121 using fPtr=decltype(f<N,T>)*;
122 
123 template<unsigned int N, class T>
124 fPtr<N,T> af[N]={&f<N,T>};
125 
126 template<unsigned int N, class T>
g(const decltype (af<N,T>))127 void g(const decltype(af<N,T>)){}
128 
129 template<>
130 void g<1,int>(const fPtr<1,int>[1]){}
131 }
132 #endif
133 #endif
134 
135 #if __cpp_concepts
136 template<class T>
137 concept IsLambdaAry3=__is_same(T, decltype(+[]{})[3]);
138 template<IsLambdaAry3 T>
bar(const T)139 void bar(const T){}
140 template<>
141 void bar<decltype(+[]{})[3]>(const decltype(+[]{})[3]){}
142 #endif
143