From: Jonathan Wakely Date: Tue, 5 Feb 2019 15:45:24 +0000 (+0000) Subject: PR libstdc++/89194 untangle is_convertible and is_nothrow_convertible X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ed99e818e02cd7b0c10c9e8cba7fec8ee17b0ca7;p=gcc.git PR libstdc++/89194 untangle is_convertible and is_nothrow_convertible The additional logic added to __is_convertible_helper in order to support is_nothrow_convertible makes some uses of is_convertible ill-formed. This appears to be due to PR c++/87603, but can be avoided just by defining a separate helper for is_nothrow_convertible. The same problems are likely to still exist for is_nothrow_convertible, but that is new and so won't cause regressions for existing users of is_convertible. PR libstdc++/89194 * include/std/type_traits (__is_convertible_helper) (__is_convertible_helper<_From, _To, false>): Revert changes to support is_nothrow_convertible. (__is_nt_convertible_helper): New helper. (is_nothrow_convertible): Use __is_nt_convertible_helper. From-SVN: r268543 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index fda3f4fbfd9..5408cc72bf4 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2019-02-05 Jonathan Wakely + PR libstdc++/89194 + * include/std/type_traits (__is_convertible_helper) + (__is_convertible_helper<_From, _To, false>): Revert changes to + support is_nothrow_convertible. + (__is_nt_convertible_helper): New helper. + (is_nothrow_convertible): Use __is_nt_convertible_helper. + * testsuite/23_containers/vector/modifiers/push_back/49836.cc: Restore use of CopyConsOnlyType, but also test DelAnyAssign for completeness. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 7c7aeeb3b32..f05a583cb04 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -1344,9 +1344,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION struct __is_convertible_helper { typedef typename is_void<_To>::type type; -#if __cplusplus > 201703L - typedef type __is_nothrow_type; -#endif }; template @@ -1364,23 +1361,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static false_type __test(...); -#if __cplusplus > 201703L - template(std::declval<_From1>()))> - static __bool_constant<_NoEx> - __test_nothrow(int); - - template - static false_type - __test_nothrow(...); -#endif - public: typedef decltype(__test<_From, _To>(0)) type; - -#if __cplusplus > 201703L - typedef decltype(__test_nothrow<_From, _To>(0)) __is_nothrow_type; -#endif }; @@ -1391,10 +1373,35 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { }; #if __cplusplus > 201703L + template, is_function<_To>, + is_array<_To>>::value> + struct __is_nt_convertible_helper + : is_void<_To> + { }; + + template + class __is_nt_convertible_helper<_From, _To, false> + { + template + static void __test_aux(_To1) noexcept; + + template + static bool_constant(std::declval<_From1>()))> + __test(int); + + template + static false_type + __test(...); + + public: + using type = decltype(__test<_From, _To>(0)); + }; + /// is_nothrow_convertible template struct is_nothrow_convertible - : public __is_convertible_helper<_From, _To>::__is_nothrow_type + : public __is_nt_convertible_helper<_From, _To>::type { }; /// is_nothrow_convertible_v