[libc++] Granularize the rest of memory

Reviewed By: ldionne, #libc

Spies: vitalybuka, paulkirth, libcxx-commits, mgorny

Differential Revision: https://reviews.llvm.org/D132790
diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index ee2f3b7c..e72b42c 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -379,6 +379,7 @@
   __locale
   __mbstate_t.h
   __memory/addressof.h
+  __memory/align.h
   __memory/allocate_at_least.h
   __memory/allocation_guard.h
   __memory/allocator.h
@@ -386,15 +387,18 @@
   __memory/allocator_traits.h
   __memory/assume_aligned.h
   __memory/auto_ptr.h
+  __memory/builtin_new_allocator.h
   __memory/compressed_pair.h
   __memory/concepts.h
   __memory/construct_at.h
+  __memory/destruct_n.h
   __memory/pointer_traits.h
   __memory/ranges_construct_at.h
   __memory/ranges_uninitialized_algorithms.h
   __memory/raw_storage_iterator.h
   __memory/shared_ptr.h
   __memory/swap_allocator.h
+  __memory/temp_value.h
   __memory/temporary_buffer.h
   __memory/uninitialized_algorithms.h
   __memory/unique_ptr.h
@@ -537,6 +541,7 @@
   __type_traits/integral_constant.h
   __type_traits/is_abstract.h
   __type_traits/is_aggregate.h
+  __type_traits/is_allocator.h
   __type_traits/is_arithmetic.h
   __type_traits/is_array.h
   __type_traits/is_assignable.h
@@ -619,6 +624,7 @@
   __type_traits/maybe_const.h
   __type_traits/nat.h
   __type_traits/negation.h
+  __type_traits/noexcept_move_assign_container.h
   __type_traits/promote.h
   __type_traits/rank.h
   __type_traits/remove_all_extents.h
diff --git a/libcxx/include/__algorithm/inplace_merge.h b/libcxx/include/__algorithm/inplace_merge.h
index 01a871a..dc5108a 100644
--- a/libcxx/include/__algorithm/inplace_merge.h
+++ b/libcxx/include/__algorithm/inplace_merge.h
@@ -23,7 +23,11 @@
 #include <__iterator/distance.h>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/reverse_iterator.h>
-#include <memory>
+#include <__memory/destruct_n.h>
+#include <__memory/temporary_buffer.h>
+#include <__memory/unique_ptr.h>
+#include <__utility/pair.h>
+#include <new>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_copy.h b/libcxx/include/__algorithm/ranges_copy.h
index 0d85310..87a6a1e 100644
--- a/libcxx/include/__algorithm/ranges_copy.h
+++ b/libcxx/include/__algorithm/ranges_copy.h
@@ -18,6 +18,7 @@
 #include <__ranges/concepts.h>
 #include <__ranges/dangling.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_equal_range.h b/libcxx/include/__algorithm/ranges_equal_range.h
index beeba18..efe5b2f 100644
--- a/libcxx/include/__algorithm/ranges_equal_range.h
+++ b/libcxx/include/__algorithm/ranges_equal_range.h
@@ -24,6 +24,7 @@
 #include <__ranges/subrange.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_find_end.h b/libcxx/include/__algorithm/ranges_find_end.h
index d9be148..df89100 100644
--- a/libcxx/include/__algorithm/ranges_find_end.h
+++ b/libcxx/include/__algorithm/ranges_find_end.h
@@ -21,6 +21,7 @@
 #include <__ranges/access.h>
 #include <__ranges/concepts.h>
 #include <__ranges/subrange.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_minmax.h b/libcxx/include/__algorithm/ranges_minmax.h
index 11471be..377fe9b 100644
--- a/libcxx/include/__algorithm/ranges_minmax.h
+++ b/libcxx/include/__algorithm/ranges_minmax.h
@@ -23,6 +23,7 @@
 #include <__ranges/concepts.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 #include <initializer_list>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__algorithm/ranges_next_permutation.h b/libcxx/include/__algorithm/ranges_next_permutation.h
index 5c9e75a..6c8e8e1 100644
--- a/libcxx/include/__algorithm/ranges_next_permutation.h
+++ b/libcxx/include/__algorithm/ranges_next_permutation.h
@@ -22,6 +22,7 @@
 #include <__ranges/concepts.h>
 #include <__ranges/dangling.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_partial_sort.h b/libcxx/include/__algorithm/ranges_partial_sort.h
index b427e6b..3ea0a7f 100644
--- a/libcxx/include/__algorithm/ranges_partial_sort.h
+++ b/libcxx/include/__algorithm/ranges_partial_sort.h
@@ -27,6 +27,7 @@
 #include <__ranges/dangling.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_partial_sort_copy.h b/libcxx/include/__algorithm/ranges_partial_sort_copy.h
index 9ad8980..212db55 100644
--- a/libcxx/include/__algorithm/ranges_partial_sort_copy.h
+++ b/libcxx/include/__algorithm/ranges_partial_sort_copy.h
@@ -24,6 +24,7 @@
 #include <__ranges/concepts.h>
 #include <__ranges/dangling.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_partition.h b/libcxx/include/__algorithm/ranges_partition.h
index 0d55210..eaa696d 100644
--- a/libcxx/include/__algorithm/ranges_partition.h
+++ b/libcxx/include/__algorithm/ranges_partition.h
@@ -26,6 +26,7 @@
 #include <__ranges/subrange.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__algorithm/ranges_prev_permutation.h b/libcxx/include/__algorithm/ranges_prev_permutation.h
index 133bc6a..6866d90 100644
--- a/libcxx/include/__algorithm/ranges_prev_permutation.h
+++ b/libcxx/include/__algorithm/ranges_prev_permutation.h
@@ -22,6 +22,7 @@
 #include <__ranges/concepts.h>
 #include <__ranges/dangling.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_search.h b/libcxx/include/__algorithm/ranges_search.h
index 4ac43fa..24bbe28 100644
--- a/libcxx/include/__algorithm/ranges_search.h
+++ b/libcxx/include/__algorithm/ranges_search.h
@@ -22,6 +22,7 @@
 #include <__ranges/concepts.h>
 #include <__ranges/size.h>
 #include <__ranges/subrange.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_search_n.h b/libcxx/include/__algorithm/ranges_search_n.h
index ce06729..d2846f6 100644
--- a/libcxx/include/__algorithm/ranges_search_n.h
+++ b/libcxx/include/__algorithm/ranges_search_n.h
@@ -25,6 +25,7 @@
 #include <__ranges/size.h>
 #include <__ranges/subrange.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_set_difference.h b/libcxx/include/__algorithm/ranges_set_difference.h
index 8b97202..398ccc9 100644
--- a/libcxx/include/__algorithm/ranges_set_difference.h
+++ b/libcxx/include/__algorithm/ranges_set_difference.h
@@ -23,6 +23,7 @@
 #include <__ranges/dangling.h>
 #include <__type_traits/decay.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_unique.h b/libcxx/include/__algorithm/ranges_unique.h
index 9637346..45e5427 100644
--- a/libcxx/include/__algorithm/ranges_unique.h
+++ b/libcxx/include/__algorithm/ranges_unique.h
@@ -26,6 +26,7 @@
 #include <__ranges/subrange.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/ranges_unique_copy.h b/libcxx/include/__algorithm/ranges_unique_copy.h
index f7b2293..3ad47b06 100644
--- a/libcxx/include/__algorithm/ranges_unique_copy.h
+++ b/libcxx/include/__algorithm/ranges_unique_copy.h
@@ -27,6 +27,7 @@
 #include <__ranges/dangling.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/set_symmetric_difference.h b/libcxx/include/__algorithm/set_symmetric_difference.h
index 31e2e87..3dd093c 100644
--- a/libcxx/include/__algorithm/set_symmetric_difference.h
+++ b/libcxx/include/__algorithm/set_symmetric_difference.h
@@ -15,6 +15,7 @@
 #include <__config>
 #include <__iterator/iterator_traits.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/set_union.h b/libcxx/include/__algorithm/set_union.h
index 76cd30b..ce15623 100644
--- a/libcxx/include/__algorithm/set_union.h
+++ b/libcxx/include/__algorithm/set_union.h
@@ -15,6 +15,7 @@
 #include <__config>
 #include <__iterator/iterator_traits.h>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/sort.h b/libcxx/include/__algorithm/sort.h
index a7d9002..4ff3379 100644
--- a/libcxx/include/__algorithm/sort.h
+++ b/libcxx/include/__algorithm/sort.h
@@ -22,8 +22,9 @@
 #include <__functional/operations.h>
 #include <__functional/ranges_operations.h>
 #include <__iterator/iterator_traits.h>
+#include <__memory/destruct_n.h>
+#include <__memory/unique_ptr.h>
 #include <climits>
-#include <memory>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__algorithm/stable_partition.h b/libcxx/include/__algorithm/stable_partition.h
index a5c7e86..b85acc7 100644
--- a/libcxx/include/__algorithm/stable_partition.h
+++ b/libcxx/include/__algorithm/stable_partition.h
@@ -15,7 +15,11 @@
 #include <__iterator/advance.h>
 #include <__iterator/distance.h>
 #include <__iterator/iterator_traits.h>
-#include <memory>
+#include <__memory/destruct_n.h>
+#include <__memory/temporary_buffer.h>
+#include <__memory/unique_ptr.h>
+#include <__utility/pair.h>
+#include <new>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__algorithm/stable_sort.h b/libcxx/include/__algorithm/stable_sort.h
index dfd428f..1b8aafb 100644
--- a/libcxx/include/__algorithm/stable_sort.h
+++ b/libcxx/include/__algorithm/stable_sort.h
@@ -16,8 +16,12 @@
 #include <__algorithm/sort.h>
 #include <__config>
 #include <__iterator/iterator_traits.h>
+#include <__memory/destruct_n.h>
+#include <__memory/temporary_buffer.h>
+#include <__memory/unique_ptr.h>
 #include <__utility/move.h>
-#include <memory>
+#include <__utility/pair.h>
+#include <new>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__bsd_locale_fallbacks.h b/libcxx/include/__bsd_locale_fallbacks.h
index 3d5b785..9abd7e7 100644
--- a/libcxx/include/__bsd_locale_fallbacks.h
+++ b/libcxx/include/__bsd_locale_fallbacks.h
@@ -13,7 +13,6 @@
 #ifndef _LIBCPP___BSD_LOCALE_FALLBACKS_H
 #define _LIBCPP___BSD_LOCALE_FALLBACKS_H
 
-#include <memory>
 #include <stdarg.h>
 #include <stdlib.h>
 
diff --git a/libcxx/include/__filesystem/filesystem_error.h b/libcxx/include/__filesystem/filesystem_error.h
index e32b14c..eb5c38a 100644
--- a/libcxx/include/__filesystem/filesystem_error.h
+++ b/libcxx/include/__filesystem/filesystem_error.h
@@ -14,6 +14,7 @@
 #include <__config>
 #include <__filesystem/path.h>
 #include <__memory/shared_ptr.h>
+#include <__utility/forward.h>
 #include <iosfwd>
 #include <new>
 #include <system_error>
diff --git a/libcxx/include/__format/format_arg_store.h b/libcxx/include/__format/format_arg_store.h
index 26a5e71..1820c03 100644
--- a/libcxx/include/__format/format_arg_store.h
+++ b/libcxx/include/__format/format_arg_store.h
@@ -19,6 +19,7 @@
 #include <__config>
 #include <__format/concepts.h>
 #include <__format/format_arg.h>
+#include <__utility/forward.h>
 #include <cstring>
 #include <string>
 #include <string_view>
