[libcxx-commits] [libcxx] [libc++] Don't instantiate allocators in __tree on an incomplete type (PR #140225)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Fri May 16 02:24:10 PDT 2025


https://github.com/philnik777 created https://github.com/llvm/llvm-project/pull/140225

This causes a mismatch between `value_type` and `allocator_type::value_type` in `__tree`, but I think that's acceptable. `__tree` primarily gets a `__value_type` wrapper due to potential ABI breaks and unwraps it to the same as `allocator_type::value_type` in the end. A cleanup patch will also change `__tree::value_type` to be the same as `allocator_type::value_type`, making the type mismatch only visible where `__tree` is instantiated in `map`.


>From b2ac260ef85d624fb700b7c87176a3891652018a Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 16 May 2025 11:20:01 +0200
Subject: [PATCH] [libc++] Don't instantiate allocators in __tree on an
 incomplete type

---
 libcxx/include/map                  | 6 ++----
 libcxx/test/support/min_allocator.h | 3 +++
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/libcxx/include/map b/libcxx/include/map
index 039ed86dc756f..24eadbd154220 100644
--- a/libcxx/include/map
+++ b/libcxx/include/map
@@ -911,8 +911,7 @@ public:
 private:
   typedef std::__value_type<key_type, mapped_type> __value_type;
   typedef __map_value_compare<key_type, value_type, key_compare> __vc;
-  typedef __rebind_alloc<allocator_traits<allocator_type>, __value_type> __allocator_type;
-  typedef __tree<__value_type, __vc, __allocator_type> __base;
+  typedef __tree<__value_type, __vc, allocator_type> __base;
   typedef typename __base::__node_traits __node_traits;
   typedef allocator_traits<allocator_type> __alloc_traits;
 
@@ -1596,8 +1595,7 @@ public:
 private:
   typedef std::__value_type<key_type, mapped_type> __value_type;
   typedef __map_value_compare<key_type, value_type, key_compare> __vc;
-  typedef __rebind_alloc<allocator_traits<allocator_type>, __value_type> __allocator_type;
-  typedef __tree<__value_type, __vc, __allocator_type> __base;
+  typedef __tree<__value_type, __vc, allocator_type> __base;
   typedef typename __base::__node_traits __node_traits;
   typedef allocator_traits<allocator_type> __alloc_traits;
 
diff --git a/libcxx/test/support/min_allocator.h b/libcxx/test/support/min_allocator.h
index 24505bbb508d6..4072f9776ccd6 100644
--- a/libcxx/test/support/min_allocator.h
+++ b/libcxx/test/support/min_allocator.h
@@ -390,6 +390,9 @@ class min_allocator
     typedef T value_type;
     typedef min_pointer<T> pointer;
 
+    // Make sure that value_type is a complete when min_allocator is instantiated
+    static_assert(alignof(value_type) != 0);
+
     min_allocator() = default;
     template <class U>
     TEST_CONSTEXPR_CXX20 min_allocator(min_allocator<U>) {}



More information about the libcxx-commits mailing list