diff --git a/include/type_traits b/include/type_traits index 371a15e0..c0e1a6df 100644 --- a/include/type_traits +++ b/include/type_traits @@ -1697,6 +1697,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...), true, false> typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false> { @@ -1705,6 +1713,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const, true, false typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, false> { @@ -1713,6 +1729,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile, true, fa typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, true, false> { @@ -1721,6 +1745,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile, tr typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + #if __has_feature(cxx_reference_qualified_functions) template @@ -1731,6 +1763,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &, true, false> typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) &, true, false> +{ + typedef _Class& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, false> { @@ -1739,6 +1779,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&, true, fals typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&, true, false> +{ + typedef _Class const& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, false> { @@ -1747,6 +1795,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&, true, f typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&, true, false> +{ + typedef _Class volatile& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, true, false> { @@ -1755,6 +1811,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&, t typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&, true, false> +{ + typedef _Class const volatile& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &&, true, false> { @@ -1763,6 +1827,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) &&, true, false> typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) &&, true, false> +{ + typedef _Class&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, false> { @@ -1771,6 +1843,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const&&, true, fal typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const&&, true, false> +{ + typedef _Class const&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, false> { @@ -1779,6 +1859,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) volatile&&, true, typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) volatile&&, true, false> +{ + typedef _Class volatile&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, true, false> { @@ -1787,6 +1875,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param...) const volatile&&, typedef _Rp (_FnType) (_Param...); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_Param..., ...) const volatile&&, true, false> +{ + typedef _Class const volatile&& _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_Param..., ...); +}; + #endif // __has_feature(cxx_reference_qualified_functions) #else // _LIBCPP_HAS_NO_VARIADICS @@ -1799,6 +1895,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(), true, false> typedef _Rp (_FnType) (); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(...), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0), true, false> { @@ -1807,6 +1911,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0), true, false> typedef _Rp (_FnType) (_P0); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1), true, false> { @@ -1815,6 +1927,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1), true, false> typedef _Rp (_FnType) (_P0, _P1); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, _P1, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2), true, false> { @@ -1823,6 +1943,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2), true, false> typedef _Rp (_FnType) (_P0, _P1, _P2); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...), true, false> +{ + typedef _Class _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, _P1, _P2, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)() const, true, false> { @@ -1831,6 +1959,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)() const, true, false> typedef _Rp (_FnType) (); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const, true, false> { @@ -1839,6 +1975,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const, true, false> typedef _Rp (_FnType) (_P0); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const, true, false> { @@ -1847,6 +1991,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const, true, false> typedef _Rp (_FnType) (_P0, _P1); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, _P1, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const, true, false> { @@ -1855,6 +2007,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const, true, f typedef _Rp (_FnType) (_P0, _P1, _P2); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) const, true, false> +{ + typedef _Class const _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, _P1, _P2, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)() volatile, true, false> { @@ -1863,6 +2023,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)() volatile, true, false> typedef _Rp (_FnType) (); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) volatile, true, false> { @@ -1871,6 +2039,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) volatile, true, false> typedef _Rp (_FnType) (_P0); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) volatile, true, false> { @@ -1879,6 +2055,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) volatile, true, fal typedef _Rp (_FnType) (_P0, _P1); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, _P1, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) volatile, true, false> { @@ -1887,6 +2071,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) volatile, true typedef _Rp (_FnType) (_P0, _P1, _P2); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) volatile, true, false> +{ + typedef _Class volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, _P1, _P2, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)() const volatile, true, false> { @@ -1895,6 +2087,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)() const volatile, true, false typedef _Rp (_FnType) (); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const volatile, true, false> { @@ -1903,6 +2103,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0) const volatile, true, fa typedef _Rp (_FnType) (_P0); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, ...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const volatile, true, false> { @@ -1911,6 +2119,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1) const volatile, tru typedef _Rp (_FnType) (_P0, _P1); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, ...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, _P1, ...); +}; + template struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const volatile, true, false> { @@ -1919,6 +2135,14 @@ struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2) const volatile typedef _Rp (_FnType) (_P0, _P1, _P2); }; +template +struct __member_pointer_traits_imp<_Rp (_Class::*)(_P0, _P1, _P2, ...) const volatile, true, false> +{ + typedef _Class const volatile _ClassType; + typedef _Rp _ReturnType; + typedef _Rp (_FnType) (_P0, _P1, _P2, ...); +}; + #endif // _LIBCPP_HAS_NO_VARIADICS template diff --git a/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp b/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp index c5638702..67ef3db2 100644 --- a/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp +++ b/test/utilities/meta/meta.unary/meta.unary.cat/member_function_pointer.pass.cpp @@ -61,6 +61,18 @@ int main() test_member_function_pointer(); test_member_function_pointer(); + test_member_function_pointer(); + test_member_function_pointer(); + test_member_function_pointer(); + + test_member_function_pointer(); + test_member_function_pointer(); + test_member_function_pointer(); + + test_member_function_pointer(); + test_member_function_pointer(); + test_member_function_pointer(); + #if __cplusplus >= 201103L // reference qualifiers on functions are a C++11 extension test_member_function_pointer(); @@ -74,5 +86,17 @@ int main() test_member_function_pointer(); test_member_function_pointer(); test_member_function_pointer(); + + test_member_function_pointer(); + test_member_function_pointer(); + test_member_function_pointer(); + + test_member_function_pointer(); + test_member_function_pointer(); + test_member_function_pointer(); + + test_member_function_pointer(); + test_member_function_pointer(); + test_member_function_pointer(); #endif }