diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2019-02-05 15:45:24 +0000 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2019-02-05 15:45:24 +0000 |
commit | ed99e818e02cd7b0c10c9e8cba7fec8ee17b0ca7 (patch) | |
tree | 05d62d0809c00286cbb2770e05c70fdde6e5dfc1 | |
parent | 7356fbde50dd4bfd55eaa0bed31b31da55d1461c (diff) | |
download | gcc-ed99e818e02cd7b0c10c9e8cba7fec8ee17b0ca7.zip gcc-ed99e818e02cd7b0c10c9e8cba7fec8ee17b0ca7.tar.gz gcc-ed99e818e02cd7b0c10c9e8cba7fec8ee17b0ca7.tar.bz2 |
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
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/std/type_traits | 45 |
2 files changed, 33 insertions, 19 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index fda3f4f..5408cc7 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,12 @@ 2019-02-05 Jonathan Wakely <jwakely@redhat.com> + 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 7c7aeeb..f05a583 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<typename _From, typename _To> @@ -1364,23 +1361,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION static false_type __test(...); -#if __cplusplus > 201703L - template<typename _From1, typename _To1, - bool _NoEx = noexcept(__test_aux<_To1>(std::declval<_From1>()))> - static __bool_constant<_NoEx> - __test_nothrow(int); - - template<typename, typename> - 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<typename _From, typename _To, + bool = __or_<is_void<_From>, is_function<_To>, + is_array<_To>>::value> + struct __is_nt_convertible_helper + : is_void<_To> + { }; + + template<typename _From, typename _To> + class __is_nt_convertible_helper<_From, _To, false> + { + template<typename _To1> + static void __test_aux(_To1) noexcept; + + template<typename _From1, typename _To1> + static bool_constant<noexcept(__test_aux<_To1>(std::declval<_From1>()))> + __test(int); + + template<typename, typename> + static false_type + __test(...); + + public: + using type = decltype(__test<_From, _To>(0)); + }; + /// is_nothrow_convertible template<typename _From, typename _To> 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 |