Commit ed99e818 by Jonathan Wakely Committed by Jonathan Wakely

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
parent 7356fbde
2019-02-05 Jonathan Wakely <jwakely@redhat.com> 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 * testsuite/23_containers/vector/modifiers/push_back/49836.cc: Restore
use of CopyConsOnlyType, but also test DelAnyAssign for completeness. use of CopyConsOnlyType, but also test DelAnyAssign for completeness.
......
...@@ -1344,9 +1344,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1344,9 +1344,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
struct __is_convertible_helper struct __is_convertible_helper
{ {
typedef typename is_void<_To>::type type; typedef typename is_void<_To>::type type;
#if __cplusplus > 201703L
typedef type __is_nothrow_type;
#endif
}; };
template<typename _From, typename _To> template<typename _From, typename _To>
...@@ -1364,23 +1361,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION ...@@ -1364,23 +1361,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
static false_type static false_type
__test(...); __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: public:
typedef decltype(__test<_From, _To>(0)) type; 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 ...@@ -1391,10 +1373,35 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ }; { };
#if __cplusplus > 201703L #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 /// is_nothrow_convertible
template<typename _From, typename _To> template<typename _From, typename _To>
struct is_nothrow_convertible 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 /// is_nothrow_convertible_v
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment