aboutsummaryrefslogtreecommitdiff
path: root/libcxx
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/docs/FeatureTestMacroTable.rst2
-rw-r--r--libcxx/docs/ReleaseNotes/22.rst1
-rw-r--r--libcxx/docs/Status/Cxx2cPapers.csv2
-rw-r--r--libcxx/include/__atomic/atomic_ref.h3
-rw-r--r--libcxx/include/version5
-rw-r--r--libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h37
-rw-r--r--libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp33
-rw-r--r--libcxx/test/std/atomics/atomics.ref/address.pass.cpp37
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp4
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp4
-rw-r--r--libcxx/utils/generate_feature_test_macro_components.py5
11 files changed, 118 insertions, 15 deletions
diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst
index c7f01e6..8fba6db 100644
--- a/libcxx/docs/FeatureTestMacroTable.rst
+++ b/libcxx/docs/FeatureTestMacroTable.rst
@@ -418,6 +418,8 @@ Status
---------------------------------------------------------- -----------------
``__cpp_lib_atomic_min_max`` *unimplemented*
---------------------------------------------------------- -----------------
+ ``__cpp_lib_atomic_ref`` ``202411L``
+ ---------------------------------------------------------- -----------------
``__cpp_lib_bind_front`` ``202306L``
---------------------------------------------------------- -----------------
``__cpp_lib_bitset`` ``202306L``
diff --git a/libcxx/docs/ReleaseNotes/22.rst b/libcxx/docs/ReleaseNotes/22.rst
index ec23ba9..1a450218 100644
--- a/libcxx/docs/ReleaseNotes/22.rst
+++ b/libcxx/docs/ReleaseNotes/22.rst
@@ -43,6 +43,7 @@ Implemented Papers
- P3044R2: sub-``string_view`` from ``string`` (`Github <https://llvm.org/PR148140>`__)
- P3223R2: Making ``std::istream::ignore`` less surprising (`Github <https://llvm.org/PR148178>`__)
- P3060R3: Add ``std::views::indices(n)`` (`Github <https://llvm.org/PR148175>`__)
+- P2835R7: Expose ``std::atomic_ref``'s object address (`Github <https://llvm.org/PR118377>`__)
- P3168R2: Give ``std::optional`` Range Support (`Github <https://llvm.org/PR105430>`__)
Improvements and New Features
diff --git a/libcxx/docs/Status/Cxx2cPapers.csv b/libcxx/docs/Status/Cxx2cPapers.csv
index 69b9984..9b83047 100644
--- a/libcxx/docs/Status/Cxx2cPapers.csv
+++ b/libcxx/docs/Status/Cxx2cPapers.csv
@@ -85,7 +85,7 @@
"`P3222R0 <https://wg21.link/P3222R0>`__","Fix C++26 by adding transposed special cases for P2642 layouts","2024-11 (Wrocław)","","","`#118374 <https://github.com/llvm/llvm-project/issues/118374>`__",""
"`P3050R2 <https://wg21.link/P3050R2>`__","Fix C++26 by optimizing ``linalg::conjugated`` for noncomplex value types","2024-11 (Wrocław)","","","`#118375 <https://github.com/llvm/llvm-project/issues/118375>`__",""
"`P3396R1 <https://wg21.link/P3396R1>`__","``std::execution`` wording fixes","2024-11 (Wrocław)","","","`#118376 <https://github.com/llvm/llvm-project/issues/118376>`__",""
-"`P2835R7 <https://wg21.link/P2835R7>`__","Expose ``std::atomic_ref``'s object address","2024-11 (Wrocław)","","","`#118377 <https://github.com/llvm/llvm-project/issues/118377>`__",""
+"`P2835R7 <https://wg21.link/P2835R7>`__","Expose ``std::atomic_ref``'s object address","2024-11 (Wrocław)","|Complete|","22","`#118377 <https://github.com/llvm/llvm-project/issues/118377>`__",""
"`P3323R1 <https://wg21.link/P3323R1>`__","cv-qualified types in ``atomic`` and ``atomic_ref``","2024-11 (Wrocław)","","","`#118378 <https://github.com/llvm/llvm-project/issues/118378>`__",""
"`P3508R0 <https://wg21.link/P3508R0>`__","Wording for ""constexpr for specialized memory algorithms""","2024-11 (Wrocław)","","","`#118379 <https://github.com/llvm/llvm-project/issues/118379>`__",""
"`P3369R0 <https://wg21.link/P3369R0>`__","constexpr for ``uninitialized_default_construct``","2024-11 (Wrocław)","","","`#118380 <https://github.com/llvm/llvm-project/issues/118380>`__",""
diff --git a/libcxx/include/__atomic/atomic_ref.h b/libcxx/include/__atomic/atomic_ref.h
index 9bdc6b1..ec5ae2c 100644
--- a/libcxx/include/__atomic/atomic_ref.h
+++ b/libcxx/include/__atomic/atomic_ref.h
@@ -220,6 +220,9 @@ public:
}
_LIBCPP_HIDE_FROM_ABI void notify_one() const noexcept { std::__atomic_notify_one(*this); }
_LIBCPP_HIDE_FROM_ABI void notify_all() const noexcept { std::__atomic_notify_all(*this); }
+# if _LIBCPP_STD_VER >= 26
+ [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Tp* address() const noexcept { return __ptr_; }
+# endif
protected:
using _Aligned_Tp [[__gnu__::__aligned__(required_alignment), __gnu__::__nodebug__]] = _Tp;
diff --git a/libcxx/include/version b/libcxx/include/version
index 44d7908..0fef1bb 100644
--- a/libcxx/include/version
+++ b/libcxx/include/version
@@ -37,7 +37,8 @@ __cpp_lib_atomic_float 201711L <atomic>
__cpp_lib_atomic_is_always_lock_free 201603L <atomic>
__cpp_lib_atomic_lock_free_type_aliases 201907L <atomic>
__cpp_lib_atomic_min_max 202403L <atomic>
-__cpp_lib_atomic_ref 201806L <atomic>
+__cpp_lib_atomic_ref 202411L <atomic>
+ 201806L // C++20
__cpp_lib_atomic_shared_ptr 201711L <atomic>
__cpp_lib_atomic_value_initialization 201911L <atomic> <memory>
__cpp_lib_atomic_wait 201907L <atomic>
@@ -544,6 +545,8 @@ __cpp_lib_void_t 201411L <type_traits>
# define __cpp_lib_aligned_accessor 202411L
// # define __cpp_lib_associative_heterogeneous_insertion 202306L
// # define __cpp_lib_atomic_min_max 202403L
+# undef __cpp_lib_atomic_ref
+# define __cpp_lib_atomic_ref 202411L
# undef __cpp_lib_bind_front
# define __cpp_lib_bind_front 202306L
# define __cpp_lib_bitset 202306L
diff --git a/libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h b/libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h
index b395698..22a6d0d 100644
--- a/libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h
+++ b/libcxx/test/benchmarks/containers/associative/associative_container_benchmarks.h
@@ -305,11 +305,19 @@ void associative_container_benchmarks(std::string container) {
// The insert(hint, ...) methods are only relevant for ordered containers, and we lack
// a good way to compute a hint for unordered ones.
if constexpr (is_ordered_container) {
- bench("insert(hint, value) (good hint)", [=](auto& st) {
+ auto insert_good_hint_bench = [=](bool bench_end_iter, auto& st) {
const std::size_t size = st.range(0);
std::vector<Value> in = make_value_types(generate_unique_keys(size + 1));
- Value to_insert = in.back();
- in.pop_back();
+ auto skipped_val = bench_end_iter ? in.size() - 1 : in.size() / 2;
+ Value to_insert = in[skipped_val];
+ { // Remove the element
+ std::vector<Value> tmp;
+ tmp.reserve(in.size() - 1);
+ for (size_t i = 0; i != in.size(); ++i)
+ if (i != skipped_val)
+ tmp.emplace_back(in[i]);
+ in = std::move(tmp);
+ }
std::vector<Container> c(BatchSize, Container(in.begin(), in.end()));
typename Container::iterator hints[BatchSize];
@@ -332,13 +340,23 @@ void associative_container_benchmarks(std::string container) {
}
st.ResumeTiming();
}
- });
+ };
+ bench("insert(hint, value) (good hint, end)", [=](auto& state) { insert_good_hint_bench(true, state); });
+ bench("insert(hint, value) (good hint, middle)", [=](auto& state) { insert_good_hint_bench(false, state); });
- bench("insert(hint, value) (bad hint)", [=](auto& st) {
+ auto insert_bad_hint_bench = [=](bool bench_end_iter, auto& st) {
const std::size_t size = st.range(0);
std::vector<Value> in = make_value_types(generate_unique_keys(size + 1));
- Value to_insert = in.back();
- in.pop_back();
+ auto skipped_val = bench_end_iter ? in.size() - 1 : in.size() / 2;
+ Value to_insert = in[skipped_val];
+ { // Remove the element
+ std::vector<Value> tmp;
+ tmp.reserve(in.size() - 1);
+ for (size_t i = 0; i != in.size(); ++i)
+ if (i != skipped_val)
+ tmp.emplace_back(in[i]);
+ in = std::move(tmp);
+ }
std::vector<Container> c(BatchSize, Container(in.begin(), in.end()));
while (st.KeepRunningBatch(BatchSize)) {
@@ -355,7 +373,10 @@ void associative_container_benchmarks(std::string container) {
}
st.ResumeTiming();
}
- });
+ };
+
+ bench("insert(hint, value) (bad hint, end)", [=](auto& state) { insert_bad_hint_bench(true, state); });
+ bench("insert(hint, value) (bad hint, middle)", [=](auto& state) { insert_bad_hint_bench(false, state); });
}
bench("insert(iterator, iterator) (all new keys)", [=](auto& st) {
diff --git a/libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp b/libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp
new file mode 100644
index 0000000..85e5f0b
--- /dev/null
+++ b/libcxx/test/libcxx/diagnostics/atomic.nodiscard.verify.cpp
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++26
+
+// check that <atomic> functions are marked [[nodiscard]]
+
+#include <atomic>
+
+#include "atomic_helpers.h"
+#include "test_macros.h"
+
+template <typename T>
+struct TestAtomicRef {
+ void operator()() const {
+ T x(T(1));
+ const std::atomic_ref<T> a(x);
+
+ a.address(); // expected-warning 4 {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
+};
+
+void test() {
+ TestAtomicRef<UserAtomicType>()();
+ TestAtomicRef<int>()();
+ TestAtomicRef<float>()();
+ TestAtomicRef<char*>()();
+}
diff --git a/libcxx/test/std/atomics/atomics.ref/address.pass.cpp b/libcxx/test/std/atomics/atomics.ref/address.pass.cpp
new file mode 100644
index 0000000..e0db6a9
--- /dev/null
+++ b/libcxx/test/std/atomics/atomics.ref/address.pass.cpp
@@ -0,0 +1,37 @@
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: std-at-least-c++26
+
+// constexpr T* address() const noexcept;
+
+#include <atomic>
+#include <cassert>
+#include <concepts>
+#include <memory>
+
+#include "atomic_helpers.h"
+#include "test_macros.h"
+
+template <typename T>
+struct TestAddress {
+ void operator()() const {
+ T x(T(1));
+ const std::atomic_ref<T> a(x);
+
+ std::same_as<T*> decltype(auto) p = a.address();
+ assert(std::addressof(x) == p);
+
+ static_assert(noexcept((a.address())));
+ }
+};
+
+int main(int, char**) {
+ TestEachAtomicType<TestAddress>()();
+
+ return 0;
+}
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp
index 93eb43c..8bd0274 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp
@@ -355,8 +355,8 @@
# ifndef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should be defined in c++26"
# endif
-# if __cpp_lib_atomic_ref != 201806L
-# error "__cpp_lib_atomic_ref should have the value 201806L in c++26"
+# if __cpp_lib_atomic_ref != 202411L
+# error "__cpp_lib_atomic_ref should have the value 202411L in c++26"
# endif
# if !defined(_LIBCPP_VERSION)
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
index d1fd55f..05af1fb 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
@@ -6325,8 +6325,8 @@
# ifndef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should be defined in c++26"
# endif
-# if __cpp_lib_atomic_ref != 201806L
-# error "__cpp_lib_atomic_ref should have the value 201806L in c++26"
+# if __cpp_lib_atomic_ref != 202411L
+# error "__cpp_lib_atomic_ref should have the value 202411L in c++26"
# endif
# if !defined(_LIBCPP_VERSION)
diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py
index 63204d7..f6f2527 100644
--- a/libcxx/utils/generate_feature_test_macro_components.py
+++ b/libcxx/utils/generate_feature_test_macro_components.py
@@ -195,7 +195,10 @@ feature_test_macros = [
},
{
"name": "__cpp_lib_atomic_ref",
- "values": {"c++20": 201806},
+ "values": {
+ "c++20": 201806,
+ "c++26": 202411, # P2835R7: Expose std::atomic_ref 's object address
+ },
"headers": ["atomic"],
},
{