Add __is_nothrow_convertible to fix std::is_nothrow_invocable_r
authorJonathan Wakely <jwakely@redhat.com>
Tue, 14 May 2019 14:39:58 +0000 (15:39 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 14 May 2019 14:39:58 +0000 (15:39 +0100)
commitce9f305e44ff0353ee9e6cb07599240354ae9ed2
treebbe2f05868657c7771ea3a3e5a4dac499bfa24e3
parent1158c5b424c9c3a24a47e6cdfce923b373d9b013
Add __is_nothrow_convertible to fix std::is_nothrow_invocable_r

The definition of is_nothrow_invocable in terms of is_convertible and
is_nothrow_constructible is incorrect, because a type could have an
explicit constructor that means is_nothrow_constructible is true, but
implicit conversions could use a different constructor that is
potentially-throwing.

Fix it by adding a C++11 version of C++20's is_nothrow_convertible that
only considers implicit conversions.

* include/std/type_traits (__is_nt_convertible_helper): Define it
unconditionally, not only for C++20.
(__is_nothrow_convertible): Define internal trait for use in C++11.
(__is_nt_invocable_impl: Fix by using __is_nothrow_convertible.
(is_invocable_r_v, is_nothrow_invocable_r_v): Add missing parameter.
* testsuite/20_util/is_nothrow_convertible/value_ext.cc: New test.
* testsuite/20_util/is_nothrow_convertible/value.cc: Check with type
that has nothrow explicit conversion but potentially-throwing implicit
conversion.
* testsuite/20_util/is_nothrow_invocable/value.cc: Likewise.
* testsuite/20_util/is_nothrow_invocable/value_ext.cc: Fix helper
function to only consider implicit conversions.
* testsuite/20_util/tuple/cons/noexcept_specs.cc: Add comment.

From-SVN: r271171
libstdc++-v3/ChangeLog
libstdc++-v3/include/std/type_traits
libstdc++-v3/testsuite/20_util/is_nothrow_convertible/value.cc
libstdc++-v3/testsuite/20_util/is_nothrow_convertible/value_ext.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/is_nothrow_invocable/value.cc
libstdc++-v3/testsuite/20_util/is_nothrow_invocable/value_ext.cc
libstdc++-v3/testsuite/20_util/tuple/cons/noexcept_specs.cc