libstdc++: Use deducing this in std::bind_front even in C++20 [PR111327]

PR libstdc++/111327

libstdc++-v3/ChangeLog:

	* include/bits/binders.h (_Binder::operator())
	[_GLIBCXX_EXPLICIT_THIS_PARAMETER]: Also use deducing this in
	C++20 mode when possible.
	* testsuite/20_util/function_objects/bind_front/111327.cc:
	Expect error inside header even in C++20 mode.

Reviewed-by: Tomasz Kamiński <tkaminsk@redhat.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
This commit is contained in:
Patrick Palka 2025-12-05 12:15:08 -05:00
parent 756e32a160
commit b212314667
2 changed files with 5 additions and 2 deletions

View File

@ -125,7 +125,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_M_bound_args(__make_bound_args<_BoundArgs...>(std::forward<_Args>(__args)...))
{ static_assert(sizeof...(_Args) == sizeof...(_BoundArgs)); }
#if __cpp_explicit_this_parameter
#if _GLIBCXX_EXPLICIT_THIS_PARAMETER
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wc++23-extensions" // deducing this
template<typename _Self, typename... _CallArgs>
constexpr _Result_t<_Self, _CallArgs...>
operator()(this _Self&& __self, _CallArgs&&... __call_args)
@ -134,6 +136,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return _S_call(__like_t<_Self, _Binder>(__self),
std::forward<_CallArgs>(__call_args)...);
}
# pragma GCC diagnostic pop
#else
template<typename... _CallArgs>
requires true

View File

@ -50,4 +50,4 @@ int main() {
std::move(std::as_const(g2))();
}
// { dg-error "no type named 'type' in 'std::__conditional_t<false, std::invoke_result<" "" { target c++23 } 0 }
// { dg-error "no type named 'type' in 'std::__conditional_t<false, std::invoke_result<" "" { target *-*-* } 0}