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

--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jonathan Wakely <r...@gcc.gnu.org>:

https://gcc.gnu.org/g:ef632273a90657acb45e89df12bce9e96035f52c

commit r16-997-gef632273a90657acb45e89df12bce9e96035f52c
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Fri Jan 10 12:22:21 2025 +0000

    libstdc++: Fix std::barrier for constant initialization [PR118395]

    The std::barrier constructor should be constexpr, which means we need to
    defer the dynamic allocation if the constructor is called during
    constant-initialization. We can defer it to the first call to
    barrier::arrive, using compare-and-swap on an atomic<T*> (instead of the
    unique_ptr<T[]> currently used).

    Also add precondition checks to the constructor and arrive member
    function. Also implement the proposed resolution of LWG 3898.

    libstdc++-v3/ChangeLog:

            PR libstdc++/118395
            PR libstdc++/108974
            PR libstdc++/98749
            * include/std/barrier (__tree_barrier): Use default
            member-initializers. Change _M_state member from
            unique_ptr<__state_t[]> to atomic<__state_t*>. Add
            no_unique_address attribute to _M_completion.
            (__tree_barrier::_M_arrive): Load value from _M_state.
            (__tree_barrier::_M_invoke_completion): New member function to
            ensure a throwing completion function will terminate, as
            proposed in LWG 3898.
            (__tree_barrier::max): Reduce by one to avoid overflow.
            (__tree_barrier::__tree_barrier): Add constexpr. Qualify call to
            std::move. Remove mem-initializers made unnecessary by default
            member-initializers. Add precondition check. Only allocate state
            array if not constant evaluated.
            (__tree_barrier::arrive): Add precondition check. Do deferred
            initialization of _M_state if needed.
            (barrier): Add static_assert, as proposed in LWG 3898.
            (barrier::barrier): Add constexpr.
            * testsuite/30_threads/barrier/cons.cc: New test.
            * testsuite/30_threads/barrier/lwg3898.cc: New test.
  • [Bug libstdc++/118395] Construc... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to