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
This commit is contained in:
parent
7356fbde50
commit
ed99e818e0
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue