mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
libstdc++: Deduce function_ref<M&() noexcept> from member object pointers.
Implement resolution of LWG4425. libstdc++-v3/ChangeLog: * include/bits/funcwrap.h (__polyfunc::__deduce_funcref): Adjust signature produced for member object pointers. * testsuite/20_util/function_ref/deduction.cc: Update tests.
This commit is contained in:
@@ -546,8 +546,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
if constexpr (is_member_object_pointer_v<_Fn>)
|
||||
{
|
||||
if constexpr (is_invocable_v<_Fn, _Tr>)
|
||||
// TODO Consider reporting issue to make this noexcept
|
||||
return static_cast<invoke_result_t<_Fn, _Tr>(*)()>(nullptr);
|
||||
// _GLIBCXX_RESOLVE_LIB_DEFECTS
|
||||
// 4425. CTAD function_ref from data member pointer should produce
|
||||
// noexcept signature
|
||||
return static_cast<invoke_result_t<_Fn, _Tr>(*)() noexcept>(nullptr);
|
||||
}
|
||||
else if constexpr (requires { typename __skip_first_arg<_Fn>::type; })
|
||||
return static_cast<__skip_first_arg<_Fn>::type*>(nullptr);
|
||||
|
||||
@@ -89,13 +89,13 @@ S s{};
|
||||
const S cs{};
|
||||
|
||||
static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, s)),
|
||||
function_ref<int&()>> );
|
||||
function_ref<int&() noexcept>> );
|
||||
static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, cs)),
|
||||
function_ref<const int&()>> );
|
||||
function_ref<const int&() noexcept>> );
|
||||
static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, &s)),
|
||||
function_ref<int&()>> );
|
||||
function_ref<int&() noexcept>> );
|
||||
static_assert( is_same_v<decltype(function_ref(nontype<&S::mem>, &cs)),
|
||||
function_ref<const int&()>> );
|
||||
function_ref<const int&() noexcept>> );
|
||||
static_assert( !deductible<&S::mem, int> );
|
||||
|
||||
static_assert( is_same_v<decltype(function_ref(nontype<&S::f>, s)),
|
||||
|
||||
Reference in New Issue
Block a user