diff options
Diffstat (limited to 'libcxx')
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"], }, { |