In C++17 a function can return a prvalue of a type that cannot be moved or copied. The current implementation of std::is_invocable_r uses std::is_convertible to test the conversion to R required by INVOKE<R>. That fails for non-copyable prvalues, because std::is_convertible is defined in terms of std::declval which uses std::add_rvalue_reference. In C++17 conversion from R to R involves no copies and so is not the same as conversion from R&& to R. This commit changes std::is_invocable_r to check the conversion without using std::is_convertible. std::function also contains a similar check using std::is_convertible, which can be fixed by simply reusing std::is_invocable_r (but because std::is_invocable_r is not defined for C++11 it uses the underlying std::__is_invocable_impl trait directly). PR libstdc++/91456 * include/bits/std_function.h (__check_func_return_type): Remove. (function::_Callable): Use std::__is_invocable_impl instead of __check_func_return_type. * include/std/type_traits (__is_invocable_impl): Add another defaulted template parameter. Define a separate partial specialization for INVOKE and INVOKE<void>. For INVOKE<R> replace is_convertible check with a check that models delayed temporary materialization. * testsuite/20_util/function/91456.cc: New test. * testsuite/20_util/is_invocable/91456.cc: New test. From-SVN: r274542
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| assign | Loading commit data... | |
| cmp | Loading commit data... | |
| cons | Loading commit data... | |
| invoke | Loading commit data... | |
| requirements | Loading commit data... | |
| 1.cc | Loading commit data... | |
| 10.cc | Loading commit data... | |
| 2.cc | Loading commit data... | |
| 3.cc | Loading commit data... | |
| 4.cc | Loading commit data... | |
| 43397.cc | Loading commit data... | |
| 48541.cc | Loading commit data... | |
| 5.cc | Loading commit data... | |
| 58569.cc | Loading commit data... | |
| 6.cc | Loading commit data... | |
| 60594.cc | Loading commit data... | |
| 63840.cc | Loading commit data... | |
| 65760.cc | Loading commit data... | |
| 68995.cc | Loading commit data... | |
| 69222.cc | Loading commit data... | |
| 7.cc | Loading commit data... | |
| 77322.cc | Loading commit data... | |
| 8.cc | Loading commit data... | |
| 9.cc | Loading commit data... | |
| 91456.cc | Loading commit data... | |
| null_pointer_comparisons.cc | Loading commit data... |