[Bug libstdc++/108974] std::barrier accepts completion function which is not manifestly noexcept

2025-05-30 Thread cvs-commit at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108974

--- Comment #8 from GCC Commits  ---
The master branch has been updated by Jonathan Wakely :

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

commit r16-997-gef632273a90657acb45e89df12bce9e96035f52c
Author: Jonathan Wakely 
Date:   Fri Jan 10 12:22:21 2025 +

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 (instead of the
unique_ptr 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++/108974] std::barrier accepts completion function which is not manifestly noexcept

2025-01-10 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108974

--- Comment #7 from Jonathan Wakely  ---
Patch posted that implements the proposed resolution:
https://gcc.gnu.org/pipermail/gcc-patches/2025-January/673200.html

[Bug libstdc++/108974] std::barrier accepts completion function which is not manifestly noexcept

2025-01-10 Thread redi at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108974

Jonathan Wakely  changed:

   What|Removed |Added

   Last reconfirmed|2023-02-28 00:00:00 |2025-1-10

--- Comment #6 from Jonathan Wakely  ---
https://cplusplus.github.io/LWG/issue3898