[libcxx-commits] [clang] [compiler-rt] [openmp] [libcxx] [libc] [llvm] [libcxxabi] [clang-tools-extra] [mlir] [lldb] [lld] [flang] [libc++][memory] P2652R2: Disallow Specialization of `allocator_traits` (PR #79978)
Hristo Hristov via libcxx-commits
libcxx-commits at lists.llvm.org
Wed Jan 31 11:09:58 PST 2024
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 <zingam at outlook.com>
Date: Sat, 27 Jan 2024 13:54:21 +0200
Subject: [PATCH 1/8] [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.rmm at gmail.com>
Date: Wed, 31 Jan 2024 08:59:52 +0200
Subject: [PATCH 2/8] 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.rmm at gmail.com>
Date: Wed, 31 Jan 2024 09:37:33 +0200
Subject: [PATCH 3/8] 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 <zingam at outlook.com>
Date: Wed, 31 Jan 2024 19:24:54 +0200
Subject: [PATCH 4/8] 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.rmm at gmail.com>
Date: Wed, 31 Jan 2024 19:29:29 +0200
Subject: [PATCH 5/8] 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.rmm at gmail.com>
Date: Wed, 31 Jan 2024 20:48:51 +0200
Subject: [PATCH 6/8] 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.rmm at gmail.com>
Date: Wed, 31 Jan 2024 20:54:02 +0200
Subject: [PATCH 7/8] 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;
>From 4c0f2358bbf95d55a174842b0906d25c4bff54d8 Mon Sep 17 00:00:00 2001
From: Hristo Hristov <hghristov.rmm at gmail.com>
Date: Wed, 31 Jan 2024 21:09:13 +0200
Subject: [PATCH 8/8] Fix CI
---
libcxx/include/__memory/allocator_traits.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/libcxx/include/__memory/allocator_traits.h b/libcxx/include/__memory/allocator_traits.h
index 5b3b68cbf3492..3c7fc863b77bc 100644
--- a/libcxx/include/__memory/allocator_traits.h
+++ b/libcxx/include/__memory/allocator_traits.h
@@ -22,6 +22,7 @@
#include <__type_traits/void_t.h>
#include <__utility/declval.h>
#include <__utility/forward.h>
+#include <cstddef>
#include <limits>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
More information about the libcxx-commits
mailing list