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:
Tomasz Kamiński
2025-10-20 15:19:43 +02:00
parent c3a37c4d5f
commit 7dcfe01767
2 changed files with 8 additions and 6 deletions

View File

@@ -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);

View File

@@ -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)),