Index: libcxx/include/barrier =================================================================== --- libcxx/include/barrier +++ libcxx/include/barrier @@ -129,7 +129,7 @@ } _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY - __barrier_base(ptrdiff_t __expected, _CompletionF __completion = _CompletionF()) + constexpr explicit __barrier_base(ptrdiff_t __expected, _CompletionF __completion = _CompletionF()) : __expected_(__expected), __base_(std::__construct_barrier_algorithm_base(this->__expected_), &__destroy_barrier_algorithm_base), __expected_adjustment_(0), __completion_(std::move(__completion)), __phase_(0) @@ -195,7 +195,7 @@ } _LIBCPP_INLINE_VISIBILITY - __barrier_base(ptrdiff_t __expected, _CompletionF __completion = _CompletionF()) + constexpr explicit __barrier_base(ptrdiff_t __expected, _CompletionF __completion = _CompletionF()) : __expected(__expected), __arrived(__expected), __completion(std::move(__completion)), __phase(false) { } @@ -252,7 +252,7 @@ } _LIBCPP_INLINE_VISIBILITY - explicit inline __barrier_base(ptrdiff_t __count, __empty_completion = __empty_completion()) + constexpr explicit __barrier_base(ptrdiff_t __count, __empty_completion = __empty_completion()) : __phase_arrived_expected(__init(__count)) { } @@ -298,7 +298,7 @@ } _LIBCPP_AVAILABILITY_SYNC _LIBCPP_INLINE_VISIBILITY - barrier(ptrdiff_t __count, _CompletionF __completion = _CompletionF()) + constexpr explicit barrier(ptrdiff_t __count, _CompletionF __completion = _CompletionF()) : __b_(__count, _VSTD::move(__completion)) { } Index: libcxx/test/std/thread/thread.barrier/ctor.pass.cpp =================================================================== --- /dev/null +++ libcxx/test/std/thread/thread.barrier/ctor.pass.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// UNSUPPORTED: no-threads +// UNSUPPORTED: c++03, c++11 + +// XFAIL: availability-synchronization_library-missing + +// + +// constexpr explicit barrier(ptrdiff_t __count, _CompletionF __completion = _CompletionF()); + +// Make sure that the ctor of barrier is constexpr and explicit. + +#include + +#include "test_convertible.h" + +static_assert(!test_convertible, std::ptrdiff_t>(), "This constructor must be explicit"); + +constexpr bool test() { + constexpr auto comp = []() noexcept {}; + [[maybe_unused]] std::barrier<> a{5}; + [[maybe_unused]] std::barrier b{5, comp}; + return true; +} + +int main(int, char**) { + test(); + static_assert(test()); + + return 0; +}