[libcxx-commits] [compiler-rt] [libcxx] [libc++] Drop transitive includes by default (PR #195509)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Tue May 19 03:54:59 PDT 2026


https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/195509

>From 2f5a301883a2e86d61517e3c199476ad6637ad5c Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Sun, 3 May 2026 10:20:52 +0200
Subject: [PATCH] [libc++] Drop transitive includes by default

---
 compiler-rt/test/tsan/many_held_mutex.cpp            |  2 +-
 libcxx/docs/ReleaseNotes/23.rst                      |  6 ++++++
 libcxx/include/__functional/function.h               |  1 +
 libcxx/include/algorithm                             |  4 ++--
 libcxx/include/any                                   |  6 +++---
 libcxx/include/array                                 |  2 +-
 libcxx/include/atomic                                |  2 +-
 libcxx/include/barrier                               |  2 +-
 libcxx/include/bit                                   |  2 +-
 libcxx/include/bitset                                |  2 +-
 libcxx/include/charconv                              |  2 +-
 libcxx/include/chrono                                |  6 +++---
 libcxx/include/cmath                                 |  2 +-
 libcxx/include/codecvt                               |  2 +-
 libcxx/include/compare                               |  2 +-
 libcxx/include/complex                               |  2 +-
 libcxx/include/concepts                              |  2 +-
 libcxx/include/condition_variable                    |  2 +-
 libcxx/include/coroutine                             |  2 +-
 libcxx/include/cwchar                                |  2 +-
 libcxx/include/deque                                 |  2 +-
 libcxx/include/exception                             |  4 ++--
 libcxx/include/execution                             |  2 +-
 libcxx/include/experimental/iterator                 |  4 ++--
 libcxx/include/experimental/memory                   |  2 +-
 libcxx/include/experimental/propagate_const          |  2 +-
 libcxx/include/experimental/simd                     |  2 +-
 libcxx/include/experimental/type_traits              |  2 +-
 libcxx/include/experimental/utility                  |  2 +-
 libcxx/include/ext/hash_map                          |  2 +-
 libcxx/include/ext/hash_set                          |  2 +-
 libcxx/include/filesystem                            |  2 +-
 libcxx/include/format                                |  4 ++--
 libcxx/include/forward_list                          |  2 +-
 libcxx/include/fstream                               |  4 ++--
 libcxx/include/functional                            |  8 ++++----
 libcxx/include/future                                |  4 ++--
 libcxx/include/initializer_list                      |  2 +-
 libcxx/include/iomanip                               |  4 ++--
 libcxx/include/ios                                   |  2 +-
 libcxx/include/istream                               |  4 ++--
 libcxx/include/iterator                              |  4 ++--
 libcxx/include/latch                                 |  2 +-
 libcxx/include/limits                                |  2 +-
 libcxx/include/list                                  |  2 +-
 libcxx/include/locale                                |  2 +-
 libcxx/include/map                                   |  2 +-
 libcxx/include/memory                                |  2 +-
 libcxx/include/memory_resource                       |  4 ++--
 libcxx/include/module.modulemap.in                   | 12 ++++++++++--
 libcxx/include/mutex                                 |  4 ++--
 libcxx/include/new                                   |  2 +-
 libcxx/include/numbers                               |  2 +-
 libcxx/include/numeric                               |  4 ++--
 libcxx/include/optional                              |  2 +-
 libcxx/include/ostream                               |  4 ++--
 libcxx/include/queue                                 |  2 +-
 libcxx/include/random                                |  2 +-
 libcxx/include/ranges                                |  2 +-
 libcxx/include/ratio                                 |  2 +-
 libcxx/include/regex                                 |  2 +-
 libcxx/include/scoped_allocator                      |  2 +-
 libcxx/include/semaphore                             |  2 +-
 libcxx/include/set                                   |  2 +-
 libcxx/include/shared_mutex                          |  2 +-
 libcxx/include/span                                  |  2 +-
 libcxx/include/sstream                               |  2 +-
 libcxx/include/stack                                 |  2 +-
 libcxx/include/stdexcept                             |  2 +-
 libcxx/include/stop_token                            |  2 +-
 libcxx/include/streambuf                             |  2 +-
 libcxx/include/string                                |  2 +-
 libcxx/include/string_view                           |  2 +-
 libcxx/include/system_error                          |  2 +-
 libcxx/include/thread                                |  4 ++--
 libcxx/include/tuple                                 |  2 +-
 libcxx/include/typeindex                             |  2 +-
 libcxx/include/typeinfo                              |  2 +-
 libcxx/include/unordered_map                         |  2 +-
 libcxx/include/unordered_set                         |  2 +-
 libcxx/include/utility                               |  7 ++-----
 libcxx/include/valarray                              |  2 +-
 libcxx/include/variant                               |  2 +-
 libcxx/include/vector                                |  4 ++--
 libcxx/test/libcxx/transitive_includes.gen.py        |  4 ++--
 .../func.wrap/func.wrap.func/derive_from.pass.cpp    |  1 +
 .../util.smartptr.weak.const/pr40459.pass.cpp        |  6 +-----
 87 files changed, 125 insertions(+), 116 deletions(-)

diff --git a/compiler-rt/test/tsan/many_held_mutex.cpp b/compiler-rt/test/tsan/many_held_mutex.cpp
index 76e072b35a233..781f9379133d2 100644
--- a/compiler-rt/test/tsan/many_held_mutex.cpp
+++ b/compiler-rt/test/tsan/many_held_mutex.cpp
@@ -1,8 +1,8 @@
 // RUN: %clangxx_tsan -O1 %s %link_libcxx_tsan -fsanitize=thread -o %t
 // RUN: %run %t 128
 
+#include <cstdlib>
 #include <mutex>
-#include <string>
 #include <vector>
 
 int main(int argc, char *argv[]) {
diff --git a/libcxx/docs/ReleaseNotes/23.rst b/libcxx/docs/ReleaseNotes/23.rst
index a55869a8bf783..d2e301b44dfa2 100644
--- a/libcxx/docs/ReleaseNotes/23.rst
+++ b/libcxx/docs/ReleaseNotes/23.rst
@@ -57,6 +57,7 @@ Improvements and New Features
   for ``std::deque<int>`` iterators.
 - ``std::copy(CharT*, CharT*, ostreambuf_iterator<CharT>)`` has been optimized, resulting in performance improvements
   of up to 25x.
+- A lot of transitive includes have been removed, resulting in significant compile time improvements.
 
 Deprecations and Removals
 -------------------------
@@ -73,6 +74,11 @@ Deprecations and Removals
 Potentially breaking changes
 ----------------------------
 
+- libc++ has dropped a lot of transitive includes in all language modes. This improves compile time significantly, but
+  causes programs which rely on these includes to not compile anymore. Any errors caused by this should be fixable by
+  including the correct header. To ease the transition ``_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23`` can be defined, which
+  includes the removed headers again. This macro will be removed in LLVM 24.
+
 Announcements About Future Releases
 -----------------------------------
 
diff --git a/libcxx/include/__functional/function.h b/libcxx/include/__functional/function.h
index 3185a1942455a..d0a94dd5535c3 100644
--- a/libcxx/include/__functional/function.h
+++ b/libcxx/include/__functional/function.h
@@ -17,6 +17,7 @@
 #include <__functional/binary_function.h>
 #include <__functional/unary_function.h>
 #include <__memory/addressof.h>
+#include <__new/placement_new_delete.h>
 #include <__type_traits/aligned_storage.h>
 #include <__type_traits/decay.h>
 #include <__type_traits/invoke.h>
diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm
index 95446b44eaf9c..a0c632edbcbda 100644
--- a/libcxx/include/algorithm
+++ b/libcxx/include/algorithm
@@ -2104,11 +2104,11 @@ template <class BidirectionalIterator, class Compare>
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER == 14
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER == 14
 #    include <execution>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <bit>
 #    include <concepts>
diff --git a/libcxx/include/any b/libcxx/include/any
index 740bcec93835c..20f4824e87668 100644
--- a/libcxx/include/any
+++ b/libcxx/include/any
@@ -560,11 +560,11 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 17
 #    include <chrono>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstdlib>
@@ -576,7 +576,7 @@ _LIBCPP_POP_MACROS
 #    include <variant>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <cstring>
 #    include <limits>
 #  endif
diff --git a/libcxx/include/array b/libcxx/include/array
index 0b0c85458999c..2522537227b88 100644
--- a/libcxx/include/array
+++ b/libcxx/include/array
@@ -594,7 +594,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <concepts>
 #    include <cstdlib>
diff --git a/libcxx/include/atomic b/libcxx/include/atomic
index 23a3db5d35029..ec40a0883f152 100644
--- a/libcxx/include/atomic
+++ b/libcxx/include/atomic
@@ -630,7 +630,7 @@ template <class T>
 #    error <atomic> is not implemented
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cmath>
 #    include <compare>
 #    include <cstddef>
diff --git a/libcxx/include/barrier b/libcxx/include/barrier
index 0bd0e3da0ca18..7fda4c8e06179 100644
--- a/libcxx/include/barrier
+++ b/libcxx/include/barrier
@@ -192,7 +192,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_THREADS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <iterator>
diff --git a/libcxx/include/bit b/libcxx/include/bit
index fbe56bf5b689e..c483f4e003f62 100644
--- a/libcxx/include/bit
+++ b/libcxx/include/bit
@@ -90,7 +90,7 @@ namespace std {
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstdlib>
 #    include <iosfwd>
 #    include <limits>
diff --git a/libcxx/include/bitset b/libcxx/include/bitset
index 37253f5722389..fd638daea8c73 100644
--- a/libcxx/include/bitset
+++ b/libcxx/include/bitset
@@ -971,7 +971,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <cstdlib>
 #    include <optional>
diff --git a/libcxx/include/charconv b/libcxx/include/charconv
index 4c2061b5fcb99..5d31957bf81fd 100644
--- a/libcxx/include/charconv
+++ b/libcxx/include/charconv
@@ -104,7 +104,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 
 _LIBCPP_END_NAMESPACE_STD
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cmath>
 #    include <concepts>
 #    include <cstddef>
diff --git a/libcxx/include/chrono b/libcxx/include/chrono
index abb678e111c73..39822d5e74f79 100644
--- a/libcxx/include/chrono
+++ b/libcxx/include/chrono
@@ -1148,13 +1148,13 @@ namespace std {
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 17
 #    include <cstdint>
 #    include <stdexcept>
 #    include <string_view>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <bit>
 #    include <concepts>
 #    include <cstring>
@@ -1164,7 +1164,7 @@ namespace std {
 #    include <vector>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER == 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER == 20
 #    include <charconv>
 #    if _LIBCPP_HAS_LOCALIZATION
 #      include <locale>
diff --git a/libcxx/include/cmath b/libcxx/include/cmath
index bee743f702d01..208791ca0804c 100644
--- a/libcxx/include/cmath
+++ b/libcxx/include/cmath
@@ -612,7 +612,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <type_traits>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/codecvt b/libcxx/include/codecvt
index 00f3301a60f55..ea7c0f876f61a 100644
--- a/libcxx/include/codecvt
+++ b/libcxx/include/codecvt
@@ -587,7 +587,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstddef>
diff --git a/libcxx/include/compare b/libcxx/include/compare
index c229c68d6f88d..094603dd9933a 100644
--- a/libcxx/include/compare
+++ b/libcxx/include/compare
@@ -167,7 +167,7 @@ namespace std {
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cmath>
 #    include <cstddef>
 #    include <type_traits>
diff --git a/libcxx/include/complex b/libcxx/include/complex
index 49ab388113542..f1ba85eb9624e 100644
--- a/libcxx/include/complex
+++ b/libcxx/include/complex
@@ -1484,7 +1484,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <iosfwd>
 #    include <stdexcept>
 #    include <type_traits>
diff --git a/libcxx/include/concepts b/libcxx/include/concepts
index 47e31d0b685e8..cee3db23c06f5 100644
--- a/libcxx/include/concepts
+++ b/libcxx/include/concepts
@@ -161,7 +161,7 @@ namespace std {
 
 #  include <version>
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <type_traits>
 #  endif
diff --git a/libcxx/include/condition_variable b/libcxx/include/condition_variable
index a5dc060fbfa38..a6b5f842f3bc8 100644
--- a/libcxx/include/condition_variable
+++ b/libcxx/include/condition_variable
@@ -350,7 +350,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstdint>
diff --git a/libcxx/include/coroutine b/libcxx/include/coroutine
index ff71b99e6d578..ffd12eec7819d 100644
--- a/libcxx/include/coroutine
+++ b/libcxx/include/coroutine
@@ -61,7 +61,7 @@ struct suspend_always;
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <iosfwd>
 #    include <limits>
diff --git a/libcxx/include/cwchar b/libcxx/include/cwchar
index d41af176f74fd..e2534977a7a3c 100644
--- a/libcxx/include/cwchar
+++ b/libcxx/include/cwchar
@@ -258,7 +258,7 @@ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _Tp* __constexpr_wmemchr(_Tp
 
 _LIBCPP_END_NAMESPACE_STD
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/deque b/libcxx/include/deque
index c8c6889f1a165..bf589b05aef72 100644
--- a/libcxx/include/deque
+++ b/libcxx/include/deque
@@ -2543,7 +2543,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <atomic>
 #    include <concepts>
diff --git a/libcxx/include/exception b/libcxx/include/exception
index 0b2372e571e99..4f2135e8f5d28 100644
--- a/libcxx/include/exception
+++ b/libcxx/include/exception
@@ -91,13 +91,13 @@ template <class E> void rethrow_if_nested(const E& e);
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <new>
 #    include <type_traits>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <cstdlib>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/execution b/libcxx/include/execution
index 652f38d1c126f..355d3e3c99d4e 100644
--- a/libcxx/include/execution
+++ b/libcxx/include/execution
@@ -155,7 +155,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 #  endif // _LIBCPP_HAS_EXPERIMENTAL_PSTL && _LIBCPP_STD_VER >= 17
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/experimental/iterator b/libcxx/include/experimental/iterator
index 0ed95188d7715..fd320dcc7d170 100644
--- a/libcxx/include/experimental/iterator
+++ b/libcxx/include/experimental/iterator
@@ -124,14 +124,14 @@ _LIBCPP_END_NAMESPACE_LFTS
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <iosfwd>
 #    include <optional>
 #    include <type_traits>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <locale>
 #  endif
 
diff --git a/libcxx/include/experimental/memory b/libcxx/include/experimental/memory
index ffbd8f3a065a6..b6d7b16cb6592 100644
--- a/libcxx/include/experimental/memory
+++ b/libcxx/include/experimental/memory
@@ -196,7 +196,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 #  endif // _LIBCPP_ENABLE_EXPERIMENTAL
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <limits>
 #  endif
diff --git a/libcxx/include/experimental/propagate_const b/libcxx/include/experimental/propagate_const
index 6a7f8ae9c4595..f6a99cda1a07f 100644
--- a/libcxx/include/experimental/propagate_const
+++ b/libcxx/include/experimental/propagate_const
@@ -488,7 +488,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <type_traits>
 #  endif
diff --git a/libcxx/include/experimental/simd b/libcxx/include/experimental/simd
index 2e1c781ed61a8..3c57fa4699118 100644
--- a/libcxx/include/experimental/simd
+++ b/libcxx/include/experimental/simd
@@ -88,7 +88,7 @@ inline namespace parallelism_v2 {
 #  include <experimental/__simd/traits.h>
 #  include <experimental/__simd/vec_ext.h>
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/experimental/type_traits b/libcxx/include/experimental/type_traits
index fd03546b2916f..6f0d52010e030 100644
--- a/libcxx/include/experimental/type_traits
+++ b/libcxx/include/experimental/type_traits
@@ -151,7 +151,7 @@ constexpr bool is_detected_convertible_v = is_detected_convertible<_To, _Op, _Ar
 
 _LIBCPP_END_NAMESPACE_LFTS
 
-#    if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#    if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #      include <cstddef>
 #    endif
 
diff --git a/libcxx/include/experimental/utility b/libcxx/include/experimental/utility
index fb0537fe61636..30b733a058e3f 100644
--- a/libcxx/include/experimental/utility
+++ b/libcxx/include/experimental/utility
@@ -46,7 +46,7 @@ struct erased_type {};
 
 _LIBCPP_END_NAMESPACE_LFTS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/ext/hash_map b/libcxx/include/ext/hash_map
index 09c981131ff96..3ffb87755ded6 100644
--- a/libcxx/include/ext/hash_map
+++ b/libcxx/include/ext/hash_map
@@ -825,7 +825,7 @@ inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const hash_multimap<_Key, _Tp, _Has
 
 } // namespace __gnu_cxx
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <iterator>
 #    include <type_traits>
diff --git a/libcxx/include/ext/hash_set b/libcxx/include/ext/hash_set
index 56aa4d8a47eeb..412f2f34992e5 100644
--- a/libcxx/include/ext/hash_set
+++ b/libcxx/include/ext/hash_set
@@ -572,7 +572,7 @@ inline _LIBCPP_HIDE_FROM_ABI bool operator!=(const hash_multiset<_Value, _Hash,
 
 } // namespace __gnu_cxx
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <iterator>
 #    include <type_traits>
diff --git a/libcxx/include/filesystem b/libcxx/include/filesystem
index 4a30583edea3f..876e39385bf01 100644
--- a/libcxx/include/filesystem
+++ b/libcxx/include/filesystem
@@ -568,7 +568,7 @@ inline constexpr bool std::ranges::enable_view<std::filesystem::recursive_direct
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <cstdlib>
 #    include <cstring>
diff --git a/libcxx/include/format b/libcxx/include/format
index 7ff619fa84208..fcfb70d78c2a1 100644
--- a/libcxx/include/format
+++ b/libcxx/include/format
@@ -233,11 +233,11 @@ namespace std {
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <cmath>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <array>
 #    include <cctype>
 #    include <cerrno>
diff --git a/libcxx/include/forward_list b/libcxx/include/forward_list
index 35afb7301f480..6d86f7a8e5975 100644
--- a/libcxx/include/forward_list
+++ b/libcxx/include/forward_list
@@ -1603,7 +1603,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <atomic>
 #    include <concepts>
diff --git a/libcxx/include/fstream b/libcxx/include/fstream
index 7edecbb935a0b..b5fb65820628a 100644
--- a/libcxx/include/fstream
+++ b/libcxx/include/fstream
@@ -1624,7 +1624,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_FILESYSTEM && _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstdlib>
@@ -1636,7 +1636,7 @@ _LIBCPP_POP_MACROS
 #    include <type_traits>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <filesystem>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/functional b/libcxx/include/functional
index 020754a96432c..1278cac2a294a 100644
--- a/libcxx/include/functional
+++ b/libcxx/include/functional
@@ -577,18 +577,18 @@ POLICY:  For non-variadic implementations, the number of arguments is limited
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && defined(_LIBCPP_CXX03_LANG)
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && defined(_LIBCPP_CXX03_LANG)
 #    include <limits>
 #    include <new>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 14
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 14
 #    include <array>
 #    include <initializer_list>
 #    include <unordered_map>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstdlib>
@@ -603,7 +603,7 @@ POLICY:  For non-variadic implementations, the number of arguments is limited
 #    include <vector>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER == 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER == 23
 #    include <__vector/vector.h>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/future b/libcxx/include/future
index 9c71dfb89087d..c169c6c182d83 100644
--- a/libcxx/include/future
+++ b/libcxx/include/future
@@ -2065,11 +2065,11 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_THREADS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 17
 #    include <chrono>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <cstdlib>
 #    include <exception>
diff --git a/libcxx/include/initializer_list b/libcxx/include/initializer_list
index 44cd45668388b..36e45a6db2584 100644
--- a/libcxx/include/initializer_list
+++ b/libcxx/include/initializer_list
@@ -105,7 +105,7 @@ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 const _Ep* end(initia
 
 } // namespace std
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/iomanip b/libcxx/include/iomanip
index bfe9039e4b302..eec62bb4e5dd0 100644
--- a/libcxx/include/iomanip
+++ b/libcxx/include/iomanip
@@ -538,7 +538,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <array>
 #    include <bitset>
 #    include <deque>
@@ -553,7 +553,7 @@ _LIBCPP_END_NAMESPACE_STD
 #    include <vector>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <locale>
 #  endif
 
diff --git a/libcxx/include/ios b/libcxx/include/ios
index d1ec14cba37d1..e65c894a1ed99 100644
--- a/libcxx/include/ios
+++ b/libcxx/include/ios
@@ -886,7 +886,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstddef>
diff --git a/libcxx/include/istream b/libcxx/include/istream
index c4b2de9caf011..640cd9f4e29fb 100644
--- a/libcxx/include/istream
+++ b/libcxx/include/istream
@@ -1413,14 +1413,14 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <iosfwd>
 #    include <ostream>
 #    include <type_traits>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <locale>
 #  endif
 
diff --git a/libcxx/include/iterator b/libcxx/include/iterator
index fc8bdc5e6bcf6..f9996cb2bebf4 100644
--- a/libcxx/include/iterator
+++ b/libcxx/include/iterator
@@ -751,11 +751,11 @@ template <class E> constexpr const E* data(initializer_list<E> il) noexcept;
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 17
 #    include <variant>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <cstdlib>
 #    include <exception>
diff --git a/libcxx/include/latch b/libcxx/include/latch
index 33268d9655f25..77177e5a42923 100644
--- a/libcxx/include/latch
+++ b/libcxx/include/latch
@@ -128,7 +128,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_THREADS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <cstddef>
 #  endif
diff --git a/libcxx/include/limits b/libcxx/include/limits
index c26041006f082..6ba123c52aef7 100644
--- a/libcxx/include/limits
+++ b/libcxx/include/limits
@@ -528,7 +528,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <type_traits>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/list b/libcxx/include/list
index a5c84cad51489..3223f25e1cfba 100644
--- a/libcxx/include/list
+++ b/libcxx/include/list
@@ -1815,7 +1815,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <atomic>
 #    include <concepts>
diff --git a/libcxx/include/locale b/libcxx/include/locale
index b50f9c87c7281..06338102c61b0 100644
--- a/libcxx/include/locale
+++ b/libcxx/include/locale
@@ -210,7 +210,7 @@ template <class charT> class messages_byname;
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstdarg>
diff --git a/libcxx/include/map b/libcxx/include/map
index b7031aeb51c7a..36733ce63558c 100644
--- a/libcxx/include/map
+++ b/libcxx/include/map
@@ -2170,7 +2170,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <cstdlib>
 #    include <functional>
diff --git a/libcxx/include/memory b/libcxx/include/memory
index ca880c83a544d..d5d48ed9a9e6d 100644
--- a/libcxx/include/memory
+++ b/libcxx/include/memory
@@ -987,7 +987,7 @@ template<class Pointer = void, class Smart, class... Args>
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstddef>
diff --git a/libcxx/include/memory_resource b/libcxx/include/memory_resource
index e1382912e3668..2aef1ff9e330d 100644
--- a/libcxx/include/memory_resource
+++ b/libcxx/include/memory_resource
@@ -69,11 +69,11 @@ namespace std::pmr {
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER >= 17 && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER >= 17 && _LIBCPP_STD_VER <= 20
 #    include <mutex>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <stdexcept>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index 5ae83332b6fa6..b1a92aee40c61 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -841,7 +841,11 @@ module std [system] {
       header "__algorithm/stable_sort.h"
       export std.memory.unique_temporary_buffer // TODO: Workaround for https://llvm.org/PR120108
     }
-    module swap_ranges                            { header "__algorithm/swap_ranges.h" }
+    module swap_ranges                            {
+      header "__algorithm/swap_ranges.h"
+      export std.algorithm.iterator_operations
+      export std.algorithm.iter_swap
+    }
     module three_way_comp_ref_type                { header "__algorithm/three_way_comp_ref_type.h" }
     module transform                              { header "__algorithm/transform.h" }
     module uniform_random_bit_generator_adaptor   { header "__algorithm/uniform_random_bit_generator_adaptor.h" }
@@ -1699,6 +1703,7 @@ module std [system] {
     }
     module uninitialized_algorithms {
       header "__memory/uninitialized_algorithms.h"
+      export std.memory.destroy
       export std.utility.pair
     }
     module unique_ptr {
@@ -1837,7 +1842,10 @@ module std [system] {
     module clamp_to_integral                  { header "__random/clamp_to_integral.h" }
     module default_random_engine              { header "__random/default_random_engine.h" }
     module discard_block_engine               { header "__random/discard_block_engine.h" }
-    module discrete_distribution              { header "__random/discrete_distribution.h" }
+    module discrete_distribution              {
+      header "__random/discrete_distribution.h"
+      export std.vector.vector
+    }
     module exponential_distribution           { header "__random/exponential_distribution.h" }
     module extreme_value_distribution         { header "__random/extreme_value_distribution.h" }
     module fisher_f_distribution              { header "__random/fisher_f_distribution.h" }
diff --git a/libcxx/include/mutex b/libcxx/include/mutex
index a3f358afe2acd..ab505f945d63d 100644
--- a/libcxx/include/mutex
+++ b/libcxx/include/mutex
@@ -503,11 +503,11 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <typeinfo>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstdlib>
diff --git a/libcxx/include/new b/libcxx/include/new
index ef66c67ccfbcc..f5960235695eb 100644
--- a/libcxx/include/new
+++ b/libcxx/include/new
@@ -114,7 +114,7 @@ void  operator delete[](void* ptr, void*) noexcept;                     // const
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <cstdlib>
 #    include <type_traits>
diff --git a/libcxx/include/numbers b/libcxx/include/numbers
index 6b174a26971b1..ced6d05658a51 100644
--- a/libcxx/include/numbers
+++ b/libcxx/include/numbers
@@ -159,7 +159,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 #  endif // _LIBCPP_STD_VER >= 20
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <cstddef>
 #    include <type_traits>
diff --git a/libcxx/include/numeric b/libcxx/include/numeric
index 64111b88d3538..7078108773ebd 100644
--- a/libcxx/include/numeric
+++ b/libcxx/include/numeric
@@ -190,12 +190,12 @@ constexpr T saturating_cast(U x) noexcept;                    // freestanding, S
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 14
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 14
 #    include <initializer_list>
 #    include <limits>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <climits>
 #    include <cmath>
 #    include <concepts>
diff --git a/libcxx/include/optional b/libcxx/include/optional
index f7e12f84beba0..d0ddd2c0b8ea2 100644
--- a/libcxx/include/optional
+++ b/libcxx/include/optional
@@ -1754,7 +1754,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <climits>
 #    include <concepts>
diff --git a/libcxx/include/ostream b/libcxx/include/ostream
index 8ec17b68503f8..3fa9a3a5437e1 100644
--- a/libcxx/include/ostream
+++ b/libcxx/include/ostream
@@ -193,7 +193,7 @@ void vprint_nonunicode(ostream& os, string_view fmt, format_args args);
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstdio>
@@ -206,7 +206,7 @@ void vprint_nonunicode(ostream& os, string_view fmt, format_args args);
 #    include <type_traits>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <locale>
 #  endif
 
diff --git a/libcxx/include/queue b/libcxx/include/queue
index a1686bc7c502e..b469240cc94f9 100644
--- a/libcxx/include/queue
+++ b/libcxx/include/queue
@@ -970,7 +970,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <cstdlib>
 #    include <functional>
diff --git a/libcxx/include/random b/libcxx/include/random
index a2fc2bd5197e5..05decfc69c923 100644
--- a/libcxx/include/random
+++ b/libcxx/include/random
@@ -1726,7 +1726,7 @@ class piecewise_linear_distribution
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <climits>
 #    include <cmath>
diff --git a/libcxx/include/ranges b/libcxx/include/ranges
index 308224427db60..848eb3941f766 100644
--- a/libcxx/include/ranges
+++ b/libcxx/include/ranges
@@ -531,7 +531,7 @@ namespace std {
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstdlib>
 #    include <iosfwd>
 #    include <type_traits>
diff --git a/libcxx/include/ratio b/libcxx/include/ratio
index bf54cd099dd41..e558c86678398 100644
--- a/libcxx/include/ratio
+++ b/libcxx/include/ratio
@@ -491,7 +491,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <type_traits>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/regex b/libcxx/include/regex
index 695a0f21754c4..c72ea585702cc 100644
--- a/libcxx/include/regex
+++ b/libcxx/include/regex
@@ -5834,7 +5834,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <concepts>
 #    include <cstdlib>
diff --git a/libcxx/include/scoped_allocator b/libcxx/include/scoped_allocator
index a469d4afea245..13bdc496523b3 100644
--- a/libcxx/include/scoped_allocator
+++ b/libcxx/include/scoped_allocator
@@ -564,7 +564,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <climits>
 #    include <concepts>
diff --git a/libcxx/include/semaphore b/libcxx/include/semaphore
index d411d205cdf2d..ae63cc7ad0960 100644
--- a/libcxx/include/semaphore
+++ b/libcxx/include/semaphore
@@ -180,7 +180,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_THREADS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <atomic>
 #    include <cstddef>
 #  endif
diff --git a/libcxx/include/set b/libcxx/include/set
index 695b6c87e3984..40b2cbfeb6c58 100644
--- a/libcxx/include/set
+++ b/libcxx/include/set
@@ -1541,7 +1541,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <cstdlib>
 #    include <functional>
diff --git a/libcxx/include/shared_mutex b/libcxx/include/shared_mutex
index c1ba1c3b7a77b..80c83bc44a38f 100644
--- a/libcxx/include/shared_mutex
+++ b/libcxx/include/shared_mutex
@@ -441,7 +441,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_THREADS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <optional>
 #    include <system_error>
 #  endif
diff --git a/libcxx/include/span b/libcxx/include/span
index 230ae3fa2b198..db476f1f0a557 100644
--- a/libcxx/include/span
+++ b/libcxx/include/span
@@ -634,7 +634,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <array>
 #    include <concepts>
 #    include <functional>
diff --git a/libcxx/include/sstream b/libcxx/include/sstream
index e40e65dbde2b9..d13ba265b4674 100644
--- a/libcxx/include/sstream
+++ b/libcxx/include/sstream
@@ -1296,7 +1296,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if _LIBCPP_STD_VER <= 20 && !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <ostream>
 #    include <type_traits>
 #  endif
diff --git a/libcxx/include/stack b/libcxx/include/stack
index 537b82210b9d4..313c305dd8088 100644
--- a/libcxx/include/stack
+++ b/libcxx/include/stack
@@ -377,7 +377,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <concepts>
 #    include <functional>
 #    include <type_traits>
diff --git a/libcxx/include/stdexcept b/libcxx/include/stdexcept
index 3c9c03c0ca27c..fa011922f6117 100644
--- a/libcxx/include/stdexcept
+++ b/libcxx/include/stdexcept
@@ -282,7 +282,7 @@ _LIBCPP_END_EXPLICIT_ABI_ANNOTATIONS
 
 _LIBCPP_END_NAMESPACE_STD
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <cstdlib>
 #    include <exception>
diff --git a/libcxx/include/stop_token b/libcxx/include/stop_token
index 0572682a4286e..155b971d5edd9 100644
--- a/libcxx/include/stop_token
+++ b/libcxx/include/stop_token
@@ -52,7 +52,7 @@ namespace std {
 
 #  endif // _LIBCPP_HAS_THREADS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <iosfwd>
 #  endif
diff --git a/libcxx/include/streambuf b/libcxx/include/streambuf
index bffdeacfa0459..e0db304771a1e 100644
--- a/libcxx/include/streambuf
+++ b/libcxx/include/streambuf
@@ -438,7 +438,7 @@ _LIBCPP_POP_MACROS
 
 #  endif // _LIBCPP_HAS_LOCALIZATION
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstdint>
 #    include <optional>
 #  endif
diff --git a/libcxx/include/string b/libcxx/include/string
index 2455938a92d9c..46a483a9d717c 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -3972,7 +3972,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <concepts>
 #    include <cstdlib>
diff --git a/libcxx/include/string_view b/libcxx/include/string_view
index 5dd04a9ba8479..a9dcee914b8e7 100644
--- a/libcxx/include/string_view
+++ b/libcxx/include/string_view
@@ -971,7 +971,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <concepts>
 #    include <cstdlib>
diff --git a/libcxx/include/system_error b/libcxx/include/system_error
index 2b668e5f8f1bc..ef760453d9893 100644
--- a/libcxx/include/system_error
+++ b/libcxx/include/system_error
@@ -164,7 +164,7 @@ template <> struct hash<std::error_condition>;
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstdint>
 #    include <cstring>
 #    include <limits>
diff --git a/libcxx/include/thread b/libcxx/include/thread
index 029ed418e2070..f252273ebadcd 100644
--- a/libcxx/include/thread
+++ b/libcxx/include/thread
@@ -117,11 +117,11 @@ void sleep_for(const chrono::duration<Rep, Period>& rel_time);
 
 #  endif // _LIBCPP_HAS_THREADS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 17
 #    include <chrono>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstring>
 #    include <functional>
 #    include <new>
diff --git a/libcxx/include/tuple b/libcxx/include/tuple
index e02e45f425f4f..a15fbf4475995 100644
--- a/libcxx/include/tuple
+++ b/libcxx/include/tuple
@@ -1463,7 +1463,7 @@ _LIBCPP_POP_MACROS
 
 // clang-format on
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <exception>
 #    include <iosfwd>
diff --git a/libcxx/include/typeindex b/libcxx/include/typeindex
index 82ea3d616f35d..289784b372027 100644
--- a/libcxx/include/typeindex
+++ b/libcxx/include/typeindex
@@ -102,7 +102,7 @@ struct hash<type_index> : public __unary_function<type_index, size_t> {
 
 _LIBCPP_END_NAMESPACE_STD
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <iosfwd>
 #    include <new>
diff --git a/libcxx/include/typeinfo b/libcxx/include/typeinfo
index 7cc675ce59ae5..e69422ef0711f 100644
--- a/libcxx/include/typeinfo
+++ b/libcxx/include/typeinfo
@@ -389,7 +389,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD
 }
 _LIBCPP_END_NAMESPACE_STD
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <cstdlib>
 #    include <type_traits>
diff --git a/libcxx/include/unordered_map b/libcxx/include/unordered_map
index 6afa5c39029f4..8cefba01fb5f6 100644
--- a/libcxx/include/unordered_map
+++ b/libcxx/include/unordered_map
@@ -2381,7 +2381,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <bit>
 #    include <cmath>
diff --git a/libcxx/include/unordered_set b/libcxx/include/unordered_set
index 45a36f34973a5..d54d59403b038 100644
--- a/libcxx/include/unordered_set
+++ b/libcxx/include/unordered_set
@@ -1848,7 +1848,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cmath>
 #    include <concepts>
 #    include <cstdlib>
diff --git a/libcxx/include/utility b/libcxx/include/utility
index 24b3baac91b1d..e0c97efc6424d 100644
--- a/libcxx/include/utility
+++ b/libcxx/include/utility
@@ -332,14 +332,11 @@ template <class T>
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
-#    include <limits>
-#  endif
-
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <cstdlib>
 #    include <iosfwd>
+#    include <limits>
 #    include <type_traits>
 #  endif
 #endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
diff --git a/libcxx/include/valarray b/libcxx/include/valarray
index c77656f2d1000..37ab9864ac452 100644
--- a/libcxx/include/valarray
+++ b/libcxx/include/valarray
@@ -3306,7 +3306,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <concepts>
 #    include <cstdlib>
diff --git a/libcxx/include/variant b/libcxx/include/variant
index 45462ee8a7713..5b3642ff80363 100644
--- a/libcxx/include/variant
+++ b/libcxx/include/variant
@@ -1644,7 +1644,7 @@ _LIBCPP_END_NAMESPACE_STD
 
 _LIBCPP_POP_MACROS
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <cstddef>
 #    include <exception>
 #    include <tuple>
diff --git a/libcxx/include/vector b/libcxx/include/vector
index 7f260a096ca60..f289013a682bc 100644
--- a/libcxx/include/vector
+++ b/libcxx/include/vector
@@ -348,7 +348,7 @@ template<class T, class charT> requires is-vector-bool-reference<T> // Since C++
 #    pragma GCC system_header
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 23
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 23
 #    include <array>
 #    include <cerrno>
 #    include <clocale>
@@ -357,7 +357,7 @@ template<class T, class charT> requires is-vector-bool-reference<T> // Since C++
 #    include <typeinfo>
 #  endif
 
-#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  if defined(_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23) && _LIBCPP_STD_VER <= 20
 #    include <algorithm>
 #    include <atomic>
 #    include <cctype>
diff --git a/libcxx/test/libcxx/transitive_includes.gen.py b/libcxx/test/libcxx/transitive_includes.gen.py
index 8995482778d43..1ff80af1b5e1d 100644
--- a/libcxx/test/libcxx/transitive_includes.gen.py
+++ b/libcxx/test/libcxx/transitive_includes.gen.py
@@ -46,7 +46,7 @@
         normalized_header = re.sub("/", "_", str(header))
         print(
             f"""\
-// RUN: echo "#include <{header}>" | %{{cxx}} -xc++ - %{{flags}} %{{compile_flags}} --trace-includes -fshow-skipped-includes --preprocess > /dev/null 2> %t/trace-includes.{normalized_header}.txt
+// RUN: echo "#include <{header}>" | %{{cxx}} -xc++ - %{{flags}} %{{compile_flags}} -D_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23 --trace-includes -fshow-skipped-includes --preprocess > /dev/null 2> %t/trace-includes.{normalized_header}.txt
 """
         )
         all_traces.append(f"%t/trace-includes.{normalized_header}.txt")
@@ -89,7 +89,7 @@
 // UNSUPPORTED: LIBCXX-FREEBSD-FIXME
 
 // RUN: mkdir %t
-// RUN: %{{cxx}} %s %{{flags}} %{{compile_flags}} -Wno-deprecated --trace-includes -fshow-skipped-includes --preprocess > /dev/null 2> %t/trace-includes.txt
+// RUN: %{{cxx}} %s %{{flags}} %{{compile_flags}} -D_LIBCPP_KEEP_TRANSITIVE_INCLUDES_LLVM23 -Wno-deprecated --trace-includes -fshow-skipped-includes --preprocess > /dev/null 2> %t/trace-includes.txt
 // RUN: %{{python}} %{{libcxx-dir}}/test/libcxx/transitive_includes/to_csv.py %t/trace-includes.txt > %t/actual_transitive_includes.csv
 // RUN: cat %{{libcxx-dir}}/test/libcxx/transitive_includes/%{{cxx_std}}.csv | awk '/^{escaped_header} / {{ print }}' > %t/expected_transitive_includes.csv
 // RUN: diff -w %t/expected_transitive_includes.csv %t/actual_transitive_includes.csv
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/derive_from.pass.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/derive_from.pass.cpp
index a9e037342b076..976adbfc53afb 100644
--- a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/derive_from.pass.cpp
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/derive_from.pass.cpp
@@ -13,6 +13,7 @@
 // See https://llvm.org/PR20002
 
 #include <functional>
+#include <memory>
 #include <type_traits>
 
 #include "test_macros.h"
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/pr40459.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/pr40459.pass.cpp
index ee001f0605506..4128bae2a8656 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/pr40459.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/pr40459.pass.cpp
@@ -39,11 +39,7 @@ struct Deleter {
 };
 
 int main(int, char**) {
-#if TEST_STD_VER >= 11
-  alignas(B) char buffer[sizeof(B)];
-#else
-  std::aligned_storage<sizeof(B), std::alignment_of<B>::value>::type buffer;
-#endif
+  TEST_ALIGNAS(TEST_ALIGNOF(B)) char buffer[sizeof(B)];
   B* pb                 = ::new ((void*)&buffer) B();
   std::shared_ptr<B> sp = std::shared_ptr<B>(pb, Deleter());
   std::weak_ptr<B> wp   = sp;



More information about the libcxx-commits mailing list