https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119126

--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Tomasz Kaminski <tkami...@gcc.gnu.org>:

https://gcc.gnu.org/g:545433e9bd32e965726956cb238d53b39844b85c

commit r16-877-g545433e9bd32e965726956cb238d53b39844b85c
Author: Tomasz KamiÅski <tkami...@redhat.com>
Date:   Wed May 14 12:04:24 2025 +0200

    libstdc++: Implement C++26 function_ref [PR119126]

    This patch implements C++26 function_ref as specified in P0792R14,
    with correction for constraints for constructor accepting nontype_t
    parameter from LWG 4256.

    As function_ref may store a pointer to the const object, __Ptrs::_M_obj is
    changed to const void*, so again we do not cast away const from const
    objects. To help with necessary casts, a __polyfunc::__cast_to helper is
    added, that accepts reference to or target type direclty.

    The _Invoker now defines additional call methods used by function_ref:
    _S_ptrs() for invoking target passed by reference, and __S_nttp,
_S_bind_ptr,
    _S_bind_ref for handling constructors accepting nontype_t. The existing
    _S_call_storage is changed to thin wrapper, that initialies _Ptrs, and
forwards
    to _S_call_ptrs.

    This reduced the most uses of _Storage::_M_ptr and _Storage::_M_ref,
    so this functions was removed, and _Manager uses were adjusted.

    Finally we make function_ref available in freestanding mode, as
    move_only_function and copyable_function are currently only available in
hosted,
    so we define _Manager and _Mo_base only if either
__glibcxx_move_only_function
    or __glibcxx_copyable_function is defined.

            PR libstdc++/119126

    libstdc++-v3/ChangeLog:

            * doc/doxygen/stdheader.cc: Added funcref_impl.h file.
            * include/Makefile.am: Added funcref_impl.h file.
            * include/Makefile.in: Added funcref_impl.h file.
            * include/bits/funcref_impl.h: New file.
            * include/bits/funcwrap.h: (_Ptrs::_M_obj): Const-qualify.
            (_Storage::_M_ptr, _Storage::_M_ref): Remove.
            (__polyfunc::__cast_to) Define.
            (_Base_invoker::_S_ptrs, _Base_invoker::_S_nttp)
            (_Base_invoker::_S_bind_ptrs, _Base_invoker::_S_bind_ref)
            (_Base_invoker::_S_call_ptrs): Define.
            (_Base_invoker::_S_call_storage): Foward to _S_call_ptrs.
            (_Manager::_S_local, _Manager::_S_ptr): Adjust for _M_obj being
            const qualified.
            (__polyfunc::_Manager, __polyfunc::_Mo_base): Guard with
            __glibcxx_move_only_function || __glibcxx_copyable_function.
            (__polyfunc::__skip_first_arg, __polyfunc::__deduce_funcref)
            (std::function_ref) [__glibcxx_function_ref]: Define.
            * include/bits/utility.h (std::nontype_t, std::nontype)
            (__is_nontype_v) [__glibcxx_function_ref]: Define.
            * include/bits/version.def: Define function_ref.
            * include/bits/version.h: Regenerate.
            * include/std/functional: Define __cpp_lib_function_ref.
            * src/c++23/std.cc.in (std::nontype_t, std::nontype)
            (std::function_ref) [__cpp_lib_function_ref]: Export.
            * testsuite/20_util/function_ref/assign.cc: New test.
            * testsuite/20_util/function_ref/call.cc: New test.
            * testsuite/20_util/function_ref/cons.cc: New test.
            * testsuite/20_util/function_ref/cons_neg.cc: New test.
            * testsuite/20_util/function_ref/conv.cc: New test.
            * testsuite/20_util/function_ref/deduction.cc: New test.
            * testsuite/20_util/function_ref/mutation.cc: New test.

    Reviewed-by: Jonathan Wakely <jwak...@redhat.com>
    Signed-off-by: Tomasz KamiÅski <tkami...@redhat.com>
  • [Bug libstdc++/119126] [C++26] ... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to