aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-02-05 15:45:24 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2019-02-05 15:45:24 +0000
commited99e818e02cd7b0c10c9e8cba7fec8ee17b0ca7 (patch)
tree05d62d0809c00286cbb2770e05c70fdde6e5dfc1
parent7356fbde50dd4bfd55eaa0bed31b31da55d1461c (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--libstdc++-v3/include/std/type_traits45
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