[gcc r16-4509] libstdc++: Deduce function_ref<M&() noexcept> from member object pointers.

Tomasz Kaminski tkaminsk@gcc.gnu.org
Mon Oct 20 15:42:49 GMT 2025


https://gcc.gnu.org/g:7dcfe017679f624a5ed4ab8bec56d0943bcfa10c

commit r16-4509-g7dcfe017679f624a5ed4ab8bec56d0943bcfa10c
Author: Tomasz Kamiński <tkaminsk@redhat.com>
Date:   Mon Oct 20 15:19:43 2025 +0200

    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.

Diff:
---
 libstdc++-v3/include/bits/funcwrap.h                     | 6 ++++--
 libstdc++-v3/testsuite/20_util/function_ref/deduction.cc | 8 ++++----
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/libstdc++-v3/include/bits/funcwrap.h b/libstdc++-v3/include/bits/funcwrap.h
index 1a81c9a9b466..67fd591e9635 100644
--- a/libstdc++-v3/include/bits/funcwrap.h
+++ b/libstdc++-v3/include/bits/funcwrap.h
@@ -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);
diff --git a/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc b/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc
index 6ed2b4e5712e..b034c7af0725 100644
--- a/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc
+++ b/libstdc++-v3/testsuite/20_util/function_ref/deduction.cc
@@ -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)),


More information about the Libstdc++-cvs mailing list