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.