blob: 1b69c3b2a48ac9cc0766c6a5192388314c1e8e23 [file] [log] [blame]
// CWG 1001/1322
// PR c++/101402
// PR c++/102033
// PR c++/102034
// PR c++/102039
// PR c++/102044
namespace test2{
template <class T>
void f(const T);
template<>
void f<int[]>(const int*){}
}
namespace test3{
template <class T>
struct A{
void f(T);
};
template<class T>
void A<T>::f(const T){}
template<>
void A<int[3]>::f(const int*){}
}
namespace test4 {
template<class TA>
struct A{
template<class TB>
struct B{
typedef TB Arr3[3];
};
};
template<class TA, class TB>
void f(const typename A<TA>::template B<TB>::Arr3){}
template <>
void f<int, char>(const typename A<int>::B<char>::Arr3){}
}
namespace test5
{
struct A{
typedef int Arr3[3];
};
template<class T>
void f(const typename T::Arr3){}
template<>
void f<A>(const int[3]){}
}
namespace test6
{
struct A{
typedef int Arr3[3];
};
template<class T>
void f(const typename T::Arr3){}
template<>
void f<A>(const int*){}
}
#if __cpp_alias_templates
namespace test7
{
template<class TA>
struct A{
template<class TB>
using Type=TB[3];
};
template<class TA, class TB>
void f(const typename A<TA>::template Type<TB>){}
template <>
void f<int, char>(const typename A<int>::template Type<char>){}
}
namespace test8
{
template<class TA>
struct A{
template<class TB>
struct B{
using TB_Alias=TB;
template<class TC=TB_Alias>
struct C{
typedef TC Arr3[3];
};
};
};
template<class TA, class TB>
void f(const typename A<TA>::template B<TB>::template C<>::Arr3){}
template <>
void f<int, char>(const typename A<int>::template B<char>::template C<>::Arr3){}
}
#endif
#if __cpp_decltype
namespace test0
{
template <class T>
struct A{
T arr3[3];
};
template <class T>
void f(const decltype(A<T>::arr3)){}
template <>
void f<int>(const int[3]){}
}
#if __cpp_variable_templates
namespace test9
{
template<unsigned int N, class T>
void f(const T[N]){}
template<unsigned int N, class T>
using fPtr=decltype(f<N,T>)*;
template<unsigned int N, class T>
fPtr<N,T> af[N]={&f<N,T>};
template<unsigned int N, class T>
void g(const decltype(af<N,T>)){}
template<>
void g<1,int>(const fPtr<1,int>[1]){}
}
#endif
#endif
#if __cpp_concepts
template<class T>
concept IsLambdaAry3=__is_same(T, decltype(+[]{})[3]);
template<IsLambdaAry3 T>
void bar(const T){}
template<>
void bar<decltype(+[]{})[3]>(const decltype(+[]{})[3]){}
#endif