diff --git a/libcxx/include/__format/formatter_integral.h b/libcxx/include/__format/formatter_integral.h
index d23b398..87c6d55 100644
--- a/libcxx/include/__format/formatter_integral.h
+++ b/libcxx/include/__format/formatter_integral.h
@@ -18,6 +18,7 @@
 #include <__format/formatter_output.h>
 #include <__format/parser_std_format_spec.h>
 #include <__utility/unreachable.h>
+#include <array>
 #include <charconv>
 #include <limits>
 #include <string>
diff --git a/libcxx/include/__functional/function.h b/libcxx/include/__functional/function.h
index bcecd3e..8a4a2cf 100644
--- a/libcxx/include/__functional/function.h
+++ b/libcxx/include/__functional/function.h
@@ -17,15 +17,21 @@
 #include <__functional/unary_function.h>
 #include <__iterator/iterator_traits.h>
 #include <__memory/addressof.h>
+#include <__memory/allocator.h>
 #include <__memory/allocator_traits.h>
+#include <__memory/builtin_new_allocator.h>
 #include <__memory/compressed_pair.h>
 #include <__memory/shared_ptr.h>
+#include <__memory/unique_ptr.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <__utility/piecewise_construct.h>
 #include <__utility/swap.h>
 #include <exception>
-#include <memory> // TODO: replace with <__memory/__builtin_new_allocator.h>
+#include <new>
+#include <tuple>
 #include <type_traits>
+#include <typeinfo>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__hash_table b/libcxx/include/__hash_table
index 51a8bf8..5a72ccf 100644
--- a/libcxx/include/__hash_table
+++ b/libcxx/include/__hash_table
@@ -18,12 +18,20 @@
 #include <__debug>
 #include <__functional/hash.h>
 #include <__iterator/iterator_traits.h>
+#include <__memory/addressof.h>
+#include <__memory/allocator_traits.h>
+#include <__memory/compressed_pair.h>
+#include <__memory/pointer_traits.h>
 #include <__memory/swap_allocator.h>
+#include <__memory/unique_ptr.h>
 #include <__type_traits/can_extract_key.h>
+#include <__utility/forward.h>
+#include <__utility/move.h>
+#include <__utility/pair.h>
 #include <__utility/swap.h>
 #include <cmath>
+#include <cstring>
 #include <initializer_list>
-#include <memory>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__locale b/libcxx/include/__locale
index 0bf8344..65160f3 100644
--- a/libcxx/include/__locale
+++ b/libcxx/include/__locale
@@ -12,10 +12,10 @@
 
 #include <__availability>
 #include <__config>
+#include <__memory/shared_ptr.h>
 #include <cctype>
 #include <cstdint>
 #include <locale.h>
-#include <memory>
 #include <mutex>
 #include <string>
 
