https://github.com/H-G-Hristov updated https://github.com/llvm/llvm-project/pull/79978
>From c2b9a249689b2b6928d50aeea4717fc9dfe87162 Mon Sep 17 00:00:00 2001 From: Zingam <zin...@outlook.com> Date: Sat, 27 Jan 2024 13:54:21 +0200 Subject: [PATCH 1/7] [libc++][memory] P2652R2 - Disallow Specialization of `allocator_traits` Implements P2652R2 <https://wg21.link/P2652R2>: - https://eel.is/c++draft/allocator.requirements.general - https://eel.is/c++draft/memory.syn - https://eel.is/c++draft/allocator.traits.general - https://eel.is/c++draft/allocator.traits.members - https://eel.is/c++draft/diff.cpp20.concepts - https://eel.is/c++draft/diff.cpp20.utilities --- libcxx/docs/FeatureTestMacroTable.rst | 2 +- libcxx/docs/ReleaseNotes/19.rst | 6 +- libcxx/docs/Status/Cxx23Papers.csv | 2 +- libcxx/docs/Status/Cxx2cIssues.csv | 2 +- libcxx/include/CMakeLists.txt | 1 + libcxx/include/__format/buffer.h | 1 + libcxx/include/__memory/allocate_at_least.h | 15 ++-- libcxx/include/__memory/allocation_result.h | 45 ++++++++++++ libcxx/include/__memory/allocator.h | 1 + libcxx/include/__memory/allocator_traits.h | 13 ++++ libcxx/include/__split_buffer | 1 + libcxx/include/libcxx.imp | 1 + libcxx/include/memory | 12 ++-- libcxx/include/module.modulemap.in | 1 + libcxx/include/string | 17 +++-- libcxx/include/vector | 1 + libcxx/include/version | 4 +- libcxx/modules/std/memory.inc | 2 + .../memory.version.compile.pass.cpp | 10 +-- .../version.version.compile.pass.cpp | 10 +-- .../allocate_at_least.pass.cpp | 6 +- .../allocate_at_least.pass.cpp | 70 +++++++++++++++++++ .../generate_feature_test_macro_components.py | 4 +- 23 files changed, 189 insertions(+), 38 deletions(-) create mode 100644 libcxx/include/__memory/allocation_result.h create mode 100644 libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate_at_least.pass.cpp diff --git a/libcxx/docs/FeatureTestMacroTable.rst b/libcxx/docs/FeatureTestMacroTable.rst index d0d057e6bbaf0..a5c6fa22cec06 100644 --- a/libcxx/docs/FeatureTestMacroTable.rst +++ b/libcxx/docs/FeatureTestMacroTable.rst @@ -304,7 +304,7 @@ Status --------------------------------------------------------------------- ``__cpp_lib_adaptor_iterator_pair_constructor`` ``202106L`` --------------------------------------------------- ----------------- - ``__cpp_lib_allocate_at_least`` ``202106L`` + ``__cpp_lib_allocate_at_least`` ``202302L`` --------------------------------------------------- ----------------- ``__cpp_lib_associative_heterogeneous_erasure`` *unimplemented* --------------------------------------------------- ----------------- diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst index e96abc72c1648..dee9ebc8b8c33 100644 --- a/libcxx/docs/ReleaseNotes/19.rst +++ b/libcxx/docs/ReleaseNotes/19.rst @@ -37,12 +37,16 @@ What's New in Libc++ 19.0.0? Implemented Papers ------------------ + - P2637R3 - Member ``visit`` +- P2652R2 - Disallow User Specialization of ``allocator_traits`` Improvements and New Features ----------------------------- -TODO + +- The ``_LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS`` macro has been added to re-enable user specialization + of `allocator_traits`, which was disabled by `P2652R2 <https://wg21.link/P2652R2>`_. Deprecations and Removals diff --git a/libcxx/docs/Status/Cxx23Papers.csv b/libcxx/docs/Status/Cxx23Papers.csv index ebab3ef735b61..eb415ed8c031f 100644 --- a/libcxx/docs/Status/Cxx23Papers.csv +++ b/libcxx/docs/Status/Cxx23Papers.csv @@ -115,7 +115,7 @@ "`P2679R2 <https://wg21.link/P2679R2>`__","LWG", "Fixing ``std::start_lifetime_as`` for arrays","February 2023","","","" "`P2674R1 <https://wg21.link/P2674R1>`__","LWG", "A trait for implicit lifetime types","February 2023","","","" "`P2655R3 <https://wg21.link/P2655R3>`__","LWG", "``common_reference_t`` of ``reference_wrapper`` Should Be a Reference Type","February 2023","","","" -"`P2652R2 <https://wg21.link/P2652R2>`__","LWG", "Disallow User Specialization of ``allocator_traits``","February 2023","","","" +"`P2652R2 <https://wg21.link/P2652R2>`__","LWG", "Disallow User Specialization of ``allocator_traits``","February 2023","|Complete|","19.0","" "`P2787R1 <https://wg21.link/P2787R1>`__","LWG", "``pmr::generator`` - Promise Types are not Values","February 2023","","","" "`P2614R2 <https://wg21.link/P2614R2>`__","LWG", "Deprecate ``numeric_limits::has_denorm``","February 2023","|Complete|","18.0","" "`P2588R3 <https://wg21.link/P2588R3>`__","LWG", "``barrier``’s phase completion guarantees","February 2023","","","" diff --git a/libcxx/docs/Status/Cxx2cIssues.csv b/libcxx/docs/Status/Cxx2cIssues.csv index b69b094832541..58e995809777c 100644 --- a/libcxx/docs/Status/Cxx2cIssues.csv +++ b/libcxx/docs/Status/Cxx2cIssues.csv @@ -2,7 +2,7 @@ "`2994 <https://wg21.link/LWG2994>`__","Needless UB for ``basic_string`` and ``basic_string_view``","Varna June 2023","|Complete|","5.0","" "`3884 <https://wg21.link/LWG3884>`__","``flat_foo`` is missing allocator-extended copy/move constructors","Varna June 2023","","","|flat_containers|" "`3885 <https://wg21.link/LWG3885>`__","``op`` should be in [zombie.names]","Varna June 2023","|Nothing To Do|","","" -"`3887 <https://wg21.link/LWG3887>`__","Version macro for ``allocate_at_least``","Varna June 2023","","","" +"`3887 <https://wg21.link/LWG3887>`__","Version macro for ``allocate_at_least``","Varna June 2023","|Complete|","19.0","" "`3893 <https://wg21.link/LWG3893>`__","LWG 3661 broke ``atomic<shared_ptr<T>> a; a = nullptr;``","Varna June 2023","","","" "`3894 <https://wg21.link/LWG3894>`__","``generator::promise_type::yield_value(ranges::elements_of<Rng, Alloc>)`` should not be ``noexcept``","Varna June 2023","","","" "`3903 <https://wg21.link/LWG3903>`__","span destructor is redundantly noexcept","Varna June 2023","|Complete|","7.0","" diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index 0bb23710cae84..e2ca533510aa3 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -521,6 +521,7 @@ set(files __memory/aligned_alloc.h __memory/allocate_at_least.h __memory/allocation_guard.h + __memory/allocation_result.h __memory/allocator.h __memory/allocator_arg_t.h __memory/allocator_destructor.h diff --git a/libcxx/include/__format/buffer.h b/libcxx/include/__format/buffer.h index 8598f0a1c0395..9b18e01aea8bb 100644 --- a/libcxx/include/__format/buffer.h +++ b/libcxx/include/__format/buffer.h @@ -29,6 +29,7 @@ #include <__iterator/wrap_iter.h> #include <__memory/addressof.h> #include <__memory/allocate_at_least.h> +#include <__memory/allocation_result.h> #include <__memory/allocator_traits.h> #include <__memory/construct_at.h> #include <__memory/ranges_construct_at.h> diff --git a/libcxx/include/__memory/allocate_at_least.h b/libcxx/include/__memory/allocate_at_least.h index 05cbdee828839..3aa99ae2a05a7 100644 --- a/libcxx/include/__memory/allocate_at_least.h +++ b/libcxx/include/__memory/allocate_at_least.h @@ -10,6 +10,7 @@ #define _LIBCPP___MEMORY_ALLOCATE_AT_LEAST_H #include <__config> +#include <__memory/allocation_result.h> #include <__memory/allocator_traits.h> #include <cstddef> @@ -20,13 +21,8 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 23 -template <class _Pointer> -struct allocation_result { - _Pointer ptr; - size_t count; -}; -_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result); +# ifdef _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS template <class _Alloc> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr allocation_result<typename allocator_traits<_Alloc>::pointer> allocate_at_least(_Alloc& __alloc, size_t __n) { @@ -36,12 +32,19 @@ allocate_at_least(_Alloc& __alloc, size_t __n) { return {__alloc.allocate(__n), __n}; } } +# endif // _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS template <class _Alloc> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto __allocate_at_least(_Alloc& __alloc, size_t __n) { +# ifndef _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS + return std::allocator_traits<_Alloc>::allocate_at_least(__alloc, __n); +# else return std::allocate_at_least(__alloc, __n); +# endif } + #else + template <class _Pointer> struct __allocation_result { _Pointer ptr; diff --git a/libcxx/include/__memory/allocation_result.h b/libcxx/include/__memory/allocation_result.h new file mode 100644 index 0000000000000..c0e594bc34a14 --- /dev/null +++ b/libcxx/include/__memory/allocation_result.h @@ -0,0 +1,45 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___MEMORY_ALLOCATION_RESULT_H +#define _LIBCPP___MEMORY_ALLOCATION_RESULT_H + +#include <__config> +#include <cstddef> + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +# pragma GCC system_header +#endif + +_LIBCPP_BEGIN_NAMESPACE_STD + +#if _LIBCPP_STD_VER >= 23 +# ifndef _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS + +template <class _Pointer, class _SizeType = size_t> +struct allocation_result { + _Pointer ptr; + _SizeType count; +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result); + +# else + +template <class _Pointer> +struct allocation_result { + _Pointer ptr; + size_t count; +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result); + +# endif // _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS +#endif // _LIBCPP_STD_VER + +_LIBCPP_END_NAMESPACE_STD + +#endif // _LIBCPP___MEMORY_ALLOCATION_RESULT_H diff --git a/libcxx/include/__memory/allocator.h b/libcxx/include/__memory/allocator.h index 4e6303914c38a..b8cf33d4b1d46 100644 --- a/libcxx/include/__memory/allocator.h +++ b/libcxx/include/__memory/allocator.h @@ -13,6 +13,7 @@ #include <__config> #include <__memory/addressof.h> #include <__memory/allocate_at_least.h> +#include <__memory/allocation_result.h> #include <__memory/allocator_traits.h> #include <__type_traits/is_constant_evaluated.h> #include <__type_traits/is_same.h> diff --git a/libcxx/include/__memory/allocator_traits.h b/libcxx/include/__memory/allocator_traits.h index c4482872ea810..0cb699c2e7520 100644 --- a/libcxx/include/__memory/allocator_traits.h +++ b/libcxx/include/__memory/allocator_traits.h @@ -11,6 +11,7 @@ #define _LIBCPP___MEMORY_ALLOCATOR_TRAITS_H #include <__config> +#include <__memory/allocation_result.h> #include <__memory/construct_at.h> #include <__memory/pointer_traits.h> #include <__type_traits/enable_if.h> @@ -284,6 +285,18 @@ struct _LIBCPP_TEMPLATE_VIS allocator_traits { return __a.allocate(__n); } +#if _LIBCPP_STD_VER >= 23 && !defined(_LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS) + template <class _Ap = _Alloc> + [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr allocation_result<pointer, size_type> + allocate_at_least(_Ap& __alloc, size_type __n) { + if constexpr (requires { __alloc.allocate_at_least(__n); }) { + return __alloc.allocate_at_least(__n); + } else { + return {__alloc.allocate(__n), __n}; + } + } +#endif + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static void deallocate(allocator_type& __a, pointer __p, size_type __n) _NOEXCEPT { __a.deallocate(__p, __n); diff --git a/libcxx/include/__split_buffer b/libcxx/include/__split_buffer index aaf955685d2d3..c12272e57d857 100644 --- a/libcxx/include/__split_buffer +++ b/libcxx/include/__split_buffer @@ -18,6 +18,7 @@ #include <__iterator/iterator_traits.h> #include <__iterator/move_iterator.h> #include <__memory/allocate_at_least.h> +#include <__memory/allocation_result.h> #include <__memory/allocator.h> #include <__memory/allocator_traits.h> #include <__memory/compressed_pair.h> diff --git a/libcxx/include/libcxx.imp b/libcxx/include/libcxx.imp index 13c0dfeb2bc98..341c2c61f25cf 100644 --- a/libcxx/include/libcxx.imp +++ b/libcxx/include/libcxx.imp @@ -512,6 +512,7 @@ { include: [ "<__memory/aligned_alloc.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocate_at_least.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocation_guard.h>", "private", "<memory>", "public" ] }, + { include: [ "<__memory/allocation_result.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocator.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocator_arg_t.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocator_destructor.h>", "private", "<memory>", "public" ] }, diff --git a/libcxx/include/memory b/libcxx/include/memory index 19c11ee949872..c57f5dd9d3c7b 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -88,6 +88,9 @@ struct allocator_traits static pointer allocate(allocator_type& a, size_type n); // constexpr and [[nodiscard]] in C++20 static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); // constexpr and [[nodiscard]] in C++20 + [[nodiscard]] static constexpr allocation_result<pointer, size_type> + allocate_at_least(Alloc& a, size_type n); // Since C++23 + static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; // constexpr in C++20 template <class T, class... Args> @@ -100,15 +103,15 @@ struct allocator_traits static allocator_type select_on_container_copy_construction(const allocator_type& a); // constexpr in C++20 }; -template<class Pointer> +template<class Pointer, class SizeType = size_t> struct allocation_result { Pointer ptr; - size_t count; -}; // since C++23 + SizeType count; +}; // since C++23, modified C++23 template<class Allocator> [[nodiscard]] constexpr allocation_result<typename allocator_traits<Allocator>::pointer> - allocate_at_least(Allocator& a, size_t n); // since C++23 + allocate_at_least(Allocator& a, size_t n); // Since C++23, removed C++23 template <> class allocator<void> // removed in C++20 @@ -924,6 +927,7 @@ template<size_t N, class T> #include <__memory/align.h> #include <__memory/allocate_at_least.h> #include <__memory/allocation_guard.h> +#include <__memory/allocation_result.h> #include <__memory/allocator.h> #include <__memory/allocator_arg_t.h> #include <__memory/allocator_traits.h> diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in index 207b44b6444bf..ceb576b662612 100644 --- a/libcxx/include/module.modulemap.in +++ b/libcxx/include/module.modulemap.in @@ -1499,6 +1499,7 @@ module std_private_memory_align [system] { header "__m module std_private_memory_aligned_alloc [system] { header "__memory/aligned_alloc.h" } module std_private_memory_allocate_at_least [system] { header "__memory/allocate_at_least.h" } module std_private_memory_allocation_guard [system] { header "__memory/allocation_guard.h" } +module std_private_memory_allocation_result [system] { header "__memory/allocation_result.h" } module std_private_memory_allocator [system] { header "__memory/allocator.h" } module std_private_memory_allocator_arg_t [system] { header "__memory/allocator_arg_t.h" } module std_private_memory_allocator_destructor [system] { header "__memory/allocator_destructor.h" } diff --git a/libcxx/include/string b/libcxx/include/string index efdff3dd42da0..a8a8469751c7e 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -585,6 +585,7 @@ basic_string<char32_t> operator""s( const char32_t *str, size_t len ); #include <__iterator/wrap_iter.h> #include <__memory/addressof.h> #include <__memory/allocate_at_least.h> +#include <__memory/allocation_result.h> #include <__memory/allocator.h> #include <__memory/allocator_traits.h> #include <__memory/compressed_pair.h> @@ -922,7 +923,11 @@ public: // Turning off ASan instrumentation for variable initialization with _LIBCPP_STRING_INTERNAL_MEMORY_ACCESS // does not work consistently during initialization of __r_, so we instead unpoison __str's memory manually first. // __str's memory needs to be unpoisoned only in the case where it's a short string. - : __r_([](basic_string &__s) -> decltype(__s.__r_)&& { if(!__s.__is_long()) __s.__annotate_delete(); return std::move(__s.__r_); }(__str)) { + : __r_([](basic_string& __s) -> decltype(__s.__r_)&& { + if (!__s.__is_long()) + __s.__annotate_delete(); + return std::move(__s.__r_); + }(__str)) { __str.__r_.first() = __rep(); __str.__annotate_new(0); if (!__is_long()) @@ -1902,7 +1907,7 @@ private: } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __annotate_new(size_type __current_size) const _NOEXCEPT { - (void) __current_size; + (void)__current_size; #if !defined(_LIBCPP_HAS_NO_ASAN) && defined(_LIBCPP_INSTRUMENTED_WITH_ASAN) if (!__libcpp_is_constant_evaluated() && (__asan_short_string_is_annotated() || __is_long())) __annotate_contiguous_container(data() + capacity() + 1, data() + __current_size + 1); @@ -1917,7 +1922,7 @@ private: } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __annotate_increase(size_type __n) const _NOEXCEPT { - (void) __n; + (void)__n; #if !defined(_LIBCPP_HAS_NO_ASAN) && defined(_LIBCPP_INSTRUMENTED_WITH_ASAN) if (!__libcpp_is_constant_evaluated() && (__asan_short_string_is_annotated() || __is_long())) __annotate_contiguous_container(data() + size() + 1, data() + size() + 1 + __n); @@ -1925,7 +1930,7 @@ private: } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __annotate_shrink(size_type __old_size) const _NOEXCEPT { - (void) __old_size; + (void)__old_size; #if !defined(_LIBCPP_HAS_NO_ASAN) && defined(_LIBCPP_INSTRUMENTED_WITH_ASAN) if (!__libcpp_is_constant_evaluated() && (__asan_short_string_is_annotated() || __is_long())) __annotate_contiguous_container(data() + __old_size + 1, data() + size() + 1); @@ -1936,9 +1941,7 @@ private: static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __align_it(size_type __s) _NOEXCEPT { return (__s + (__a - 1)) & ~(__a - 1); } - enum { - __alignment = 8 - }; + enum { __alignment = 8 }; static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __recommend(size_type __s) _NOEXCEPT { if (__s < __min_cap) { return static_cast<size_type>(__min_cap) - 1; diff --git a/libcxx/include/vector b/libcxx/include/vector index f24d2c4b9c6ac..66aa25a70ce0b 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -332,6 +332,7 @@ template<class T, class charT> requires is-vector-bool-reference<T> // Since C++ #include <__iterator/wrap_iter.h> #include <__memory/addressof.h> #include <__memory/allocate_at_least.h> +#include <__memory/allocation_result.h> #include <__memory/allocator_traits.h> #include <__memory/pointer_traits.h> #include <__memory/swap_allocator.h> diff --git a/libcxx/include/version b/libcxx/include/version index 9e26da8c1b242..e4dbb7bdd5fc2 100644 --- a/libcxx/include/version +++ b/libcxx/include/version @@ -16,7 +16,7 @@ Macro name Value Headers __cpp_lib_adaptor_iterator_pair_constructor 202106L <queue> <stack> __cpp_lib_addressof_constexpr 201603L <memory> -__cpp_lib_allocate_at_least 202106L <memory> +__cpp_lib_allocate_at_least 202302L <memory> __cpp_lib_allocator_traits_is_always_equal 201411L <deque> <forward_list> <list> <map> <memory> <scoped_allocator> <set> <string> <unordered_map> @@ -433,7 +433,7 @@ __cpp_lib_within_lifetime 202306L <type_traits> #if _LIBCPP_STD_VER >= 23 # define __cpp_lib_adaptor_iterator_pair_constructor 202106L -# define __cpp_lib_allocate_at_least 202106L +# define __cpp_lib_allocate_at_least 202302L // # define __cpp_lib_associative_heterogeneous_erasure 202110L // # define __cpp_lib_bind_back 202202L # define __cpp_lib_byteswap 202110L diff --git a/libcxx/modules/std/memory.inc b/libcxx/modules/std/memory.inc index ef89845457fbb..a930119462cdc 100644 --- a/libcxx/modules/std/memory.inc +++ b/libcxx/modules/std/memory.inc @@ -44,7 +44,9 @@ export namespace std { #if _LIBCPP_STD_VER >= 23 using std::allocation_result; +# ifdef _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS using std::allocate_at_least; +# endif #endif // [default.allocator], the default allocator diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/memory.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/memory.version.compile.pass.cpp index b1f6c76d84739..45d9271faa578 100644 --- a/libcxx/test/std/language.support/support.limits/support.limits.general/memory.version.compile.pass.cpp +++ b/libcxx/test/std/language.support/support.limits/support.limits.general/memory.version.compile.pass.cpp @@ -17,7 +17,7 @@ /* Constant Value __cpp_lib_addressof_constexpr 201603L [C++17] - __cpp_lib_allocate_at_least 202106L [C++23] + __cpp_lib_allocate_at_least 202302L [C++23] __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] __cpp_lib_assume_aligned 201811L [C++20] __cpp_lib_atomic_value_initialization 201911L [C++20] @@ -432,8 +432,8 @@ # ifndef __cpp_lib_allocate_at_least # error "__cpp_lib_allocate_at_least should be defined in c++23" # endif -# if __cpp_lib_allocate_at_least != 202106L -# error "__cpp_lib_allocate_at_least should have the value 202106L in c++23" +# if __cpp_lib_allocate_at_least != 202302L +# error "__cpp_lib_allocate_at_least should have the value 202302L in c++23" # endif # ifndef __cpp_lib_allocator_traits_is_always_equal @@ -569,8 +569,8 @@ # ifndef __cpp_lib_allocate_at_least # error "__cpp_lib_allocate_at_least should be defined in c++26" # endif -# if __cpp_lib_allocate_at_least != 202106L -# error "__cpp_lib_allocate_at_least should have the value 202106L in c++26" +# if __cpp_lib_allocate_at_least != 202302L +# error "__cpp_lib_allocate_at_least should have the value 202302L in c++26" # endif # ifndef __cpp_lib_allocator_traits_is_always_equal 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 c319940fe6e49..29f0ba89330bb 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 @@ -18,7 +18,7 @@ /* Constant Value __cpp_lib_adaptor_iterator_pair_constructor 202106L [C++23] __cpp_lib_addressof_constexpr 201603L [C++17] - __cpp_lib_allocate_at_least 202106L [C++23] + __cpp_lib_allocate_at_least 202302L [C++23] __cpp_lib_allocator_traits_is_always_equal 201411L [C++17] __cpp_lib_any 201606L [C++17] __cpp_lib_apply 201603L [C++17] @@ -4279,8 +4279,8 @@ # ifndef __cpp_lib_allocate_at_least # error "__cpp_lib_allocate_at_least should be defined in c++23" # endif -# if __cpp_lib_allocate_at_least != 202106L -# error "__cpp_lib_allocate_at_least should have the value 202106L in c++23" +# if __cpp_lib_allocate_at_least != 202302L +# error "__cpp_lib_allocate_at_least should have the value 202302L in c++23" # endif # ifndef __cpp_lib_allocator_traits_is_always_equal @@ -5846,8 +5846,8 @@ # ifndef __cpp_lib_allocate_at_least # error "__cpp_lib_allocate_at_least should be defined in c++26" # endif -# if __cpp_lib_allocate_at_least != 202106L -# error "__cpp_lib_allocate_at_least should have the value 202106L in c++26" +# if __cpp_lib_allocate_at_least != 202302L +# error "__cpp_lib_allocate_at_least should have the value 202302L in c++26" # endif # ifndef __cpp_lib_allocator_traits_is_always_equal diff --git a/libcxx/test/std/utilities/memory/allocator.traits/allocate_at_least.pass.cpp b/libcxx/test/std/utilities/memory/allocator.traits/allocate_at_least.pass.cpp index ad9a2381cbfa1..b49052ef7f0bf 100644 --- a/libcxx/test/std/utilities/memory/allocator.traits/allocate_at_least.pass.cpp +++ b/libcxx/test/std/utilities/memory/allocator.traits/allocate_at_least.pass.cpp @@ -8,6 +8,8 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS + // <memory> // template<class Allocator> @@ -39,9 +41,7 @@ struct has_allocate_at_least { constexpr T* allocate(std::size_t) { return &t1; } constexpr void deallocate(T*, std::size_t) {} - constexpr std::allocation_result<T*> allocate_at_least(std::size_t) { - return {&t2, 2}; - } + constexpr std::allocation_result<T*> allocate_at_least(std::size_t) { return {&t2, 2}; } }; constexpr bool test() { diff --git a/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate_at_least.pass.cpp b/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate_at_least.pass.cpp new file mode 100644 index 0000000000000..88ae44c627584 --- /dev/null +++ b/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate_at_least.pass.cpp @@ -0,0 +1,70 @@ +//===----------------------------------------------------------------------===// +// +// 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: c++03, c++11, c++14, c++17, c++20 + +// <memory> + +// template<class Allocator> +// [[nodiscard]] constexpr allocation_result<typename allocator_traits<Allocator>::pointer> +// allocate_at_least(Allocator& a, size_t n); + +#include <cassert> +#include <concepts> +#include <cstddef> +#include <memory> + +// check that std::allocation_result exists and isn't restricted to pointers +using AllocResult = std::allocation_result<int>; + +template <class T> +struct no_allocate_at_least { + using value_type = T; + T t; + + constexpr T* allocate(std::size_t) { return &t; } + constexpr void deallocate(T*, std::size_t) {} +}; + +template <class T> +struct has_allocate_at_least { + using value_type = T; + T t1; + T t2; + + constexpr T* allocate(std::size_t) { return &t1; } + constexpr void deallocate(T*, std::size_t) {} + constexpr std::allocation_result<T*> allocate_at_least(std::size_t) { return {&t2, 2}; } +}; + +constexpr bool test() { + { // check that std::allocate_at_least forwards to allocator::allocate if no allocate_at_least exists + no_allocate_at_least<int> alloc; + std::same_as<std::allocation_result<int*>> decltype(auto) ret = + std::allocator_traits<decltype(alloc)>::allocate_at_least(alloc, 1); + assert(ret.count == 1); + assert(ret.ptr == &alloc.t); + } + + { // check that std::allocate_at_least forwards to allocator::allocate_at_least if allocate_at_least exists + has_allocate_at_least<int> alloc; + std::same_as<std::allocation_result<int*>> decltype(auto) ret = + std::allocator_traits<decltype(alloc)>::allocate_at_least(alloc, 1); + assert(ret.count == 2); + assert(ret.ptr == &alloc.t2); + } + + return true; +} + +int main(int, char**) { + test(); + static_assert(test()); + + return 0; +} diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py index 065b70620cd17..cfd8a8dd09e2a 100755 --- a/libcxx/utils/generate_feature_test_macro_components.py +++ b/libcxx/utils/generate_feature_test_macro_components.py @@ -88,9 +88,9 @@ def add_version_header(tc): { "name": "__cpp_lib_allocate_at_least", "values": { - "c++23": 202106, + # "c++23": 202106, # P0401R6 Providing size feedback in the Allocator interface # Note LWG3887 Version macro for allocate_at_least - # "c++26": 202302, # P2652R2 Disallow User Specialization of allocator_traits + "c++23": 202302, # P2652R2 Disallow User Specialization of allocator_traits }, "headers": ["memory"], }, >From 252f67bcc25c2caae211ea50bf6836f9f0345f05 Mon Sep 17 00:00:00 2001 From: Hristo Hristov <hghristov....@gmail.com> Date: Wed, 31 Jan 2024 08:59:52 +0200 Subject: [PATCH 2/7] Removed redundant fllag: `_LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS` Since this features was introduced in C++23 there is no need for a re-enable flag and the redundant code was removed. --- libcxx/docs/ReleaseNotes/19.rst | 4 +- libcxx/include/__memory/allocate_at_least.h | 16 ----- libcxx/include/__memory/allocation_result.h | 11 --- libcxx/include/__memory/allocator_traits.h | 2 +- libcxx/modules/std/memory.inc | 4 -- .../allocate_at_least.pass.cpp | 70 ------------------- 6 files changed, 2 insertions(+), 105 deletions(-) delete mode 100644 libcxx/test/std/utilities/memory/allocator.traits/allocate_at_least.pass.cpp diff --git a/libcxx/docs/ReleaseNotes/19.rst b/libcxx/docs/ReleaseNotes/19.rst index dee9ebc8b8c33..db731de2e4399 100644 --- a/libcxx/docs/ReleaseNotes/19.rst +++ b/libcxx/docs/ReleaseNotes/19.rst @@ -44,9 +44,7 @@ Implemented Papers Improvements and New Features ----------------------------- - -- The ``_LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS`` macro has been added to re-enable user specialization - of `allocator_traits`, which was disabled by `P2652R2 <https://wg21.link/P2652R2>`_. +TODO Deprecations and Removals diff --git a/libcxx/include/__memory/allocate_at_least.h b/libcxx/include/__memory/allocate_at_least.h index 3aa99ae2a05a7..b99fd22193769 100644 --- a/libcxx/include/__memory/allocate_at_least.h +++ b/libcxx/include/__memory/allocate_at_least.h @@ -22,25 +22,9 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 23 -# ifdef _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS -template <class _Alloc> -[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr allocation_result<typename allocator_traits<_Alloc>::pointer> -allocate_at_least(_Alloc& __alloc, size_t __n) { - if constexpr (requires { __alloc.allocate_at_least(__n); }) { - return __alloc.allocate_at_least(__n); - } else { - return {__alloc.allocate(__n), __n}; - } -} -# endif // _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS - template <class _Alloc> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto __allocate_at_least(_Alloc& __alloc, size_t __n) { -# ifndef _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS return std::allocator_traits<_Alloc>::allocate_at_least(__alloc, __n); -# else - return std::allocate_at_least(__alloc, __n); -# endif } #else diff --git a/libcxx/include/__memory/allocation_result.h b/libcxx/include/__memory/allocation_result.h index c0e594bc34a14..a912d4b90a69e 100644 --- a/libcxx/include/__memory/allocation_result.h +++ b/libcxx/include/__memory/allocation_result.h @@ -19,7 +19,6 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER >= 23 -# ifndef _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS template <class _Pointer, class _SizeType = size_t> struct allocation_result { @@ -28,16 +27,6 @@ struct allocation_result { }; _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result); -# else - -template <class _Pointer> -struct allocation_result { - _Pointer ptr; - size_t count; -}; -_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result); - -# endif // _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS #endif // _LIBCPP_STD_VER _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/__memory/allocator_traits.h b/libcxx/include/__memory/allocator_traits.h index 0cb699c2e7520..cfbc36697cb60 100644 --- a/libcxx/include/__memory/allocator_traits.h +++ b/libcxx/include/__memory/allocator_traits.h @@ -285,7 +285,7 @@ struct _LIBCPP_TEMPLATE_VIS allocator_traits { return __a.allocate(__n); } -#if _LIBCPP_STD_VER >= 23 && !defined(_LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS) +#if _LIBCPP_STD_VER >= 23 template <class _Ap = _Alloc> [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr allocation_result<pointer, size_type> allocate_at_least(_Ap& __alloc, size_type __n) { diff --git a/libcxx/modules/std/memory.inc b/libcxx/modules/std/memory.inc index a930119462cdc..56c621c0cf17f 100644 --- a/libcxx/modules/std/memory.inc +++ b/libcxx/modules/std/memory.inc @@ -43,10 +43,6 @@ export namespace std { #if _LIBCPP_STD_VER >= 23 using std::allocation_result; - -# ifdef _LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS - using std::allocate_at_least; -# endif #endif // [default.allocator], the default allocator diff --git a/libcxx/test/std/utilities/memory/allocator.traits/allocate_at_least.pass.cpp b/libcxx/test/std/utilities/memory/allocator.traits/allocate_at_least.pass.cpp deleted file mode 100644 index b49052ef7f0bf..0000000000000 --- a/libcxx/test/std/utilities/memory/allocator.traits/allocate_at_least.pass.cpp +++ /dev/null @@ -1,70 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// 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: c++03, c++11, c++14, c++17, c++20 - -// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX23_USER_SPECIALIZATION_OF_ALLOCATOR_TRAITS - -// <memory> - -// template<class Allocator> -// [[nodiscard]] constexpr allocation_result<typename allocator_traits<Allocator>::pointer> -// allocate_at_least(Allocator& a, size_t n); - -#include <cassert> -#include <concepts> -#include <cstddef> -#include <memory> - -// check that std::allocation_result exists and isn't restricted to pointers -using AllocResult = std::allocation_result<int>; - -template <class T> -struct no_allocate_at_least { - using value_type = T; - T t; - - constexpr T* allocate(std::size_t) { return &t; } - constexpr void deallocate(T*, std::size_t) {} -}; - -template <class T> -struct has_allocate_at_least { - using value_type = T; - T t1; - T t2; - - constexpr T* allocate(std::size_t) { return &t1; } - constexpr void deallocate(T*, std::size_t) {} - constexpr std::allocation_result<T*> allocate_at_least(std::size_t) { return {&t2, 2}; } -}; - -constexpr bool test() { - { // check that std::allocate_at_least forwards to allocator::allocate if no allocate_at_least exists - no_allocate_at_least<int> alloc; - std::same_as<std::allocation_result<int*>> decltype(auto) ret = std::allocate_at_least(alloc, 1); - assert(ret.count == 1); - assert(ret.ptr == &alloc.t); - } - - { // check that std::allocate_at_least forwards to allocator::allocate_at_least if allocate_at_least exists - has_allocate_at_least<int> alloc; - std::same_as<std::allocation_result<int*>> decltype(auto) ret = std::allocate_at_least(alloc, 1); - assert(ret.count == 2); - assert(ret.ptr == &alloc.t2); - } - - return true; -} - -int main(int, char**) { - test(); - static_assert(test()); - - return 0; -} >From 070e17fb57a39edc351aa7747baf70785204e2b1 Mon Sep 17 00:00:00 2001 From: Hristo Hristov <hghristov....@gmail.com> Date: Wed, 31 Jan 2024 09:37:33 +0200 Subject: [PATCH 3/7] Fixed formatting --- libcxx/include/__memory/allocation_result.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcxx/include/__memory/allocation_result.h b/libcxx/include/__memory/allocation_result.h index a912d4b90a69e..2a388e24e5d23 100644 --- a/libcxx/include/__memory/allocation_result.h +++ b/libcxx/include/__memory/allocation_result.h @@ -27,7 +27,7 @@ struct allocation_result { }; _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result); -#endif // _LIBCPP_STD_VER +#endif // _LIBCPP_STD_VER _LIBCPP_END_NAMESPACE_STD >From 5de75ced0403f513c0a5f6b31d32ffd854de596c Mon Sep 17 00:00:00 2001 From: Hristo Hristov <zin...@outlook.com> Date: Wed, 31 Jan 2024 19:24:54 +0200 Subject: [PATCH 4/7] Update libcxx/utils/generate_feature_test_macro_components.py --- libcxx/utils/generate_feature_test_macro_components.py | 1 - 1 file changed, 1 deletion(-) diff --git a/libcxx/utils/generate_feature_test_macro_components.py b/libcxx/utils/generate_feature_test_macro_components.py index cfd8a8dd09e2a..6078e811c8e1e 100755 --- a/libcxx/utils/generate_feature_test_macro_components.py +++ b/libcxx/utils/generate_feature_test_macro_components.py @@ -88,7 +88,6 @@ def add_version_header(tc): { "name": "__cpp_lib_allocate_at_least", "values": { - # "c++23": 202106, # P0401R6 Providing size feedback in the Allocator interface # Note LWG3887 Version macro for allocate_at_least "c++23": 202302, # P2652R2 Disallow User Specialization of allocator_traits }, >From f9b5af4152bc0f418558dafe600cc9485405bae2 Mon Sep 17 00:00:00 2001 From: Hristo Hristov <hghristov....@gmail.com> Date: Wed, 31 Jan 2024 19:29:29 +0200 Subject: [PATCH 5/7] Cleanup --- libcxx/include/memory | 3 --- 1 file changed, 3 deletions(-) diff --git a/libcxx/include/memory b/libcxx/include/memory index c57f5dd9d3c7b..59fae73da103e 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -88,9 +88,6 @@ struct allocator_traits static pointer allocate(allocator_type& a, size_type n); // constexpr and [[nodiscard]] in C++20 static pointer allocate(allocator_type& a, size_type n, const_void_pointer hint); // constexpr and [[nodiscard]] in C++20 - [[nodiscard]] static constexpr allocation_result<pointer, size_type> - allocate_at_least(Alloc& a, size_type n); // Since C++23 - static void deallocate(allocator_type& a, pointer p, size_type n) noexcept; // constexpr in C++20 template <class T, class... Args> >From 300490f2babe1c388417d7ba28b2011b5c9de9c3 Mon Sep 17 00:00:00 2001 From: Hristo Hristov <hghristov....@gmail.com> Date: Wed, 31 Jan 2024 20:48:51 +0200 Subject: [PATCH 6/7] Removed `allocation_result.h` --- libcxx/include/CMakeLists.txt | 1 - libcxx/include/__format/buffer.h | 1 - libcxx/include/__memory/allocate_at_least.h | 1 - libcxx/include/__memory/allocation_result.h | 34 --------------------- libcxx/include/__memory/allocator.h | 1 - libcxx/include/__memory/allocator_traits.h | 12 +++++++- libcxx/include/__split_buffer | 1 - libcxx/include/libcxx.imp | 1 - libcxx/include/memory | 1 - libcxx/include/module.modulemap.in | 1 - libcxx/include/string | 1 - libcxx/include/vector | 1 - 12 files changed, 11 insertions(+), 45 deletions(-) delete mode 100644 libcxx/include/__memory/allocation_result.h diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt index e2ca533510aa3..0bb23710cae84 100644 --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -521,7 +521,6 @@ set(files __memory/aligned_alloc.h __memory/allocate_at_least.h __memory/allocation_guard.h - __memory/allocation_result.h __memory/allocator.h __memory/allocator_arg_t.h __memory/allocator_destructor.h diff --git a/libcxx/include/__format/buffer.h b/libcxx/include/__format/buffer.h index 9b18e01aea8bb..8598f0a1c0395 100644 --- a/libcxx/include/__format/buffer.h +++ b/libcxx/include/__format/buffer.h @@ -29,7 +29,6 @@ #include <__iterator/wrap_iter.h> #include <__memory/addressof.h> #include <__memory/allocate_at_least.h> -#include <__memory/allocation_result.h> #include <__memory/allocator_traits.h> #include <__memory/construct_at.h> #include <__memory/ranges_construct_at.h> diff --git a/libcxx/include/__memory/allocate_at_least.h b/libcxx/include/__memory/allocate_at_least.h index b99fd22193769..b2e5dd3ff98a0 100644 --- a/libcxx/include/__memory/allocate_at_least.h +++ b/libcxx/include/__memory/allocate_at_least.h @@ -10,7 +10,6 @@ #define _LIBCPP___MEMORY_ALLOCATE_AT_LEAST_H #include <__config> -#include <__memory/allocation_result.h> #include <__memory/allocator_traits.h> #include <cstddef> diff --git a/libcxx/include/__memory/allocation_result.h b/libcxx/include/__memory/allocation_result.h deleted file mode 100644 index 2a388e24e5d23..0000000000000 --- a/libcxx/include/__memory/allocation_result.h +++ /dev/null @@ -1,34 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -#ifndef _LIBCPP___MEMORY_ALLOCATION_RESULT_H -#define _LIBCPP___MEMORY_ALLOCATION_RESULT_H - -#include <__config> -#include <cstddef> - -#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) -# pragma GCC system_header -#endif - -_LIBCPP_BEGIN_NAMESPACE_STD - -#if _LIBCPP_STD_VER >= 23 - -template <class _Pointer, class _SizeType = size_t> -struct allocation_result { - _Pointer ptr; - _SizeType count; -}; -_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result); - -#endif // _LIBCPP_STD_VER - -_LIBCPP_END_NAMESPACE_STD - -#endif // _LIBCPP___MEMORY_ALLOCATION_RESULT_H diff --git a/libcxx/include/__memory/allocator.h b/libcxx/include/__memory/allocator.h index b8cf33d4b1d46..4e6303914c38a 100644 --- a/libcxx/include/__memory/allocator.h +++ b/libcxx/include/__memory/allocator.h @@ -13,7 +13,6 @@ #include <__config> #include <__memory/addressof.h> #include <__memory/allocate_at_least.h> -#include <__memory/allocation_result.h> #include <__memory/allocator_traits.h> #include <__type_traits/is_constant_evaluated.h> #include <__type_traits/is_same.h> diff --git a/libcxx/include/__memory/allocator_traits.h b/libcxx/include/__memory/allocator_traits.h index cfbc36697cb60..5b3b68cbf3492 100644 --- a/libcxx/include/__memory/allocator_traits.h +++ b/libcxx/include/__memory/allocator_traits.h @@ -11,7 +11,6 @@ #define _LIBCPP___MEMORY_ALLOCATOR_TRAITS_H #include <__config> -#include <__memory/allocation_result.h> #include <__memory/construct_at.h> #include <__memory/pointer_traits.h> #include <__type_traits/enable_if.h> @@ -232,6 +231,17 @@ struct __has_select_on_container_copy_construction< _LIBCPP_SUPPRESS_DEPRECATED_POP +#if _LIBCPP_STD_VER >= 23 + +template <class _Pointer, class _SizeType = size_t> +struct allocation_result { + _Pointer ptr; + _SizeType count; +}; +_LIBCPP_CTAD_SUPPORTED_FOR_TYPE(allocation_result); + +#endif // _LIBCPP_STD_VER + template <class _Alloc> struct _LIBCPP_TEMPLATE_VIS allocator_traits { using allocator_type = _Alloc; diff --git a/libcxx/include/__split_buffer b/libcxx/include/__split_buffer index c12272e57d857..aaf955685d2d3 100644 --- a/libcxx/include/__split_buffer +++ b/libcxx/include/__split_buffer @@ -18,7 +18,6 @@ #include <__iterator/iterator_traits.h> #include <__iterator/move_iterator.h> #include <__memory/allocate_at_least.h> -#include <__memory/allocation_result.h> #include <__memory/allocator.h> #include <__memory/allocator_traits.h> #include <__memory/compressed_pair.h> diff --git a/libcxx/include/libcxx.imp b/libcxx/include/libcxx.imp index 341c2c61f25cf..13c0dfeb2bc98 100644 --- a/libcxx/include/libcxx.imp +++ b/libcxx/include/libcxx.imp @@ -512,7 +512,6 @@ { include: [ "<__memory/aligned_alloc.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocate_at_least.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocation_guard.h>", "private", "<memory>", "public" ] }, - { include: [ "<__memory/allocation_result.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocator.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocator_arg_t.h>", "private", "<memory>", "public" ] }, { include: [ "<__memory/allocator_destructor.h>", "private", "<memory>", "public" ] }, diff --git a/libcxx/include/memory b/libcxx/include/memory index 59fae73da103e..984ab6ccd73a5 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -924,7 +924,6 @@ template<size_t N, class T> #include <__memory/align.h> #include <__memory/allocate_at_least.h> #include <__memory/allocation_guard.h> -#include <__memory/allocation_result.h> #include <__memory/allocator.h> #include <__memory/allocator_arg_t.h> #include <__memory/allocator_traits.h> diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in index ceb576b662612..207b44b6444bf 100644 --- a/libcxx/include/module.modulemap.in +++ b/libcxx/include/module.modulemap.in @@ -1499,7 +1499,6 @@ module std_private_memory_align [system] { header "__m module std_private_memory_aligned_alloc [system] { header "__memory/aligned_alloc.h" } module std_private_memory_allocate_at_least [system] { header "__memory/allocate_at_least.h" } module std_private_memory_allocation_guard [system] { header "__memory/allocation_guard.h" } -module std_private_memory_allocation_result [system] { header "__memory/allocation_result.h" } module std_private_memory_allocator [system] { header "__memory/allocator.h" } module std_private_memory_allocator_arg_t [system] { header "__memory/allocator_arg_t.h" } module std_private_memory_allocator_destructor [system] { header "__memory/allocator_destructor.h" } diff --git a/libcxx/include/string b/libcxx/include/string index a8a8469751c7e..6bcb5b4bc500c 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -585,7 +585,6 @@ basic_string<char32_t> operator""s( const char32_t *str, size_t len ); #include <__iterator/wrap_iter.h> #include <__memory/addressof.h> #include <__memory/allocate_at_least.h> -#include <__memory/allocation_result.h> #include <__memory/allocator.h> #include <__memory/allocator_traits.h> #include <__memory/compressed_pair.h> diff --git a/libcxx/include/vector b/libcxx/include/vector index 66aa25a70ce0b..f24d2c4b9c6ac 100644 --- a/libcxx/include/vector +++ b/libcxx/include/vector @@ -332,7 +332,6 @@ template<class T, class charT> requires is-vector-bool-reference<T> // Since C++ #include <__iterator/wrap_iter.h> #include <__memory/addressof.h> #include <__memory/allocate_at_least.h> -#include <__memory/allocation_result.h> #include <__memory/allocator_traits.h> #include <__memory/pointer_traits.h> #include <__memory/swap_allocator.h> >From a1ca4fad5f1ac56a7b33a0ee1cd1e3cc5d5b1843 Mon Sep 17 00:00:00 2001 From: Hristo Hristov <hghristov....@gmail.com> Date: Wed, 31 Jan 2024 20:54:02 +0200 Subject: [PATCH 7/7] Undo formatting of <string> --- libcxx/include/string | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/libcxx/include/string b/libcxx/include/string index 6bcb5b4bc500c..efdff3dd42da0 100644 --- a/libcxx/include/string +++ b/libcxx/include/string @@ -922,11 +922,7 @@ public: // Turning off ASan instrumentation for variable initialization with _LIBCPP_STRING_INTERNAL_MEMORY_ACCESS // does not work consistently during initialization of __r_, so we instead unpoison __str's memory manually first. // __str's memory needs to be unpoisoned only in the case where it's a short string. - : __r_([](basic_string& __s) -> decltype(__s.__r_)&& { - if (!__s.__is_long()) - __s.__annotate_delete(); - return std::move(__s.__r_); - }(__str)) { + : __r_([](basic_string &__s) -> decltype(__s.__r_)&& { if(!__s.__is_long()) __s.__annotate_delete(); return std::move(__s.__r_); }(__str)) { __str.__r_.first() = __rep(); __str.__annotate_new(0); if (!__is_long()) @@ -1906,7 +1902,7 @@ private: } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __annotate_new(size_type __current_size) const _NOEXCEPT { - (void)__current_size; + (void) __current_size; #if !defined(_LIBCPP_HAS_NO_ASAN) && defined(_LIBCPP_INSTRUMENTED_WITH_ASAN) if (!__libcpp_is_constant_evaluated() && (__asan_short_string_is_annotated() || __is_long())) __annotate_contiguous_container(data() + capacity() + 1, data() + __current_size + 1); @@ -1921,7 +1917,7 @@ private: } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __annotate_increase(size_type __n) const _NOEXCEPT { - (void)__n; + (void) __n; #if !defined(_LIBCPP_HAS_NO_ASAN) && defined(_LIBCPP_INSTRUMENTED_WITH_ASAN) if (!__libcpp_is_constant_evaluated() && (__asan_short_string_is_annotated() || __is_long())) __annotate_contiguous_container(data() + size() + 1, data() + size() + 1 + __n); @@ -1929,7 +1925,7 @@ private: } _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __annotate_shrink(size_type __old_size) const _NOEXCEPT { - (void)__old_size; + (void) __old_size; #if !defined(_LIBCPP_HAS_NO_ASAN) && defined(_LIBCPP_INSTRUMENTED_WITH_ASAN) if (!__libcpp_is_constant_evaluated() && (__asan_short_string_is_annotated() || __is_long())) __annotate_contiguous_container(data() + __old_size + 1, data() + size() + 1); @@ -1940,7 +1936,9 @@ private: static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __align_it(size_type __s) _NOEXCEPT { return (__s + (__a - 1)) & ~(__a - 1); } - enum { __alignment = 8 }; + enum { + __alignment = 8 + }; static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __recommend(size_type __s) _NOEXCEPT { if (__s < __min_cap) { return static_cast<size_type>(__min_cap) - 1; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits