Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libcxx/docs/Status/Cxx2cIssues.csv
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@
"`LWG4154 <https://wg21.link/LWG4154>`__","The Mandates for ``std::packaged_task``'s constructor from a callable entity should consider decaying","2024-11 (Wrocław)","","","`#118364 <https://github.com/llvm/llvm-project/issues/118364>`__",""
"`LWG4157 <https://wg21.link/LWG4157>`__","The resolution of LWG3465 was damaged by P2167R3","2024-11 (Wrocław)","|Complete|","20","`#118365 <https://github.com/llvm/llvm-project/issues/118365>`__",""
"`LWG4164 <https://wg21.link/LWG4164>`__","Missing guarantees for ``forward_list`` modifiers","2024-11 (Wrocław)","|Complete|","21","`#118366 <https://github.com/llvm/llvm-project/issues/118366>`__",""
"`LWG4169 <https://wg21.link/LWG4169>`__","``std::atomic<T>``'s default constructor should be constrained","2024-11 (Wrocław)","","","`#118367 <https://github.com/llvm/llvm-project/issues/118367>`__",""
"`LWG4169 <https://wg21.link/LWG4169>`__","``std::atomic<T>``'s default constructor should be constrained","2024-11 (Wrocław)","|Complete|","22","`#118367 <https://github.com/llvm/llvm-project/issues/118367>`__",""
"`LWG4170 <https://wg21.link/LWG4170>`__","``contiguous_iterator`` should require ``to_address(I{})``","2024-11 (Wrocław)","","","`#118368 <https://github.com/llvm/llvm-project/issues/118368>`__",""
"","","","","",""
"`LWG3578 <https://wg21.link/LWG3578>`__","Iterator SCARYness in the context of associative container merging","2025-02 (Hagenberg)","","","`#127859 <https://github.com/llvm/llvm-project/issues/127859>`__",""
Expand Down
5 changes: 4 additions & 1 deletion libcxx/include/__atomic/atomic.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <__cstddef/ptrdiff_t.h>
#include <__memory/addressof.h>
#include <__type_traits/enable_if.h>
#include <__type_traits/is_constructible.h>
#include <__type_traits/is_floating_point.h>
#include <__type_traits/is_function.h>
#include <__type_traits/is_integral.h>
Expand Down Expand Up @@ -242,7 +243,9 @@ struct atomic : public __atomic_base<typename __check_atomic_mandates<_Tp>::type
using __base _LIBCPP_NODEBUG = __atomic_base<_Tp>;

#if _LIBCPP_STD_VER >= 20
_LIBCPP_HIDE_FROM_ABI atomic() = default;
_LIBCPP_HIDE_FROM_ABI atomic()
requires is_default_constructible_v<_Tp>
= default;
#else
_LIBCPP_HIDE_FROM_ABI atomic() _NOEXCEPT = default;
#endif
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

// Test the properties of std::atomic's default constructor.

#include <atomic>
#include <type_traits>

#include "test_macros.h"

template <typename T>
void test() {
#if TEST_STD_VER >= 11
constexpr T a{};
(void)a;
# if TEST_STD_VER >= 20
[[maybe_unused]] constexpr T b;
# endif
#else
T a;
(void)a;
#endif
static_assert(std::is_nothrow_constructible<T>::value, "");
ASSERT_NOEXCEPT(T{});
}

struct throwing {
throwing() {}
};

struct trivial {
int a;
};

struct not_default_constructible {
explicit not_default_constructible(int) {}
};

void test() {
test<std::atomic<bool> >();
test<std::atomic<int> >();
test<std::atomic<int*> >();
test<std::atomic<trivial> >();
test<std::atomic_flag>();

#if TEST_STD_VER >= 20
static_assert(!std::is_nothrow_constructible_v<std::atomic<throwing>>);
ASSERT_NOT_NOEXCEPT(std::atomic<throwing>{});

static_assert(!std::is_default_constructible_v<std::atomic<not_default_constructible>>);
#else
static_assert(std::is_nothrow_constructible<std::atomic<throwing> >::value, "");

ASSERT_NOEXCEPT(std::atomic<throwing>{});
# ifndef TEST_COMPILER_GCC
static_assert(std::is_default_constructible<std::atomic<not_default_constructible> >::value, "");
# endif
#endif
}
Loading