diff --git a/libcxx/include/__memory/align.h b/libcxx/include/__memory/align.h
new file mode 100644
index 0000000..c679220
--- /dev/null
+++ b/libcxx/include/__memory/align.h
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_ALIGN_H
+#define _LIBCPP___MEMORY_ALIGN_H
+
+#include <__config>
+#include <cstddef>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___MEMORY_ALIGN_H
diff --git a/libcxx/include/__memory/builtin_new_allocator.h b/libcxx/include/__memory/builtin_new_allocator.h
new file mode 100644
index 0000000..cd1a866
--- /dev/null
+++ b/libcxx/include/__memory/builtin_new_allocator.h
@@ -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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H
+#define _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H
+
+#include <__config>
+#include <__memory/unique_ptr.h>
+#include <cstddef>
+#include <new>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+// __builtin_new_allocator -- A non-templated helper for allocating and
+// deallocating memory using __builtin_operator_new and
+// __builtin_operator_delete. It should be used in preference to
+// `std::allocator<T>` to avoid additional instantiations.
+struct __builtin_new_allocator {
+  struct __builtin_new_deleter {
+    typedef void* pointer_type;
+
+    _LIBCPP_CONSTEXPR explicit __builtin_new_deleter(size_t __size, size_t __align)
+        : __size_(__size), __align_(__align) {}
+
+    void operator()(void* __p) const _NOEXCEPT {
+        _VSTD::__libcpp_deallocate(__p, __size_, __align_);
+    }
+
+   private:
+    size_t __size_;
+    size_t __align_;
+  };
+
+  typedef unique_ptr<void, __builtin_new_deleter> __holder_t;
+
+  static __holder_t __allocate_bytes(size_t __s, size_t __align) {
+      return __holder_t(_VSTD::__libcpp_allocate(__s, __align),
+                     __builtin_new_deleter(__s, __align));
+  }
+
+  static void __deallocate_bytes(void* __p, size_t __s,
+                                 size_t __align) _NOEXCEPT {
+      _VSTD::__libcpp_deallocate(__p, __s, __align);
+  }
+
+  template <class _Tp>
+  _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
+  static __holder_t __allocate_type(size_t __n) {
+      return __allocate_bytes(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
+  }
+
+  template <class _Tp>
+  _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
+  static void __deallocate_type(void* __p, size_t __n) _NOEXCEPT {
+      __deallocate_bytes(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
+  }
+};
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___MEMORY_BUILTIN_NEW_ALLOCATOR_H
diff --git a/libcxx/include/__memory/construct_at.h b/libcxx/include/__memory/construct_at.h
index 7093883..a11a6eb 100644
--- a/libcxx/include/__memory/construct_at.h
+++ b/libcxx/include/__memory/construct_at.h
@@ -17,6 +17,7 @@
 #include <__memory/voidify.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <new>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__memory/destruct_n.h b/libcxx/include/__memory/destruct_n.h
new file mode 100644
index 0000000..2cfb2e4
--- /dev/null
+++ b/libcxx/include/__memory/destruct_n.h
@@ -0,0 +1,64 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_DESTRUCT_N_H
+#define _LIBCPP___MEMORY_DESTRUCT_N_H
+
+#include <__config>
+#include <__type_traits/integral_constant.h>
+#include <__type_traits/is_trivially_destructible.h>
+#include <cstddef>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+struct __destruct_n
+{
+private:
+    size_t __size_;
+
+    template <class _Tp>
+    _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT
+        {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();}
+
+    template <class _Tp>
+    _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT
+        {}
+
+    _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT
+        {++__size_;}
+    _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT
+        {}
+
+    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT
+        {__size_ = __s;}
+    _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT
+        {}
+public:
+    _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT
+        : __size_(__s) {}
+
+    template <class _Tp>
+    _LIBCPP_INLINE_VISIBILITY void __incr() _NOEXCEPT
+        {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
+
+    template <class _Tp>
+    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT
+        {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
+
+    template <class _Tp>
+    _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT
+        {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
+};
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___MEMORY_DESTRUCT_N_H
diff --git a/libcxx/include/__memory/ranges_construct_at.h b/libcxx/include/__memory/ranges_construct_at.h
index 3fee8a4..19cd0ff 100644
--- a/libcxx/include/__memory/ranges_construct_at.h
+++ b/libcxx/include/__memory/ranges_construct_at.h
@@ -22,6 +22,7 @@
 #include <__utility/declval.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
+#include <new>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__memory/ranges_uninitialized_algorithms.h b/libcxx/include/__memory/ranges_uninitialized_algorithms.h
index 57662a8..7d2ac3a 100644
--- a/libcxx/include/__memory/ranges_uninitialized_algorithms.h
+++ b/libcxx/include/__memory/ranges_uninitialized_algorithms.h
@@ -24,6 +24,7 @@
 #include <__ranges/concepts.h>
 #include <__ranges/dangling.h>
 #include <__utility/move.h>
+#include <new>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__memory/raw_storage_iterator.h b/libcxx/include/__memory/raw_storage_iterator.h
index 9b6594b..11971de 100644
--- a/libcxx/include/__memory/raw_storage_iterator.h
+++ b/libcxx/include/__memory/raw_storage_iterator.h
@@ -16,6 +16,7 @@
 #include <__memory/addressof.h>
 #include <__utility/move.h>
 #include <cstddef>
+#include <new>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/__memory/shared_ptr.h b/libcxx/include/__memory/shared_ptr.h
index 53113c0..b350bcd 100644
--- a/libcxx/include/__memory/shared_ptr.h
+++ b/libcxx/include/__memory/shared_ptr.h
@@ -34,6 +34,7 @@
 #include <cstddef>
 #include <cstdlib> // abort
 #include <iosfwd>
+#include <new>
 #include <stdexcept>
 #include <type_traits>
 #include <typeinfo>
diff --git a/libcxx/include/__memory/temp_value.h b/libcxx/include/__memory/temp_value.h
new file mode 100644
index 0000000..164688b
--- /dev/null
+++ b/libcxx/include/__memory/temp_value.h
@@ -0,0 +1,56 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_TEMP_VALUE_H
+#define _LIBCPP___MEMORY_TEMP_VALUE_H
+
+#include <__config>
+#include <__memory/addressof.h>
+#include <__memory/allocator_traits.h>
+#include <__type_traits/aligned_storage.h>
+#include <__utility/forward.h>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+template <class _Tp, class _Alloc>
+struct __temp_value {
+    typedef allocator_traits<_Alloc> _Traits;
+
+#ifdef _LIBCPP_CXX03_LANG
+    typename aligned_storage<sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)>::type __v;
+#else
+    union { _Tp __v; };
+#endif
+    _Alloc &__a;
+
+    _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp *__addr() {
+#ifdef _LIBCPP_CXX03_LANG
+        return reinterpret_cast<_Tp*>(std::addressof(__v));
+#else
+        return std::addressof(__v);
+#endif
+    }
+
+    _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp &   get() { return *__addr(); }
+
+    template<class... _Args>
+    _LIBCPP_NO_CFI
+    _LIBCPP_CONSTEXPR_SINCE_CXX20 __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) {
+      _Traits::construct(__a, __addr(), std::forward<_Args>(__args)...);
+    }
+
+    _LIBCPP_CONSTEXPR_SINCE_CXX20 ~__temp_value() { _Traits::destroy(__a, __addr()); }
+};
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___MEMORY_TEMP_VALUE_H
diff --git a/libcxx/include/__memory/uninitialized_algorithms.h b/libcxx/include/__memory/uninitialized_algorithms.h
index dc58fb3..6a7b708 100644
--- a/libcxx/include/__memory/uninitialized_algorithms.h
+++ b/libcxx/include/__memory/uninitialized_algorithms.h
@@ -24,6 +24,7 @@
 #include <__utility/move.h>
 #include <__utility/pair.h>
 #include <__utility/transaction.h>
+#include <new>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__node_handle b/libcxx/include/__node_handle
index 71309be6..8cb6d62 100644
--- a/libcxx/include/__node_handle
+++ b/libcxx/include/__node_handle
@@ -60,7 +60,8 @@
 
 #include <__assert>
 #include <__config>
-#include <memory>
+#include <__memory/allocator_traits.h>
+#include <__memory/pointer_traits.h>
 #include <optional>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__split_buffer b/libcxx/include/__split_buffer
index d58baa1..2ffa008 100644
--- a/libcxx/include/__split_buffer
+++ b/libcxx/include/__split_buffer
@@ -17,11 +17,15 @@
 #include <__iterator/distance.h>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/move_iterator.h>
+#include <__memory/allocate_at_least.h>
 #include <__memory/allocator.h>
+#include <__memory/allocator_traits.h>
 #include <__memory/compressed_pair.h>
+#include <__memory/pointer_traits.h>
+#include <__memory/shared_ptr.h>
 #include <__memory/swap_allocator.h>
 #include <__utility/forward.h>
-#include <memory>
+#include <__utility/move.h>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__tree b/libcxx/include/__tree
index 867a856..b4e9569 100644
--- a/libcxx/include/__tree
+++ b/libcxx/include/__tree
@@ -17,12 +17,17 @@
 #include <__iterator/distance.h>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/next.h>
+#include <__memory/allocator_traits.h>
+#include <__memory/compressed_pair.h>
+#include <__memory/pointer_traits.h>
 #include <__memory/swap_allocator.h>
+#include <__memory/unique_ptr.h>
 #include <__type_traits/can_extract_key.h>
 #include <__utility/forward.h>
+#include <__utility/move.h>
+#include <__utility/pair.h>
 #include <__utility/swap.h>
 #include <limits>
-#include <memory>
 #include <stdexcept>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/__type_traits/is_allocator.h b/libcxx/include/__type_traits/is_allocator.h
new file mode 100644
index 0000000..f4d70e9
--- /dev/null
+++ b/libcxx/include/__type_traits/is_allocator.h
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// 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___TYPE_IS_ALLOCATOR_H
+#define _LIBCPP___TYPE_IS_ALLOCATOR_H
+
+#include <__config>
+#include <__type_traits/integral_constant.h>
+#include <__type_traits/void_t.h>
+#include <__utility/declval.h>
+#include <cstddef>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+template<typename _Alloc, typename = void, typename = void>
+struct __is_allocator : false_type {};
+
+template<typename _Alloc>
+struct __is_allocator<_Alloc,
+       typename __void_t<typename _Alloc::value_type>::type,
+       typename __void_t<decltype(declval<_Alloc&>().allocate(size_t(0)))>::type
+     >
+   : true_type {};
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___TYPE_IS_ALLOCATOR_H
diff --git a/libcxx/include/__type_traits/noexcept_move_assign_container.h b/libcxx/include/__type_traits/noexcept_move_assign_container.h
new file mode 100644
index 0000000..f8edd76
--- /dev/null
+++ b/libcxx/include/__type_traits/noexcept_move_assign_container.h
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// 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___TYPE_TRAITS_NOEXCEPT_MOVE_ASSIGN_CONTAINER_H
+#define _LIBCPP___TYPE_TRAITS_NOEXCEPT_MOVE_ASSIGN_CONTAINER_H
+
+#include <__config>
+#include <__memory/allocator_traits.h>
+#include <__type_traits/integral_constant.h>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+template <typename _Alloc, typename _Traits=allocator_traits<_Alloc> >
+struct __noexcept_move_assign_container : public integral_constant<bool,
+    _Traits::propagate_on_container_move_assignment::value
+#if _LIBCPP_STD_VER > 14
+        || _Traits::is_always_equal::value
+#else
+        && is_nothrow_move_assignable<_Alloc>::value
+#endif
+    > {};
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___TYPE_TRAITS_NOEXCEPT_MOVE_ASSIGN_CONTAINER_H
diff --git a/libcxx/include/__utility/forward_like.h b/libcxx/include/__utility/forward_like.h
index 7809769..1446964 100644
--- a/libcxx/include/__utility/forward_like.h
+++ b/libcxx/include/__utility/forward_like.h
@@ -34,7 +34,7 @@
 using _ForwardLike = _OverrideRef<_Ap&&, _CopyConst<remove_reference_t<_Ap>, remove_reference_t<_Bp>>>;
 
 template <class _Tp, class _Up>
-[[nodiscard]] constexpr auto forward_like(_Up&& __ux) noexcept -> _ForwardLike<_Tp, _Up> {
+[[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto forward_like(_Up&& __ux) noexcept -> _ForwardLike<_Tp, _Up> {
   return static_cast<_ForwardLike<_Tp, _Up>>(__ux);
 }
 
diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm
index f036fd0..06d0a40 100644
--- a/libcxx/include/algorithm
+++ b/libcxx/include/algorithm
@@ -1709,7 +1709,6 @@
 #include <__debug>
 #include <cstddef>
 #include <cstring>
-#include <memory>
 #include <type_traits>
 #include <version>
 
@@ -1907,7 +1906,7 @@
 #endif
 
 #if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
-#   include <__pstl_algorithm>
+#  include <__pstl_algorithm>
 #endif
 
 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
@@ -1915,7 +1914,10 @@
 #endif
 
 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <atomic>
 #  include <iterator>
+#  include <memory>
+#  include <stdexcept>
 #  include <utility>
 #endif
 
diff --git a/libcxx/include/any b/libcxx/include/any
index ec12cfa..527af76 100644
--- a/libcxx/include/any
+++ b/libcxx/include/any
@@ -83,13 +83,16 @@
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__availability>
 #include <__config>
+#include <__memory/allocator.h>
+#include <__memory/allocator_traits.h>
+#include <__memory/shared_ptr.h>
+#include <__memory/unique_ptr.h>
 #include <__utility/forward.h>
 #include <__utility/in_place.h>
 #include <__utility/move.h>
 #include <__utility/unreachable.h>
 #include <cstdlib>
 #include <initializer_list>
-#include <memory>
 #include <type_traits>
 #include <typeinfo>
 #include <version>
@@ -695,4 +698,10 @@
 #  include <chrono> // IGNORE-CYCLE due to <format>
 #endif
 
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <iterator>
+#  include <memory>
+#  include <variant>
+#endif
+
 #endif // _LIBCPP_ANY
diff --git a/libcxx/include/barrier b/libcxx/include/barrier
index d5104b5..836a003 100644
--- a/libcxx/include/barrier
+++ b/libcxx/include/barrier
@@ -48,10 +48,19 @@
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__availability>
 #include <__config>
+#include <__memory/unique_ptr.h>
 #include <__thread/timed_backoff_policy.h>
+#include <__utility/move.h>
 #include <atomic>
 #include <limits>
-#include <memory>
+
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <concepts>
+#  include <iterator>
+#  include <memory>
+#  include <stdexcept>
+#  include <variant>
+#endif
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/libcxx/include/condition_variable b/libcxx/include/condition_variable
index 92088f3..038f0ba 100644
--- a/libcxx/include/condition_variable
+++ b/libcxx/include/condition_variable
@@ -108,8 +108,9 @@
 
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__config>
+#include <__memory/shared_ptr.h>
+#include <__memory/unique_ptr.h>
 #include <__mutex_base>
-#include <memory>
 #include <version>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
diff --git a/libcxx/include/deque b/libcxx/include/deque
index 9a26f16..bce6bc2 100644
--- a/libcxx/include/deque
+++ b/libcxx/include/deque
@@ -176,7 +176,11 @@
 #include <__iterator/next.h>
 #include <__iterator/prev.h>
 #include <__iterator/reverse_iterator.h>
+#include <__memory/pointer_traits.h>
+#include <__memory/temp_value.h>
+#include <__memory/unique_ptr.h>
 #include <__split_buffer>
+#include <__type_traits/is_allocator.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
 #include <__utility/swap.h>
diff --git a/libcxx/include/experimental/coroutine b/libcxx/include/experimental/coroutine
index e32aedc..55062d4 100644
--- a/libcxx/include/experimental/coroutine
+++ b/libcxx/include/experimental/coroutine
@@ -50,10 +50,28 @@
 #include <__functional/operations.h>
 #include <cstddef>
 #include <experimental/__config>
-#include <memory> // for hash<T*>
 #include <new>
 #include <type_traits>
 
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <atomic>
+#  include <climits>
+#  include <cmath>
+#  include <compare>
+#  include <concepts>
+#  include <ctime>
+#  include <initializer_list>
+#  include <iosfwd>
+#  include <iterator>
+#  include <memory>
+#  include <ratio>
+#  include <stdexcept>
+#  include <tuple>
+#  include <typeinfo>
+#  include <utility>
+#  include <variant>
+#endif
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
 #endif
diff --git a/libcxx/include/experimental/memory_resource b/libcxx/include/experimental/memory_resource
index 510e282..f6f01dc 100644
--- a/libcxx/include/experimental/memory_resource
+++ b/libcxx/include/experimental/memory_resource
@@ -65,6 +65,7 @@
  */
 
 #include <__assert> // all public C++ headers provide the assertion handler
+#include <__memory/allocator_traits.h>
 #include <__tuple>
 #include <__utility/move.h>
 #include <cstddef>
@@ -72,11 +73,23 @@
 #include <experimental/__config>
 #include <experimental/__memory>
 #include <limits>
-#include <memory>
 #include <new>
 #include <stdexcept>
+#include <tuple>
 #include <type_traits>
 
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <atomic>
+#  include <climits>
+#  include <concepts>
+#  include <cstring>
+#  include <ctime>
+#  include <iterator>
+#  include <memory>
+#  include <ratio>
+#  include <variant>
+#endif
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
 #endif
diff --git a/libcxx/include/forward_list b/libcxx/include/forward_list
index d5ea3ec..4087992 100644
--- a/libcxx/include/forward_list
+++ b/libcxx/include/forward_list
@@ -188,10 +188,18 @@
 #include <__iterator/iterator_traits.h>
 #include <__iterator/move_iterator.h>
 #include <__iterator/next.h>
+#include <__memory/addressof.h>
+#include <__memory/allocator.h>
+#include <__memory/allocator_traits.h>
+#include <__memory/compressed_pair.h>
+#include <__memory/pointer_traits.h>
+#include <__memory/shared_ptr.h>
 #include <__memory/swap_allocator.h>
+#include <__memory/unique_ptr.h>
+#include <__type_traits/is_allocator.h>
 #include <__utility/forward.h>
+#include <__utility/move.h>
 #include <limits>
-#include <memory>
 #include <type_traits>
 #include <version>
 
diff --git a/libcxx/include/fstream b/libcxx/include/fstream
index a6bd4a8..95f345f 100644
--- a/libcxx/include/fstream
+++ b/libcxx/include/fstream
@@ -192,6 +192,7 @@
 #include <cstring>
 #include <istream>
 #include <ostream>
+#include <typeinfo>
 #include <version>
 
 #if !defined(_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY)
diff --git a/libcxx/include/functional b/libcxx/include/functional
index 60f6514..ab2c62d 100644
--- a/libcxx/include/functional
+++ b/libcxx/include/functional
@@ -533,7 +533,7 @@
 #include <__utility/forward.h>
 #include <concepts>
 #include <exception>
-#include <memory>
+#include <memory> // TODO: find out why removing this breaks the modules build
 #include <tuple>
 #include <type_traits>
 #include <typeinfo>
diff --git a/libcxx/include/future b/libcxx/include/future
index 716daa7..1bc9a95 100644
--- a/libcxx/include/future
+++ b/libcxx/include/future
@@ -372,8 +372,8 @@
 #include <__utility/forward.h>
 #include <__utility/move.h>
 #include <exception>
-#include <memory>
 #include <mutex>
+#include <new>
 #include <system_error>
 #include <thread>
 #include <version>
diff --git a/libcxx/include/list b/libcxx/include/list
index a4e6def..e5a6c3f 100644
--- a/libcxx/include/list
+++ b/libcxx/include/list
@@ -194,12 +194,20 @@
 #include <__iterator/next.h>
 #include <__iterator/prev.h>
 #include <__iterator/reverse_iterator.h>
+#include <__memory/addressof.h>
+#include <__memory/allocator.h>
+#include <__memory/allocator_traits.h>
+#include <__memory/compressed_pair.h>
+#include <__memory/pointer_traits.h>
+#include <__memory/shared_ptr.h>
 #include <__memory/swap_allocator.h>
+#include <__memory/unique_ptr.h>
+#include <__type_traits/is_allocator.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
 #include <__utility/swap.h>
+#include <cstring>
 #include <limits>
-#include <memory>
 #include <type_traits>
 #include <version>
 
diff --git a/libcxx/include/locale b/libcxx/include/locale
index 3fe8f5d..fec6c2f 100644
--- a/libcxx/include/locale
+++ b/libcxx/include/locale
@@ -201,13 +201,14 @@
 #include <__iterator/istreambuf_iterator.h>
 #include <__iterator/ostreambuf_iterator.h>
 #include <__locale>
+#include <__memory/unique_ptr.h>
 #include <cstdarg> // TODO: Remove this include
 #include <cstdio>
 #include <cstdlib>
 #include <ctime>
 #include <ios>
 #include <limits>
-#include <memory>
+#include <new>
 #include <streambuf>
 #include <version>
 
diff --git a/libcxx/include/map b/libcxx/include/map
index 20e6126..6df74c3 100644
--- a/libcxx/include/map
+++ b/libcxx/include/map
@@ -538,11 +538,14 @@
 #include <__iterator/erase_if_container.h>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/reverse_iterator.h>
+#include <__memory/allocator.h>
 #include <__node_handle>
 #include <__tree>
+#include <__type_traits/is_allocator.h>
 #include <__utility/forward.h>
+#include <__utility/piecewise_construct.h>
 #include <__utility/swap.h>
-#include <memory>
+#include <tuple>
 #include <type_traits>
 #include <version>
 
diff --git a/libcxx/include/memory b/libcxx/include/memory
index 9776de6..4d29b71 100644
--- a/libcxx/include/memory
+++ b/libcxx/include/memory
@@ -860,11 +860,10 @@
 
 */
 
-#include <__algorithm/copy.h>
-#include <__algorithm/move.h>
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__config>
 #include <__memory/addressof.h>
+#include <__memory/align.h>
 #include <__memory/allocate_at_least.h>
 #include <__memory/allocation_guard.h>
 #include <__memory/allocator.h>
@@ -884,15 +883,6 @@
 #include <__memory/uninitialized_algorithms.h>
 #include <__memory/unique_ptr.h>
 #include <__memory/uses_allocator.h>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <iosfwd>
-#include <new>
-#include <stdexcept>
-#include <tuple>
-#include <type_traits>
-#include <typeinfo>
 #include <version>
 
 // standard-mandated includes
@@ -902,153 +892,21 @@
 #  pragma GCC system_header
 #endif
 
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-struct __destruct_n
-{
-private:
-    size_t __size_;
-
-    template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void __process(_Tp* __p, false_type) _NOEXCEPT
-        {for (size_t __i = 0; __i < __size_; ++__i, ++__p) __p->~_Tp();}
-
-    template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void __process(_Tp*, true_type) _NOEXCEPT
-        {}
-
-    _LIBCPP_INLINE_VISIBILITY void __incr(false_type) _NOEXCEPT
-        {++__size_;}
-    _LIBCPP_INLINE_VISIBILITY void __incr(true_type) _NOEXCEPT
-        {}
-
-    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, false_type) _NOEXCEPT
-        {__size_ = __s;}
-    _LIBCPP_INLINE_VISIBILITY void __set(size_t, true_type) _NOEXCEPT
-        {}
-public:
-    _LIBCPP_INLINE_VISIBILITY explicit __destruct_n(size_t __s) _NOEXCEPT
-        : __size_(__s) {}
-
-    template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void __incr() _NOEXCEPT
-        {__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
-
-    template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void __set(size_t __s, _Tp*) _NOEXCEPT
-        {__set(__s, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
-
-    template <class _Tp>
-    _LIBCPP_INLINE_VISIBILITY void operator()(_Tp* __p) _NOEXCEPT
-        {__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());}
-};
-
-_LIBCPP_FUNC_VIS void* align(size_t __align, size_t __sz, void*& __ptr, size_t& __space);
-
-template <typename _Alloc, typename _Traits=allocator_traits<_Alloc> >
-struct __noexcept_move_assign_container : public integral_constant<bool,
-    _Traits::propagate_on_container_move_assignment::value
-#if _LIBCPP_STD_VER > 14
-        || _Traits::is_always_equal::value
-#else
-        && is_nothrow_move_assignable<_Alloc>::value
-#endif
-    > {};
-
-
-template <class _Tp, class _Alloc>
-struct __temp_value {
-    typedef allocator_traits<_Alloc> _Traits;
-
-#ifdef _LIBCPP_CXX03_LANG
-    typename aligned_storage<sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp)>::type __v;
-#else
-    union { _Tp __v; };
-#endif
-    _Alloc &__a;
-
-    _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp *__addr() {
-#ifdef _LIBCPP_CXX03_LANG
-        return reinterpret_cast<_Tp*>(std::addressof(__v));
-#else
-        return std::addressof(__v);
-#endif
-    }
-
-    _LIBCPP_CONSTEXPR_SINCE_CXX20 _Tp &   get() { return *__addr(); }
-
-    template<class... _Args>
-    _LIBCPP_NO_CFI
-    _LIBCPP_CONSTEXPR_SINCE_CXX20 __temp_value(_Alloc &__alloc, _Args&& ... __args) : __a(__alloc) {
-      _Traits::construct(__a, __addr(), std::forward<_Args>(__args)...);
-    }
-
-    _LIBCPP_CONSTEXPR_SINCE_CXX20 ~__temp_value() { _Traits::destroy(__a, __addr()); }
-};
-
-template<typename _Alloc, typename = void, typename = void>
-struct __is_allocator : false_type {};
-
-template<typename _Alloc>
-struct __is_allocator<_Alloc,
-       typename __void_t<typename _Alloc::value_type>::type,
-       typename __void_t<decltype(declval<_Alloc&>().allocate(size_t(0)))>::type
-     >
-   : true_type {};
-
-// __builtin_new_allocator -- A non-templated helper for allocating and
-// deallocating memory using __builtin_operator_new and
-// __builtin_operator_delete. It should be used in preference to
-// `std::allocator<T>` to avoid additional instantiations.
-struct __builtin_new_allocator {
-  struct __builtin_new_deleter {
-    typedef void* pointer_type;
-
-    _LIBCPP_CONSTEXPR explicit __builtin_new_deleter(size_t __size, size_t __align)
-        : __size_(__size), __align_(__align) {}
-
-    void operator()(void* __p) const _NOEXCEPT {
-        _VSTD::__libcpp_deallocate(__p, __size_, __align_);
-    }
-
-   private:
-    size_t __size_;
-    size_t __align_;
-  };
-
-  typedef unique_ptr<void, __builtin_new_deleter> __holder_t;
-
-  static __holder_t __allocate_bytes(size_t __s, size_t __align) {
-      return __holder_t(_VSTD::__libcpp_allocate(__s, __align),
-                     __builtin_new_deleter(__s, __align));
-  }
-
-  static void __deallocate_bytes(void* __p, size_t __s,
-                                 size_t __align) _NOEXCEPT {
-      _VSTD::__libcpp_deallocate(__p, __s, __align);
-  }
-
-  template <class _Tp>
-  _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
-  static __holder_t __allocate_type(size_t __n) {
-      return __allocate_bytes(__n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
-  }
-
-  template <class _Tp>
-  _LIBCPP_NODEBUG _LIBCPP_ALWAYS_INLINE
-  static void __deallocate_type(void* __p, size_t __n) _NOEXCEPT {
-      __deallocate_bytes(__p, __n * sizeof(_Tp), _LIBCPP_ALIGNOF(_Tp));
-  }
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
 #if defined(_LIBCPP_HAS_PARALLEL_ALGORITHMS) && _LIBCPP_STD_VER >= 17
 #   include <__pstl_memory>
 #endif
 
 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <cstddef>
+#  include <cstdint>
+#  include <cstring>
+#  include <iosfwd>
 #  include <iterator>
+#  include <new>
+#  include <stdexcept>
+#  include <tuple>
+#  include <type_traits>
+#  include <typeinfo>
 #  include <utility>
 #endif
 
diff --git a/libcxx/include/module.modulemap.in b/libcxx/include/module.modulemap.in
index f0ec768..e9f8cdc 100644
--- a/libcxx/include/module.modulemap.in
+++ b/libcxx/include/module.modulemap.in
@@ -834,6 +834,7 @@
 
     module __memory {
       module addressof                       { private header "__memory/addressof.h" }
+      module align                           { private header "__memory/align.h" }
       module allocate_at_least               { private header "__memory/allocate_at_least.h" }
       module allocation_guard                { private header "__memory/allocation_guard.h" }
       module allocator                       { private header "__memory/allocator.h" }
@@ -841,15 +842,18 @@
       module allocator_traits                { private header "__memory/allocator_traits.h" }
       module assume_aligned                  { private header "__memory/assume_aligned.h" }
       module auto_ptr                        { private header "__memory/auto_ptr.h" }
+      module builtin_new_allocator           { private header "__memory/builtin_new_allocator.h" }
       module compressed_pair                 { private header "__memory/compressed_pair.h" }
       module concepts                        { private header "__memory/concepts.h" }
       module construct_at                    { private header "__memory/construct_at.h" }
+      module destruct_n                      { private header "__memory/destruct_n.h" }
       module pointer_traits                  { private header "__memory/pointer_traits.h" }
       module ranges_construct_at             { private header "__memory/ranges_construct_at.h" }
       module ranges_uninitialized_algorithms { private header "__memory/ranges_uninitialized_algorithms.h" }
       module raw_storage_iterator            { private header "__memory/raw_storage_iterator.h" }
       module shared_ptr                      { private header "__memory/shared_ptr.h" }
       module swap_allocator                  { private header "__memory/swap_allocator.h" }
+      module temp_value                      { private header "__memory/temp_value.h" }
       module temporary_buffer                { private header "__memory/temporary_buffer.h" }
       module uninitialized_algorithms        { private header "__memory/uninitialized_algorithms.h" }
       module unique_ptr                      { private header "__memory/unique_ptr.h" }
@@ -1129,6 +1133,7 @@
     module integral_constant                   { private header "__type_traits/integral_constant.h" }
     module is_abstract                         { private header "__type_traits/is_abstract.h" }
     module is_aggregate                        { private header "__type_traits/is_aggregate.h" }
+    module is_allocator                        { private header "__type_traits/is_allocator.h" }
     module is_arithmetic                       { private header "__type_traits/is_arithmetic.h" }
     module is_array                            { private header "__type_traits/is_array.h" }
     module is_assignable                       { private header "__type_traits/is_assignable.h" }
@@ -1211,6 +1216,7 @@
     module maybe_const                         { private header "__type_traits/maybe_const.h" }
     module nat                                 { private header "__type_traits/nat.h" }
     module negation                            { private header "__type_traits/negation.h" }
+    module noexcept_move_assign_container      { private header "__type_traits/noexcept_move_assign_container.h" }
     module promote                             { private header "__type_traits/promote.h" }
     module rank                                { private header "__type_traits/rank.h" }
     module remove_all_extents                  { private header "__type_traits/remove_all_extents.h" }
diff --git a/libcxx/include/mutex b/libcxx/include/mutex
index 3aea375..139a7f5 100644
--- a/libcxx/include/mutex
+++ b/libcxx/include/mutex
@@ -188,11 +188,11 @@
 
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__config>
+#include <__memory/shared_ptr.h>
 #include <__mutex_base>
 #include <__threading_support>
 #include <__utility/forward.h>
 #include <cstdint>
-#include <memory>
 #ifndef _LIBCPP_CXX03_LANG
 # include <tuple>
 #endif
diff --git a/libcxx/include/ostream b/libcxx/include/ostream
index 19fe7b0..c15b058 100644
--- a/libcxx/include/ostream
+++ b/libcxx/include/ostream
@@ -165,9 +165,11 @@
 
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__config>
+#include <__memory/unique_ptr.h>
 #include <bitset>
 #include <ios>
 #include <locale>
+#include <new>
 #include <streambuf>
 #include <version>
 
diff --git a/libcxx/include/queue b/libcxx/include/queue
index 5e4b6ba..f36ccfd 100644
--- a/libcxx/include/queue
+++ b/libcxx/include/queue
@@ -956,7 +956,7 @@
 
 _LIBCPP_END_NAMESPACE_STD
 
-#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
 #  include <functional>
 #endif
 
diff --git a/libcxx/include/regex b/libcxx/include/regex
index 95a211f..e1799d9 100644
--- a/libcxx/include/regex
+++ b/libcxx/include/regex
@@ -770,9 +770,9 @@
 #include <__iterator/wrap_iter.h>
 #include <__locale>
 #include <__utility/move.h>
+#include <__utility/pair.h>
 #include <__utility/swap.h>
 #include <deque>
-#include <memory>
 #include <stdexcept>
 #include <string>
 #include <vector>
diff --git a/libcxx/include/scoped_allocator b/libcxx/include/scoped_allocator
index cf82aff..331d92c 100644
--- a/libcxx/include/scoped_allocator
+++ b/libcxx/include/scoped_allocator
@@ -111,10 +111,32 @@
 
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__config>
+#include <__memory/allocator_traits.h>
+#include <__type_traits/common_type.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/integral_constant.h>
+#include <__type_traits/is_constructible.h>
+#include <__type_traits/remove_reference.h>
 #include <__utility/forward.h>
-#include <memory>
+#include <__utility/move.h>
+#include <__utility/pair.h>
+#include <__utility/piecewise_construct.h>
+#include <tuple>
 #include <version>
 
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <atomic>
+#  include <climits>
+#  include <concepts>
+#  include <cstring>
+#  include <ctime>
+#  include <iterator>
+#  include <memory>
+#  include <ratio>
+#  include <stdexcept>
+#  include <variant>
+#endif
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
 #endif
diff --git a/libcxx/include/set b/libcxx/include/set
index e251857..f7ce27c 100644
--- a/libcxx/include/set
+++ b/libcxx/include/set
@@ -480,8 +480,10 @@
 #include <__iterator/erase_if_container.h>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/reverse_iterator.h>
+#include <__memory/allocator.h>
 #include <__node_handle>
 #include <__tree>
+#include <__type_traits/is_allocator.h>
 #include <__utility/forward.h>
 #include <version>
 
diff --git a/libcxx/include/string b/libcxx/include/string
index 26e55ce..44c2045 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -545,9 +545,16 @@
 #include <__iterator/reverse_iterator.h>
 #include <__iterator/wrap_iter.h>
 #include <__memory/allocate_at_least.h>
+#include <__memory/allocator.h>
+#include <__memory/allocator_traits.h>
+#include <__memory/compressed_pair.h>
+#include <__memory/construct_at.h>
+#include <__memory/pointer_traits.h>
 #include <__memory/swap_allocator.h>
 #include <__string/char_traits.h>
 #include <__string/extern_template_lists.h>
+#include <__type_traits/is_allocator.h>
+#include <__type_traits/noexcept_move_assign_container.h>
 #include <__utility/auto_cast.h>
 #include <__utility/move.h>
 #include <__utility/swap.h>
@@ -559,7 +566,6 @@
 #include <cstring>
 #include <iosfwd>
 #include <limits>
-#include <memory>
 #include <stdexcept>
 #include <string_view>
 #include <type_traits>
diff --git a/libcxx/include/thread b/libcxx/include/thread
index 85e9275..3ec6293 100644
--- a/libcxx/include/thread
+++ b/libcxx/include/thread
@@ -86,6 +86,7 @@
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__config>
 #include <__functional/hash.h>
+#include <__memory/unique_ptr.h>
 #include <__mutex_base>
 #include <__thread/poll_with_backoff.h>
 #include <__thread/timed_backoff_policy.h>
@@ -93,7 +94,6 @@
 #include <__utility/forward.h>
 #include <cstddef>
 #include <iosfwd>
-#include <memory>
 #include <system_error>
 #include <tuple>
 #include <type_traits>
diff --git a/libcxx/include/unordered_map b/libcxx/include/unordered_map
index 38de4d8..2f20ad3 100644
--- a/libcxx/include/unordered_map
+++ b/libcxx/include/unordered_map
@@ -525,7 +525,9 @@
 #include <__iterator/erase_if_container.h>
 #include <__iterator/iterator_traits.h>
 #include <__memory/addressof.h>
+#include <__memory/allocator.h>
 #include <__node_handle>
+#include <__type_traits/is_allocator.h>
 #include <__utility/forward.h>
 #include <stdexcept>
 #include <tuple>
diff --git a/libcxx/include/unordered_set b/libcxx/include/unordered_set
index 2440450..3efc355 100644
--- a/libcxx/include/unordered_set
+++ b/libcxx/include/unordered_set
@@ -470,7 +470,9 @@
 #include <__iterator/erase_if_container.h>
 #include <__iterator/iterator_traits.h>
 #include <__memory/addressof.h>
+#include <__memory/allocator.h>
 #include <__node_handle>
+#include <__type_traits/is_allocator.h>
 #include <__utility/forward.h>
 #include <version>
 
diff --git a/libcxx/include/vector b/libcxx/include/vector
index 8b27eaa..4404098 100644
--- a/libcxx/include/vector
+++ b/libcxx/include/vector
@@ -293,7 +293,11 @@
 #include <__memory/allocate_at_least.h>
 #include <__memory/pointer_traits.h>
 #include <__memory/swap_allocator.h>
+#include <__memory/temp_value.h>
+#include <__memory/uninitialized_algorithms.h>
 #include <__split_buffer>
+#include <__type_traits/is_allocator.h>
+#include <__type_traits/noexcept_move_assign_container.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
 #include <__utility/swap.h>
@@ -302,7 +306,6 @@
 #include <cstring>
 #include <iosfwd> // for forward declaration of vector
 #include <limits>
-#include <memory>
 #include <stdexcept>
 #include <type_traits>
 #include <version>
diff --git a/libcxx/test/libcxx/memory/compressed_pair/compressed_pair.pass.cpp b/libcxx/test/libcxx/memory/compressed_pair/compressed_pair.pass.cpp
index 53acd8f..8bc890a 100644
--- a/libcxx/test/libcxx/memory/compressed_pair/compressed_pair.pass.cpp
+++ b/libcxx/test/libcxx/memory/compressed_pair/compressed_pair.pass.cpp
@@ -8,6 +8,7 @@
 
 #include <assert.h>
 #include <memory>
+#include <new>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/libcxx/private_headers.verify.cpp b/libcxx/test/libcxx/private_headers.verify.cpp
index d69f8f2..c822992 100644
--- a/libcxx/test/libcxx/private_headers.verify.cpp
+++ b/libcxx/test/libcxx/private_headers.verify.cpp
@@ -410,6 +410,7 @@
 #include <__locale> // expected-error@*:* {{use of private header from outside its module: '__locale'}}
 #include <__mbstate_t.h> // expected-error@*:* {{use of private header from outside its module: '__mbstate_t.h'}}
 #include <__memory/addressof.h> // expected-error@*:* {{use of private header from outside its module: '__memory/addressof.h'}}
+#include <__memory/align.h> // expected-error@*:* {{use of private header from outside its module: '__memory/align.h'}}
 #include <__memory/allocate_at_least.h> // expected-error@*:* {{use of private header from outside its module: '__memory/allocate_at_least.h'}}
 #include <__memory/allocation_guard.h> // expected-error@*:* {{use of private header from outside its module: '__memory/allocation_guard.h'}}
 #include <__memory/allocator.h> // expected-error@*:* {{use of private header from outside its module: '__memory/allocator.h'}}
@@ -417,15 +418,18 @@
 #include <__memory/allocator_traits.h> // expected-error@*:* {{use of private header from outside its module: '__memory/allocator_traits.h'}}
 #include <__memory/assume_aligned.h> // expected-error@*:* {{use of private header from outside its module: '__memory/assume_aligned.h'}}
 #include <__memory/auto_ptr.h> // expected-error@*:* {{use of private header from outside its module: '__memory/auto_ptr.h'}}
+#include <__memory/builtin_new_allocator.h> // expected-error@*:* {{use of private header from outside its module: '__memory/builtin_new_allocator.h'}}
 #include <__memory/compressed_pair.h> // expected-error@*:* {{use of private header from outside its module: '__memory/compressed_pair.h'}}
 #include <__memory/concepts.h> // expected-error@*:* {{use of private header from outside its module: '__memory/concepts.h'}}
 #include <__memory/construct_at.h> // expected-error@*:* {{use of private header from outside its module: '__memory/construct_at.h'}}
+#include <__memory/destruct_n.h> // expected-error@*:* {{use of private header from outside its module: '__memory/destruct_n.h'}}
 #include <__memory/pointer_traits.h> // expected-error@*:* {{use of private header from outside its module: '__memory/pointer_traits.h'}}
 #include <__memory/ranges_construct_at.h> // expected-error@*:* {{use of private header from outside its module: '__memory/ranges_construct_at.h'}}
 #include <__memory/ranges_uninitialized_algorithms.h> // expected-error@*:* {{use of private header from outside its module: '__memory/ranges_uninitialized_algorithms.h'}}
 #include <__memory/raw_storage_iterator.h> // expected-error@*:* {{use of private header from outside its module: '__memory/raw_storage_iterator.h'}}
 #include <__memory/shared_ptr.h> // expected-error@*:* {{use of private header from outside its module: '__memory/shared_ptr.h'}}
 #include <__memory/swap_allocator.h> // expected-error@*:* {{use of private header from outside its module: '__memory/swap_allocator.h'}}
+#include <__memory/temp_value.h> // expected-error@*:* {{use of private header from outside its module: '__memory/temp_value.h'}}
 #include <__memory/temporary_buffer.h> // expected-error@*:* {{use of private header from outside its module: '__memory/temporary_buffer.h'}}
 #include <__memory/uninitialized_algorithms.h> // expected-error@*:* {{use of private header from outside its module: '__memory/uninitialized_algorithms.h'}}
 #include <__memory/unique_ptr.h> // expected-error@*:* {{use of private header from outside its module: '__memory/unique_ptr.h'}}
@@ -549,6 +553,7 @@
 #include <__type_traits/integral_constant.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/integral_constant.h'}}
 #include <__type_traits/is_abstract.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/is_abstract.h'}}
 #include <__type_traits/is_aggregate.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/is_aggregate.h'}}
+#include <__type_traits/is_allocator.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/is_allocator.h'}}
 #include <__type_traits/is_arithmetic.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/is_arithmetic.h'}}
 #include <__type_traits/is_array.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/is_array.h'}}
 #include <__type_traits/is_assignable.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/is_assignable.h'}}
@@ -631,6 +636,7 @@
 #include <__type_traits/maybe_const.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/maybe_const.h'}}
 #include <__type_traits/nat.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/nat.h'}}
 #include <__type_traits/negation.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/negation.h'}}
+#include <__type_traits/noexcept_move_assign_container.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/noexcept_move_assign_container.h'}}
 #include <__type_traits/promote.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/promote.h'}}
 #include <__type_traits/rank.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/rank.h'}}
 #include <__type_traits/remove_all_extents.h> // expected-error@*:* {{use of private header from outside its module: '__type_traits/remove_all_extents.h'}}
diff --git a/libcxx/test/libcxx/transitive_includes.sh.cpp b/libcxx/test/libcxx/transitive_includes.sh.cpp
index f53637d..a17a3fb 100644
--- a/libcxx/test/libcxx/transitive_includes.sh.cpp
+++ b/libcxx/test/libcxx/transitive_includes.sh.cpp
@@ -33,7 +33,7 @@
 // This test is not supported when we remove the transitive includes provided for backwards
 // compatibility. When we bulk-remove them, we'll adjust the includes that are expected by
 // this test instead.
-// XFAIL: transitive-includes-disabled
+// UNSUPPORTED: transitive-includes-disabled
 
 // Prevent <ext/hash_map> from generating deprecated warnings for this test.
 #if defined(__DEPRECATED)
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.algorithm b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.algorithm
index 2ba3140..af06e12e 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.algorithm
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.algorithm
@@ -1,4 +1,3 @@
-atomic
 bit
 climits
 cmath
@@ -8,16 +7,11 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
-ratio
-stdexcept
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.any b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.any
index 3b7a13d..626b4a4 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.any
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.any
@@ -12,7 +12,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.barrier b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.barrier
index 3b7a13d..83db015 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.barrier
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.barrier
@@ -2,21 +2,16 @@
 climits
 cmath
 compare
-concepts
 cstddef
 cstdint
 cstdlib
 cstring
 ctime
 exception
-initializer_list
 iosfwd
 limits
-memory
 new
 ratio
-stdexcept
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.bitset b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.bitset
index 9607070..1c742b1 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.bitset
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.bitset
@@ -1,4 +1,3 @@
-atomic
 cctype
 climits
 cmath
@@ -9,20 +8,16 @@
 cstdio
 cstdlib
 cstring
-ctime
 cwchar
 cwctype
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
-ratio
 stdexcept
 string
 string_view
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ccomplex b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ccomplex
index eb5fe7c..f79ea2f 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ccomplex
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ccomplex
@@ -23,7 +23,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.codecvt b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.codecvt
index 1aa71f5..525723e 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.codecvt
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.codecvt
@@ -17,7 +17,6 @@
 initializer_list
 iosfwd
 limits
-memory
 mutex
 new
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.complex b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.complex
index 1acc28a..19da66d 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.complex
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.complex
@@ -22,7 +22,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.condition_variable b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.condition_variable
index 30ca93c..4b6b70f 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.condition_variable
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.condition_variable
@@ -17,7 +17,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ctgmath b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ctgmath
index cfc2d04..9d4728e 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ctgmath
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ctgmath
@@ -24,7 +24,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.deque b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.deque
index 3b7a13d..626b4a4 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.deque
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.deque
@@ -12,7 +12,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_algorithm b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_algorithm
index 8e539be..313807a 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_algorithm
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_algorithm
@@ -1,5 +1,4 @@
 algorithm
-atomic
 bit
 climits
 cmath
@@ -9,16 +8,11 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
-ratio
-stdexcept
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_coroutine b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_coroutine
index 3b7a13d..a85c5ddb 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_coroutine
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_coroutine
@@ -1,22 +1,9 @@
-atomic
-climits
-cmath
-compare
-concepts
 cstddef
 cstdint
 cstdlib
 cstring
-ctime
 exception
-initializer_list
-iosfwd
 limits
-memory
 new
-ratio
-stdexcept
-tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_deque b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_deque
index 7ea4c31..a8bd778 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_deque
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_deque
@@ -15,7 +15,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_forward_list b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_forward_list
index 345444b..262944b 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_forward_list
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_forward_list
@@ -15,7 +15,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_list b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_list
index 794d13e..33fa6ac 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_list
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_list
@@ -15,7 +15,6 @@
 iosfwd
 limits
 list
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_map b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_map
index 69067ff..2c337ca 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_map
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_map
@@ -1,5 +1,3 @@
-atomic
-climits
 cmath
 compare
 concepts
@@ -7,7 +5,6 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 experimental/memory_resource
 experimental/utility
@@ -15,13 +12,10 @@
 iosfwd
 limits
 map
-memory
 new
 optional
-ratio
 stdexcept
 tuple
 type_traits
-typeinfo
 utility
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_memory_resource b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_memory_resource
index 36bd21d..852039a 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_memory_resource
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_memory_resource
@@ -1,24 +1,16 @@
-atomic
-climits
 cmath
 compare
-concepts
 cstddef
 cstdint
 cstdlib
-cstring
-ctime
 exception
 experimental/utility
 initializer_list
 iosfwd
 limits
-memory
 new
-ratio
 stdexcept
 tuple
 type_traits
-typeinfo
 utility
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_regex b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_regex
index a73c054..92b60fe 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_regex
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_regex
@@ -21,7 +21,6 @@
 initializer_list
 iosfwd
 limits
-memory
 mutex
 new
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_set b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_set
index 1f0e829..97d4fec 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_set
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_set
@@ -1,5 +1,3 @@
-atomic
-climits
 cmath
 compare
 concepts
@@ -7,21 +5,17 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 experimental/memory_resource
 experimental/utility
 initializer_list
 iosfwd
 limits
-memory
 new
 optional
-ratio
 set
 stdexcept
 tuple
 type_traits
-typeinfo
 utility
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_string b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_string
index bb9f889..5ec4bfe 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_string
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_string
@@ -1,4 +1,3 @@
-atomic
 cctype
 climits
 cmath
@@ -9,7 +8,6 @@
 cstdio
 cstdlib
 cstring
-ctime
 cwchar
 cwctype
 exception
@@ -18,14 +16,11 @@
 initializer_list
 iosfwd
 limits
-memory
 new
-ratio
 stdexcept
 string
 string_view
 tuple
 type_traits
-typeinfo
 utility
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_unordered_map b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_unordered_map
index c9efa53..c497967 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_unordered_map
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_unordered_map
@@ -1,5 +1,3 @@
-atomic
-climits
 cmath
 compare
 concepts
@@ -7,21 +5,17 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 experimental/memory_resource
 experimental/utility
 initializer_list
 iosfwd
 limits
-memory
 new
 optional
-ratio
 stdexcept
 tuple
 type_traits
-typeinfo
 unordered_map
 utility
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_unordered_set b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_unordered_set
index 1b34d3c..9a1b417f 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_unordered_set
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_unordered_set
@@ -1,5 +1,3 @@
-atomic
-climits
 cmath
 compare
 concepts
@@ -7,21 +5,17 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 experimental/memory_resource
 experimental/utility
 initializer_list
 iosfwd
 limits
-memory
 new
 optional
-ratio
 stdexcept
 tuple
 type_traits
-typeinfo
 unordered_set
 utility
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_vector b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_vector
index 0813d43..14a94c0 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_vector
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.experimental_vector
@@ -14,7 +14,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.filesystem b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.filesystem
index 86446ab..0405dac 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.filesystem
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.filesystem
@@ -23,7 +23,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.format b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.format
index e01e3c7..b775246 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.format
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.format
@@ -23,7 +23,6 @@
 iosfwd
 limits
 locale
-memory
 mutex
 new
 optional
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.forward_list b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.forward_list
index 3b7a13d..626b4a4 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.forward_list
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.forward_list
@@ -12,7 +12,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.fstream b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.fstream
index adc5812..3b3af56 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.fstream
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.fstream
@@ -24,7 +24,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.future b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.future
index 92035b6..ba6d3a4 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.future
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.future
@@ -17,7 +17,6 @@
 initializer_list
 iosfwd
 limits
-memory
 mutex
 new
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.iomanip b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.iomanip
index cbd4a87..83cb709 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.iomanip
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.iomanip
@@ -22,7 +22,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ios b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ios
index 1aa71f5..525723e 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ios
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ios
@@ -17,7 +17,6 @@
 initializer_list
 iosfwd
 limits
-memory
 mutex
 new
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.iostream b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.iostream
index cbd4a87..83cb709 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.iostream
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.iostream
@@ -22,7 +22,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.istream b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.istream
index 1d7da3e..3dcf229 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.istream
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.istream
@@ -21,7 +21,6 @@
 iosfwd
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.list b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.list
index 3b7a13d..626b4a4 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.list
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.list
@@ -12,7 +12,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.locale b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.locale
index 4872956..50c8681 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.locale
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.locale
@@ -19,7 +19,6 @@
 ios
 iosfwd
 limits
-memory
 mutex
 new
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.map b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.map
index b319682e..573d3aa 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.map
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.map
@@ -1,5 +1,3 @@
-atomic
-climits
 cmath
 compare
 concepts
@@ -7,17 +5,13 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
 optional
-ratio
 stdexcept
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.mutex b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.mutex
index 30ca93c..4b6b70f 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.mutex
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.mutex
@@ -17,7 +17,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ostream b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ostream
index 2d9bbe9..b0962f6 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ostream
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.ostream
@@ -21,7 +21,6 @@
 iosfwd
 limits
 locale
-memory
 mutex
 new
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.queue b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.queue
index 97a5262..616c41e 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.queue
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.queue
@@ -1,4 +1,3 @@
-array
 atomic
 climits
 cmath
@@ -11,18 +10,14 @@
 ctime
 deque
 exception
-functional
 initializer_list
 iosfwd
 limits
-memory
 new
-optional
 ratio
 stdexcept
 tuple
 type_traits
 typeinfo
-unordered_map
 vector
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.random b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.random
index 0aae5eb..0dca23e 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.random
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.random
@@ -17,7 +17,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 numeric
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.regex b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.regex
index da1e931..992fa7d 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.regex
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.regex
@@ -18,7 +18,6 @@
 initializer_list
 iosfwd
 limits
-memory
 mutex
 new
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.scoped_allocator b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.scoped_allocator
index 3b7a13d..a25e41c 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.scoped_allocator
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.scoped_allocator
@@ -1,22 +1,11 @@
-atomic
-climits
 cmath
 compare
-concepts
 cstddef
 cstdint
 cstdlib
-cstring
-ctime
 exception
-initializer_list
-iosfwd
 limits
-memory
 new
-ratio
-stdexcept
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.set b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.set
index b319682e..573d3aa 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.set
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.set
@@ -1,5 +1,3 @@
-atomic
-climits
 cmath
 compare
 concepts
@@ -7,17 +5,13 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
 optional
-ratio
 stdexcept
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.shared_mutex b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.shared_mutex
index 30ca93c..8ec7c41 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.shared_mutex
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.shared_mutex
@@ -1,4 +1,3 @@
-atomic
 cctype
 cerrno
 climits
@@ -17,7 +16,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
@@ -26,5 +24,4 @@
 system_error
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.sstream b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.sstream
index cbd4a87..83cb709 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.sstream
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.sstream
@@ -22,7 +22,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.stack b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.stack
index aa51131..c646116 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.stack
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.stack
@@ -13,7 +13,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.streambuf b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.streambuf
index 3ecae93..23fe84b 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.streambuf
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.streambuf
@@ -18,7 +18,6 @@
 ios
 iosfwd
 limits
-memory
 mutex
 new
 ratio
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.string b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.string
index 2cb394a..0b7d2f2 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.string
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.string
@@ -1,4 +1,3 @@
-atomic
 cctype
 climits
 cmath
@@ -9,19 +8,15 @@
 cstdio
 cstdlib
 cstring
-ctime
 cwchar
 cwctype
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
-ratio
 stdexcept
 string_view
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.strstream b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.strstream
index cbd4a87..83cb709 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.strstream
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.strstream
@@ -22,7 +22,6 @@
 istream
 limits
 locale
-memory
 mutex
 new
 ostream
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.system_error b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.system_error
index 033d198..fd9ba21 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.system_error
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.system_error
@@ -1,4 +1,3 @@
-atomic
 cctype
 cerrno
 climits
@@ -10,20 +9,16 @@
 cstdio
 cstdlib
 cstring
-ctime
 cwchar
 cwctype
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
-ratio
 stdexcept
 string
 string_view
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.thread b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.thread
index 30ca93c..8ec7c41 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.thread
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.thread
@@ -1,4 +1,3 @@
-atomic
 cctype
 cerrno
 climits
@@ -17,7 +16,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
@@ -26,5 +24,4 @@
 system_error
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.unordered_map b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.unordered_map
index b319682e..573d3aa 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.unordered_map
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.unordered_map
@@ -1,5 +1,3 @@
-atomic
-climits
 cmath
 compare
 concepts
@@ -7,17 +5,13 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
 optional
-ratio
 stdexcept
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.unordered_set b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.unordered_set
index b319682e..573d3aa 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.unordered_set
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.unordered_set
@@ -1,5 +1,3 @@
-atomic
-climits
 cmath
 compare
 concepts
@@ -7,17 +5,13 @@
 cstdint
 cstdlib
 cstring
-ctime
 exception
 initializer_list
 iosfwd
 limits
-memory
 new
 optional
-ratio
 stdexcept
 tuple
 type_traits
-typeinfo
 version
diff --git a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.vector b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.vector
index 3b7a13d..626b4a4 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b/expected.vector
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b/expected.vector
@@ -12,7 +12,6 @@
 initializer_list
 iosfwd
 limits
-memory
 new
 ratio
 stdexcept
diff --git a/libcxx/test/libcxx/utilities/any/allocator.pass.cpp b/libcxx/test/libcxx/utilities/any/allocator.pass.cpp
index 7891db6..daaf74a 100644
--- a/libcxx/test/libcxx/utilities/any/allocator.pass.cpp
+++ b/libcxx/test/libcxx/utilities/any/allocator.pass.cpp
@@ -18,6 +18,7 @@
 #include <cassert>
 #include <cstddef>
 #include <memory>
+#include <new>
 #include <type_traits>
 #include <utility>
 
diff --git a/libcxx/test/libcxx/utilities/memory/pointer.conversion/to_address.pass.cpp b/libcxx/test/libcxx/utilities/memory/pointer.conversion/to_address.pass.cpp
index bd2faa1..60ef98a 100644
--- a/libcxx/test/libcxx/utilities/memory/pointer.conversion/to_address.pass.cpp
+++ b/libcxx/test/libcxx/utilities/memory/pointer.conversion/to_address.pass.cpp
@@ -13,6 +13,8 @@
 
 #include <memory>
 #include <cassert>
+#include <utility>
+
 #include "test_macros.h"
 
 struct Irrelevant;
diff --git a/libcxx/test/libcxx/utilities/memory/util.smartptr/util.smartptr.shared/function_type_default_deleter.fail.cpp b/libcxx/test/libcxx/utilities/memory/util.smartptr/util.smartptr.shared/function_type_default_deleter.fail.cpp
index 68ac9e3..a0f3b5d 100644
--- a/libcxx/test/libcxx/utilities/memory/util.smartptr/util.smartptr.shared/function_type_default_deleter.fail.cpp
+++ b/libcxx/test/libcxx/utilities/memory/util.smartptr/util.smartptr.shared/function_type_default_deleter.fail.cpp
@@ -9,6 +9,7 @@
 // UNSUPPORTED: c++03
 
 #include <memory>
+#include <type_traits>
 
 template <int> struct Tag {};
 
diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax.pass.cpp
index 0dffd52..a5b7b22 100644
--- a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax.pass.cpp
@@ -14,6 +14,7 @@
 
 #include <algorithm>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list.pass.cpp
index d961ddc..b1df77a 100644
--- a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/minmax_init_list.pass.cpp
@@ -16,6 +16,7 @@
 
 #include <algorithm>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/ranges.minmax.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/ranges.minmax.pass.cpp
index 6819bf9..828a820 100644
--- a/libcxx/test/std/algorithms/alg.sorting/alg.min.max/ranges.minmax.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.sorting/alg.min.max/ranges.minmax.pass.cpp
@@ -28,6 +28,7 @@
 #include <array>
 #include <cassert>
 #include <functional>
+#include <memory>
 #include <ranges>
 
 #include "test_iterators.h"
diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort.pass.cpp
index c79f752..ed26c5b 100644
--- a/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.sorting/alg.sort/sort/sort.pass.cpp
@@ -21,6 +21,7 @@
 #include <cassert>
 #include <vector>
 #include <deque>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/sequences/forwardlist/forwardlist.modifiers/push_front_exception_safety.pass.cpp b/libcxx/test/std/containers/sequences/forwardlist/forwardlist.modifiers/push_front_exception_safety.pass.cpp
index 1154447..57b9f58 100644
--- a/libcxx/test/std/containers/sequences/forwardlist/forwardlist.modifiers/push_front_exception_safety.pass.cpp
+++ b/libcxx/test/std/containers/sequences/forwardlist/forwardlist.modifiers/push_front_exception_safety.pass.cpp
@@ -13,6 +13,7 @@
 
 #include <forward_list>
 #include <cassert>
+#include <exception>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/sequences/list/list.modifiers/push_back_exception_safety.pass.cpp b/libcxx/test/std/containers/sequences/list/list.modifiers/push_back_exception_safety.pass.cpp
index 8faf97a..dec63a5 100644
--- a/libcxx/test/std/containers/sequences/list/list.modifiers/push_back_exception_safety.pass.cpp
+++ b/libcxx/test/std/containers/sequences/list/list.modifiers/push_back_exception_safety.pass.cpp
@@ -13,6 +13,7 @@
 
 #include <list>
 #include <cassert>
+#include <exception>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/containers/sequences/list/list.modifiers/push_front_exception_safety.pass.cpp b/libcxx/test/std/containers/sequences/list/list.modifiers/push_front_exception_safety.pass.cpp
index aadeaaf..4ce3b7e 100644
--- a/libcxx/test/std/containers/sequences/list/list.modifiers/push_front_exception_safety.pass.cpp
+++ b/libcxx/test/std/containers/sequences/list/list.modifiers/push_front_exception_safety.pass.cpp
@@ -13,6 +13,7 @@
 
 #include <list>
 #include <cassert>
+#include <exception>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.trivial.awaitables/suspend_always.pass.cpp b/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.trivial.awaitables/suspend_always.pass.cpp
index 7e7eb61..dd5673b 100644
--- a/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.trivial.awaitables/suspend_always.pass.cpp
+++ b/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.trivial.awaitables/suspend_always.pass.cpp
@@ -11,6 +11,7 @@
 #include <experimental/coroutine>
 #include <type_traits>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.trivial.awaitables/suspend_never.pass.cpp b/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.trivial.awaitables/suspend_never.pass.cpp
index 2acad5e..8d59d6a 100644
--- a/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.trivial.awaitables/suspend_never.pass.cpp
+++ b/libcxx/test/std/experimental/language.support/support.coroutines/coroutine.trivial.awaitables/suspend_never.pass.cpp
@@ -11,6 +11,7 @@
 #include <experimental/coroutine>
 #include <type_traits>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/localization/locales/locale.global.templates/use_facet.pass.cpp b/libcxx/test/std/localization/locales/locale.global.templates/use_facet.pass.cpp
index 3c2cb60..f79317f 100644
--- a/libcxx/test/std/localization/locales/locale.global.templates/use_facet.pass.cpp
+++ b/libcxx/test/std/localization/locales/locale.global.templates/use_facet.pass.cpp
@@ -12,6 +12,7 @@
 
 #include <locale>
 #include <cassert>
+#include <typeinfo>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/ranges/range.adaptors/range.zip/general.pass.cpp b/libcxx/test/std/ranges/range.adaptors/range.zip/general.pass.cpp
index b443a12..1f0c39b 100644
--- a/libcxx/test/std/ranges/range.adaptors/range.zip/general.pass.cpp
+++ b/libcxx/test/std/ranges/range.adaptors/range.zip/general.pass.cpp
@@ -16,6 +16,7 @@
 
 #include <array>
 #include <cassert>
+#include <tuple>
 #include <vector>
 #include <string>
 
diff --git a/libcxx/test/std/strings/basic.string/string.capacity/max_size.pass.cpp b/libcxx/test/std/strings/basic.string/string.capacity/max_size.pass.cpp
index 230c844..b8e4198 100644
--- a/libcxx/test/std/strings/basic.string/string.capacity/max_size.pass.cpp
+++ b/libcxx/test/std/strings/basic.string/string.capacity/max_size.pass.cpp
@@ -20,6 +20,7 @@
 
 #include <string>
 #include <cassert>
+#include <new>
 
 #include "test_macros.h"
 #include "min_allocator.h"
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.verify.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.verify.cpp
index 32405b7..2353b51 100644
--- a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.verify.cpp
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_F.verify.cpp
@@ -18,6 +18,7 @@
 
 #include <functional>
 #include <cassert>
+#include <memory>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_function.verify.cpp b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_function.verify.cpp
index e9199cb..4263eee 100644
--- a/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_function.verify.cpp
+++ b/libcxx/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_function.verify.cpp
@@ -18,6 +18,7 @@
 
 #include <functional>
 #include <cassert>
+#include <memory>
 
 #include "test_macros.h"
 
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 f33dbff..c8e2394 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
@@ -16,6 +16,7 @@
 
 #include <cassert>
 #include <concepts>
+#include <cstddef>
 #include <memory>
 
 // check that std::allocation_result exists and isn't restricted to pointers
diff --git a/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.verify.cpp b/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.verify.cpp
index b1fc7a6..7e3c41c 100644
--- a/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.verify.cpp
+++ b/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/allocate.verify.cpp
@@ -17,9 +17,10 @@
 
 // UNSUPPORTED: c++03, c++11, c++14, c++17
 
-#include <memory>
-#include <cstdint>
 #include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <memory>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/construct.pass.cpp b/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/construct.pass.cpp
index 38e24fd..b2258ee 100644
--- a/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/construct.pass.cpp
+++ b/libcxx/test/std/utilities/memory/allocator.traits/allocator.traits.members/construct.pass.cpp
@@ -20,6 +20,7 @@
 #include <new>
 #include <type_traits>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 #include "incomplete_type_helper.h"
diff --git a/libcxx/test/std/utilities/memory/default.allocator/allocator.members/allocate.constexpr.size.verify.cpp b/libcxx/test/std/utilities/memory/default.allocator/allocator.members/allocate.constexpr.size.verify.cpp
index a083e2d..717ba0d 100644
--- a/libcxx/test/std/utilities/memory/default.allocator/allocator.members/allocate.constexpr.size.verify.cpp
+++ b/libcxx/test/std/utilities/memory/default.allocator/allocator.members/allocate.constexpr.size.verify.cpp
@@ -13,8 +13,9 @@
 
 // UNSUPPORTED: c++03, c++11, c++14, c++17
 
-#include <memory>
 #include <cassert>
+#include <cstddef>
+#include <memory>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/default.allocator/allocator.members/allocate.size.pass.cpp b/libcxx/test/std/utilities/memory/default.allocator/allocator.members/allocate.size.pass.cpp
index 6b9b12c..3622b7c 100644
--- a/libcxx/test/std/utilities/memory/default.allocator/allocator.members/allocate.size.pass.cpp
+++ b/libcxx/test/std/utilities/memory/default.allocator/allocator.members/allocate.size.pass.cpp
@@ -14,6 +14,7 @@
 
 #include <memory>
 #include <cassert>
+#include <new>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/default.allocator/allocator_pointers.pass.cpp b/libcxx/test/std/utilities/memory/default.allocator/allocator_pointers.pass.cpp
index 777e5df..cb3ec88 100644
--- a/libcxx/test/std/utilities/memory/default.allocator/allocator_pointers.pass.cpp
+++ b/libcxx/test/std/utilities/memory/default.allocator/allocator_pointers.pass.cpp
@@ -10,6 +10,7 @@
 
 #include <memory>
 #include <cassert>
+#include <type_traits>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp b/libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp
index b927001..fea34ff 100644
--- a/libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp
+++ b/libcxx/test/std/utilities/memory/pointer.conversion/to_address.pass.cpp
@@ -15,6 +15,8 @@
 
 #include <memory>
 #include <cassert>
+#include <utility>
+
 #include "test_macros.h"
 
 struct Irrelevant;
diff --git a/libcxx/test/std/utilities/memory/pointer.traits/pointer.traits.functions/pointer_to.pass.cpp b/libcxx/test/std/utilities/memory/pointer.traits/pointer.traits.functions/pointer_to.pass.cpp
index bd561dd..62ea10c 100644
--- a/libcxx/test/std/utilities/memory/pointer.traits/pointer.traits.functions/pointer_to.pass.cpp
+++ b/libcxx/test/std/utilities/memory/pointer.traits/pointer.traits.functions/pointer_to.pass.cpp
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <cassert>
+#include <type_traits>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/pointer.traits/pointer_to.pass.cpp b/libcxx/test/std/utilities/memory/pointer.traits/pointer_to.pass.cpp
index ebbbf8b..c4b5ca1 100644
--- a/libcxx/test/std/utilities/memory/pointer.traits/pointer_to.pass.cpp
+++ b/libcxx/test/std/utilities/memory/pointer.traits/pointer_to.pass.cpp
@@ -17,6 +17,7 @@
 
 #include <memory>
 #include <cassert>
+#include <type_traits>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/ptr.align/align.pass.cpp b/libcxx/test/std/utilities/memory/ptr.align/align.pass.cpp
index d227238..1fc29f7 100644
--- a/libcxx/test/std/utilities/memory/ptr.align/align.pass.cpp
+++ b/libcxx/test/std/utilities/memory/ptr.align/align.pass.cpp
@@ -10,8 +10,9 @@
 
 // void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
 
-#include <memory>
 #include <cassert>
+#include <cstddef>
+#include <memory>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy.pass.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy.pass.cpp
index 2618bd5..c3b6e18 100644
--- a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy.pass.cpp
+++ b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy.pass.cpp
@@ -40,7 +40,7 @@
 struct Nasty
 {
     Nasty() : i_ ( counter_++ ) {}
-    Nasty * operator &() const { return NULL; }
+    Nasty * operator &() const { return nullptr; }
     int i_;
     static int counter_;
 };
diff --git a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy_n.pass.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy_n.pass.cpp
index 1a237a7..9d0fae3 100644
--- a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy_n.pass.cpp
+++ b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.copy/uninitialized_copy_n.pass.cpp
@@ -40,7 +40,7 @@
 struct Nasty
 {
     Nasty() : i_ ( counter_++ ) {}
-    Nasty * operator &() const { return NULL; }
+    Nasty * operator &() const { return nullptr; }
     int i_;
     static int counter_;
 };
diff --git a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.fill.n/uninitialized_fill_n.pass.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.fill.n/uninitialized_fill_n.pass.cpp
index 4dfde4f..8b46f1b 100644
--- a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.fill.n/uninitialized_fill_n.pass.cpp
+++ b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.fill.n/uninitialized_fill_n.pass.cpp
@@ -39,7 +39,7 @@
 struct Nasty
 {
     Nasty() : i_ ( counter_++ ) {}
-    Nasty * operator &() const { return NULL; }
+    Nasty * operator &() const { return nullptr; }
     int i_;
     static int counter_;
 };
diff --git a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.fill/uninitialized_fill.pass.cpp b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.fill/uninitialized_fill.pass.cpp
index 1996ec6..fd6576d 100644
--- a/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.fill/uninitialized_fill.pass.cpp
+++ b/libcxx/test/std/utilities/memory/specialized.algorithms/uninitialized.fill/uninitialized_fill.pass.cpp
@@ -40,7 +40,7 @@
 struct Nasty
 {
     Nasty() : i_ ( counter_++ ) {}
-    Nasty * operator &() const { return NULL; }
+    Nasty * operator &() const { return nullptr; }
     int i_;
     static int counter_;
 };
diff --git a/libcxx/test/std/utilities/memory/temporary.buffer/overaligned.pass.cpp b/libcxx/test/std/utilities/memory/temporary.buffer/overaligned.pass.cpp
index 08aab53..b8ba988 100644
--- a/libcxx/test/std/utilities/memory/temporary.buffer/overaligned.pass.cpp
+++ b/libcxx/test/std/utilities/memory/temporary.buffer/overaligned.pass.cpp
@@ -27,6 +27,7 @@
 
 #include <memory>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/temporary.buffer/temporary_buffer.pass.cpp b/libcxx/test/std/utilities/memory/temporary.buffer/temporary_buffer.pass.cpp
index 7a0f894..6c0fbf2 100644
--- a/libcxx/test/std/utilities/memory/temporary.buffer/temporary_buffer.pass.cpp
+++ b/libcxx/test/std/utilities/memory/temporary.buffer/temporary_buffer.pass.cpp
@@ -20,6 +20,7 @@
 
 #include <memory>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/shared_ptr_rv.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/shared_ptr_rv.pass.cpp
index 9dc5106..f48fe75 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/shared_ptr_rv.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/shared_ptr_rv.pass.cpp
@@ -17,6 +17,7 @@
 #include <memory>
 #include <type_traits>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/unique_ptr_Y.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/unique_ptr_Y.pass.cpp
index 3063e77..35671c4 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/unique_ptr_Y.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.assign/unique_ptr_Y.pass.cpp
@@ -15,6 +15,7 @@
 #include <memory>
 #include <type_traits>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/deduction.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/deduction.pass.cpp
index 7373adf..9b875e6 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/deduction.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/deduction.pass.cpp
@@ -16,6 +16,7 @@
 
 #include <memory>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_copy_move.fail.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_copy_move.fail.cpp
index 689d8ec8..e937cf4 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_copy_move.fail.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_copy_move.fail.cpp
@@ -14,6 +14,7 @@
 
 #include <memory>
 #include <type_traits>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_pointer.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_pointer.pass.cpp
index 9ef8ed7..4c66312 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_pointer.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_pointer.pass.cpp
@@ -14,6 +14,7 @@
 
 #include <memory>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_rv.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_rv.pass.cpp
index 8637e3fc..3bba84a 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_rv.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/shared_ptr_rv.pass.cpp
@@ -16,6 +16,7 @@
 
 #include <memory>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
index 203659b..871aac6 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.const/unique_ptr.pass.cpp
@@ -16,6 +16,7 @@
 #include <new>
 #include <cstdlib>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 #include "count_new.h"
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared_construct.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared_construct.pass.cpp
index 908aa7f..1450382 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared_construct.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.create/allocate_shared_construct.pass.cpp
@@ -20,8 +20,10 @@
 
 #include "test_macros.h"
 
-#include <memory>
 #include <cassert>
+#include <memory>
+#include <new>
+#include <utility>
 
 static bool construct_called = false;
 static bool destroy_called = false;
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.assign/weak_ptr.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.assign/weak_ptr.pass.cpp
index c722dd0..cfb8a1d 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.assign/weak_ptr.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.assign/weak_ptr.pass.cpp
@@ -15,6 +15,7 @@
 #include <memory>
 #include <type_traits>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr.pass.cpp
index 179c2f5..6baa884 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weak/util.smartptr.weak.const/weak_ptr.pass.cpp
@@ -16,6 +16,7 @@
 #include <memory>
 #include <type_traits>
 #include <cassert>
+#include <utility>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weakptr/bad_weak_ptr.pass.cpp b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weakptr/bad_weak_ptr.pass.cpp
index 49a466b..c4c829a 100644
--- a/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weakptr/bad_weak_ptr.pass.cpp
+++ b/libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.weakptr/bad_weak_ptr.pass.cpp
@@ -15,6 +15,7 @@
 //     bad_weak_ptr();
 // };
 
+#include <exception>
 #include <memory>
 #include <type_traits>
 #include <cassert>
diff --git a/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/get_deleter.pass.cpp b/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/get_deleter.pass.cpp
index fc34d17..67e55bf 100644
--- a/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/get_deleter.pass.cpp
+++ b/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/get_deleter.pass.cpp
@@ -14,6 +14,8 @@
 
 #include <memory>
 #include <cassert>
+#include <type_traits>
+
 #include "test_macros.h"
 
 struct Deleter {
diff --git a/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/op_subscript.runtime.pass.cpp b/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/op_subscript.runtime.pass.cpp
index 18dfbcc..28af75a 100644
--- a/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/op_subscript.runtime.pass.cpp
+++ b/libcxx/test/std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.observers/op_subscript.runtime.pass.cpp
@@ -15,6 +15,9 @@
 #include <memory>
 #include <cassert>
 
+// TODO: Move TEST_IS_CONSTANT_EVALUATED into it's own header
+#include <type_traits>
+
 #include "test_macros.h"
 
 class A {
diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp
index 6805ad3..d6c192d 100644
--- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp
+++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp
@@ -17,6 +17,7 @@
 #include <tuple>
 #include <utility>
 #include <cassert>
+#include <memory>
 
 #include "test_macros.h"
 #include "MoveOnly.h"
diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.elem/tuple.by.type.fail.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.elem/tuple.by.type.fail.cpp
index e7a2624..4fef6b9 100644
--- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.elem/tuple.by.type.fail.cpp
+++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.elem/tuple.by.type.fail.cpp
@@ -10,6 +10,8 @@
 
 #include <tuple>
 #include <string>
+#include <memory>
+
 #include "test_macros.h"
 
 struct UserType {};
diff --git a/libcxx/test/support/allocators.h b/libcxx/test/support/allocators.h
index f4578da..0cdaacb 100644
--- a/libcxx/test/support/allocators.h
+++ b/libcxx/test/support/allocators.h
@@ -10,6 +10,7 @@
 #define ALLOCATORS_H
 
 #include <memory>
+#include <new>
 #include <type_traits>
 #include <utility>
 
diff --git a/libcxx/test/support/container_test_types.h b/libcxx/test/support/container_test_types.h
index 38fcd51..baf1b50 100644
--- a/libcxx/test/support/container_test_types.h
+++ b/libcxx/test/support/container_test_types.h
@@ -86,6 +86,7 @@
 
 #include <functional>
 #include <cassert>
+#include <new>
 
 #include "test_macros.h"
 
diff --git a/libcxx/test/support/controlled_allocators.h b/libcxx/test/support/controlled_allocators.h
index fa9f04e..1144ae4 100644
--- a/libcxx/test/support/controlled_allocators.h
+++ b/libcxx/test/support/controlled_allocators.h
@@ -16,6 +16,8 @@
 #include <cstring>
 #include <cstdint>
 #include <cassert>
+#include <new>
+
 #include "test_macros.h"
 #include "type_id.h"
 
diff --git a/libcxx/test/support/min_allocator.h b/libcxx/test/support/min_allocator.h
index a216974..529c291 100644
--- a/libcxx/test/support/min_allocator.h
+++ b/libcxx/test/support/min_allocator.h
@@ -16,6 +16,7 @@
 #include <climits>
 #include <iterator>
 #include <memory>
+#include <new>
 
 #include "test_macros.h"
 
diff --git a/libcxxabi/src/cxa_guard_impl.h b/libcxxabi/src/cxa_guard_impl.h
index 72940cc..f7e79bd 100644
--- a/libcxxabi/src/cxa_guard_impl.h
+++ b/libcxxabi/src/cxa_guard_impl.h
@@ -54,9 +54,11 @@
 #  endif
 #endif
 
+#include <__threading_support>
+#include <cstring>
 #include <limits.h>
 #include <stdlib.h>
-#include <__threading_support>
+
 #ifndef _LIBCXXABI_HAS_NO_THREADS
 #  if defined(__ELF__) && defined(_LIBCXXABI_LINK_PTHREAD_LIB)
 #    pragma comment(lib, "pthread")
diff --git a/libcxxabi/src/demangle/ItaniumDemangle.h b/libcxxabi/src/demangle/ItaniumDemangle.h
index e3f0c6d..7da8231 100644
--- a/libcxxabi/src/demangle/ItaniumDemangle.h
+++ b/libcxxabi/src/demangle/ItaniumDemangle.h
@@ -26,6 +26,7 @@
 #include <cstdlib>
 #include <cstring>
 #include <limits>
+#include <new>
 #include <utility>
 
 DEMANGLE_NAMESPACE_BEGIN