[libc++] Granularize <type_traits> includes in <compare>

Reviewed By: Mordante, #libc

Spies: libcxx-commits

Differential Revision: https://reviews.llvm.org/D140480

NOKEYCHECK=True
GitOrigin-RevId: e0a66116fcccd59d12485810f5311efafa134ea5
diff --git a/include/__algorithm/copy.h b/include/__algorithm/copy.h
index d6a46f6..ed30049 100644
--- a/include/__algorithm/copy.h
+++ b/include/__algorithm/copy.h
@@ -14,10 +14,15 @@
 #include <__config>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/reverse_iterator.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_copy_constructible.h>
+#include <__type_traits/is_same.h>
+#include <__type_traits/is_trivially_copy_assignable.h>
+#include <__type_traits/is_trivially_copyable.h>
+#include <__type_traits/remove_const.h>
 #include <__utility/move.h>
 #include <__utility/pair.h>
 #include <cstring>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__algorithm/iterator_operations.h b/include/__algorithm/iterator_operations.h
index bfe82c2..bd3e6f1 100644
--- a/include/__algorithm/iterator_operations.h
+++ b/include/__algorithm/iterator_operations.h
@@ -21,10 +21,13 @@
 #include <__iterator/next.h>
 #include <__iterator/prev.h>
 #include <__iterator/readable_traits.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/is_same.h>
+#include <__type_traits/remove_cvref.h>
 #include <__utility/declval.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__algorithm/move.h b/include/__algorithm/move.h
index e2f8b22..2109f9a 100644
--- a/include/__algorithm/move.h
+++ b/include/__algorithm/move.h
@@ -14,10 +14,14 @@
 #include <__config>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/reverse_iterator.h>
+#include <__type_traits/is_constant_evaluated.h>
+#include <__type_traits/is_copy_constructible.h>
+#include <__type_traits/is_trivially_copyable.h>
+#include <__type_traits/is_trivially_move_assignable.h>
+#include <__type_traits/remove_const.h>
 #include <__utility/move.h>
 #include <__utility/pair.h>
 #include <cstring>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__algorithm/ranges_iterator_concept.h b/include/__algorithm/ranges_iterator_concept.h
index c2a508d..3ac6b31 100644
--- a/include/__algorithm/ranges_iterator_concept.h
+++ b/include/__algorithm/ranges_iterator_concept.h
@@ -12,7 +12,7 @@
 #include <__config>
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
-#include <type_traits>
+#include <__type_traits/remove_cvref.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__algorithm/unwrap_iter.h b/include/__algorithm/unwrap_iter.h
index 07d8d23..0f661e1 100644
--- a/include/__algorithm/unwrap_iter.h
+++ b/include/__algorithm/unwrap_iter.h
@@ -12,8 +12,10 @@
 #include <__config>
 #include <__iterator/iterator_traits.h>
 #include <__memory/pointer_traits.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_copy_constructible.h>
+#include <__utility/declval.h>
 #include <__utility/move.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__bit/bit_cast.h b/include/__bit/bit_cast.h
index 8312076..2ca4120 100644
--- a/include/__bit/bit_cast.h
+++ b/include/__bit/bit_cast.h
@@ -11,7 +11,7 @@
 #define _LIBCPP___BIT_BIT_CAST_H
 
 #include <__config>
-#include <type_traits>
+#include <__type_traits/is_trivially_copyable.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__compare/compare_partial_order_fallback.h b/include/__compare/compare_partial_order_fallback.h
index ba746d6..06f03fe 100644
--- a/include/__compare/compare_partial_order_fallback.h
+++ b/include/__compare/compare_partial_order_fallback.h
@@ -12,9 +12,10 @@
 #include <__compare/ordering.h>
 #include <__compare/partial_order.h>
 #include <__config>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_same.h>
 #include <__utility/forward.h>
 #include <__utility/priority_tag.h>
-#include <type_traits>
 
 #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
 #  pragma GCC system_header
diff --git a/include/__compare/compare_strong_order_fallback.h b/include/__compare/compare_strong_order_fallback.h
index 312a08e..8693868 100644
--- a/include/__compare/compare_strong_order_fallback.h
+++ b/include/__compare/compare_strong_order_fallback.h
@@ -12,9 +12,10 @@
 #include <__compare/ordering.h>
 #include <__compare/strong_order.h>
 #include <__config>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_same.h>
 #include <__utility/forward.h>
 #include <__utility/priority_tag.h>
-#include <type_traits>
 
 #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
 #  pragma GCC system_header
diff --git a/include/__compare/compare_three_way_result.h b/include/__compare/compare_three_way_result.h
index 3047f5b..e668cdb 100644
--- a/include/__compare/compare_three_way_result.h
+++ b/include/__compare/compare_three_way_result.h
@@ -11,7 +11,7 @@
 
 #include <__config>
 #include <__type_traits/make_const_lvalue_ref.h>
-#include <type_traits>
+#include <__utility/declval.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__compare/compare_weak_order_fallback.h b/include/__compare/compare_weak_order_fallback.h
index 844d676..f434dcb 100644
--- a/include/__compare/compare_weak_order_fallback.h
+++ b/include/__compare/compare_weak_order_fallback.h
@@ -12,9 +12,10 @@
 #include <__compare/ordering.h>
 #include <__compare/weak_order.h>
 #include <__config>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_same.h>
 #include <__utility/forward.h>
 #include <__utility/priority_tag.h>
-#include <type_traits>
 
 #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
 #  pragma GCC system_header
diff --git a/include/__compare/partial_order.h b/include/__compare/partial_order.h
index 970f01b..a787bde 100644
--- a/include/__compare/partial_order.h
+++ b/include/__compare/partial_order.h
@@ -13,9 +13,10 @@
 #include <__compare/ordering.h>
 #include <__compare/weak_order.h>
 #include <__config>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_same.h>
 #include <__utility/forward.h>
 #include <__utility/priority_tag.h>
-#include <type_traits>
 
 #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
 #  pragma GCC system_header
diff --git a/include/__compare/strong_order.h b/include/__compare/strong_order.h
index 67c7b29..8686691 100644
--- a/include/__compare/strong_order.h
+++ b/include/__compare/strong_order.h
@@ -13,12 +13,13 @@
 #include <__compare/compare_three_way.h>
 #include <__compare/ordering.h>
 #include <__config>
+#include <__type_traits/conditional.h>
+#include <__type_traits/decay.h>
 #include <__utility/forward.h>
 #include <__utility/priority_tag.h>
 #include <cmath>
 #include <cstdint>
 #include <limits>
-#include <type_traits>
 
 #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
 #  pragma GCC system_header
diff --git a/include/__compare/weak_order.h b/include/__compare/weak_order.h
index c2fae1a..9d5819d 100644
--- a/include/__compare/weak_order.h
+++ b/include/__compare/weak_order.h
@@ -13,10 +13,10 @@
 #include <__compare/ordering.h>
 #include <__compare/strong_order.h>
 #include <__config>
+#include <__type_traits/decay.h>
 #include <__utility/forward.h>
 #include <__utility/priority_tag.h>
 #include <cmath>
-#include <type_traits>
 
 #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
 #  pragma GCC system_header
diff --git a/include/__functional/hash.h b/include/__functional/hash.h
index 64412fc..6a6d6e7 100644
--- a/include/__functional/hash.h
+++ b/include/__functional/hash.h
@@ -10,9 +10,15 @@
 #define _LIBCPP___FUNCTIONAL_HASH_H
 
 #include <__config>
+#include <__functional/invoke.h>
 #include <__functional/unary_function.h>
 #include <__fwd/hash.h>
 #include <__tuple_dir/sfinae_helpers.h>
+#include <__type_traits/is_copy_constructible.h>
+#include <__type_traits/is_default_constructible.h>
+#include <__type_traits/is_enum.h>
+#include <__type_traits/is_move_constructible.h>
+#include <__type_traits/underlying_type.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
 #include <__utility/pair.h>
@@ -21,7 +27,6 @@
 #include <cstdint>
 #include <cstring>
 #include <limits>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__functional/reference_wrapper.h b/include/__functional/reference_wrapper.h
index 6659825..481fe29 100644
--- a/include/__functional/reference_wrapper.h
+++ b/include/__functional/reference_wrapper.h
@@ -11,10 +11,13 @@
 #define _LIBCPP___FUNCTIONAL_REFERENCE_WRAPPER_H
 
 #include <__config>
+#include <__functional/invoke.h>
 #include <__functional/weak_result_type.h>
 #include <__memory/addressof.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/remove_cvref.h>
+#include <__utility/declval.h>
 #include <__utility/forward.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__functional/weak_result_type.h b/include/__functional/weak_result_type.h
index 96d8cf7..6bfcbbf 100644
--- a/include/__functional/weak_result_type.h
+++ b/include/__functional/weak_result_type.h
@@ -12,8 +12,11 @@
 
 #include <__config>
 #include <__functional/binary_function.h>
+#include <__functional/invoke.h>
 #include <__functional/unary_function.h>
-#include <type_traits>
+#include <__type_traits/integral_constant.h>
+#include <__type_traits/is_same.h>
+#include <__utility/declval.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/advance.h b/include/__iterator/advance.h
index cd6353e..2f6a72e 100644
--- a/include/__iterator/advance.h
+++ b/include/__iterator/advance.h
@@ -17,12 +17,14 @@
 #include <__iterator/concepts.h>
 #include <__iterator/incrementable_traits.h>
 #include <__iterator/iterator_traits.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_integral.h>
 #include <__utility/convert_to_integral.h>
+#include <__utility/declval.h>
 #include <__utility/move.h>
 #include <__utility/unreachable.h>
 #include <cstdlib>
 #include <limits>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/concepts.h b/include/__iterator/concepts.h
index 246f84c..d9d40a4 100644
--- a/include/__iterator/concepts.h
+++ b/include/__iterator/concepts.h
@@ -26,13 +26,19 @@
 #include <__concepts/semiregular.h>
 #include <__concepts/totally_ordered.h>
 #include <__config>
+#include <__functional/invoke.h>
 #include <__iterator/incrementable_traits.h>
 #include <__iterator/iter_move.h>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/readable_traits.h>
 #include <__memory/pointer_traits.h>
+#include <__type_traits/add_pointer.h>
+#include <__type_traits/common_reference.h>
+#include <__type_traits/is_pointer.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/remove_cv.h>
+#include <__type_traits/remove_cvref.h>
 #include <__utility/forward.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/distance.h b/include/__iterator/distance.h
index 32e4133..681e20d 100644
--- a/include/__iterator/distance.h
+++ b/include/__iterator/distance.h
@@ -17,7 +17,8 @@
 #include <__ranges/access.h>
 #include <__ranges/concepts.h>
 #include <__ranges/size.h>
-#include <type_traits>
+#include <__type_traits/decay.h>
+#include <__type_traits/remove_cvref.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/incrementable_traits.h b/include/__iterator/incrementable_traits.h
index 6f966ec..eb1b246 100644
--- a/include/__iterator/incrementable_traits.h
+++ b/include/__iterator/incrementable_traits.h
@@ -12,9 +12,13 @@
 
 #include <__concepts/arithmetic.h>
 #include <__config>
+#include <__type_traits/conditional.h>
+#include <__type_traits/is_object.h>
 #include <__type_traits/is_primary_template.h>
+#include <__type_traits/make_signed.h>
+#include <__type_traits/remove_cvref.h>
+#include <__utility/declval.h>
 #include <cstddef>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/iter_move.h b/include/__iterator/iter_move.h
index d8240ab..0d611bb 100644
--- a/include/__iterator/iter_move.h
+++ b/include/__iterator/iter_move.h
@@ -13,9 +13,11 @@
 #include <__concepts/class_or_enum.h>
 #include <__config>
 #include <__iterator/iterator_traits.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/remove_cvref.h>
+#include <__utility/declval.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/iter_swap.h b/include/__iterator/iter_swap.h
index 78152e2..e5e22dd 100644
--- a/include/__iterator/iter_swap.h
+++ b/include/__iterator/iter_swap.h
@@ -17,9 +17,10 @@
 #include <__iterator/iter_move.h>
 #include <__iterator/iterator_traits.h>
 #include <__iterator/readable_traits.h>
+#include <__type_traits/remove_cvref.h>
+#include <__utility/declval.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/iterator_traits.h b/include/__iterator/iterator_traits.h
index b4cf072..ebb7fdc 100644
--- a/include/__iterator/iterator_traits.h
+++ b/include/__iterator/iterator_traits.h
@@ -21,8 +21,21 @@
 #include <__fwd/pair.h>
 #include <__iterator/incrementable_traits.h>
 #include <__iterator/readable_traits.h>
+#include <__type_traits/add_const.h>
+#include <__type_traits/common_reference.h>
+#include <__type_traits/conditional.h>
+#include <__type_traits/disjunction.h>
+#include <__type_traits/is_convertible.h>
+#include <__type_traits/is_object.h>
+#include <__type_traits/is_primary_template.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/is_valid_expansion.h>
+#include <__type_traits/remove_const.h>
+#include <__type_traits/remove_cv.h>
+#include <__type_traits/remove_cvref.h>
+#include <__type_traits/void_t.h>
+#include <__utility/declval.h>
 #include <cstddef>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/next.h b/include/__iterator/next.h
index bdaaa83..49970ae 100644
--- a/include/__iterator/next.h
+++ b/include/__iterator/next.h
@@ -16,7 +16,7 @@
 #include <__iterator/concepts.h>
 #include <__iterator/incrementable_traits.h>
 #include <__iterator/iterator_traits.h>
-#include <type_traits>
+#include <__type_traits/enable_if.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/prev.h b/include/__iterator/prev.h
index 8955abc..af1e1ba 100644
--- a/include/__iterator/prev.h
+++ b/include/__iterator/prev.h
@@ -16,7 +16,7 @@
 #include <__iterator/concepts.h>
 #include <__iterator/incrementable_traits.h>
 #include <__iterator/iterator_traits.h>
-#include <type_traits>
+#include <__type_traits/enable_if.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/readable_traits.h b/include/__iterator/readable_traits.h
index dc818d8..8f17757 100644
--- a/include/__iterator/readable_traits.h
+++ b/include/__iterator/readable_traits.h
@@ -12,7 +12,13 @@
 
 #include <__concepts/same_as.h>
 #include <__config>
-#include <type_traits>
+#include <__type_traits/conditional.h>
+#include <__type_traits/is_array.h>
+#include <__type_traits/is_object.h>
+#include <__type_traits/is_primary_template.h>
+#include <__type_traits/remove_cv.h>
+#include <__type_traits/remove_cvref.h>
+#include <__type_traits/remove_extent.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__iterator/reverse_iterator.h b/include/__iterator/reverse_iterator.h
index 2933a29..299b971 100644
--- a/include/__iterator/reverse_iterator.h
+++ b/include/__iterator/reverse_iterator.h
@@ -29,8 +29,15 @@
 #include <__ranges/access.h>
 #include <__ranges/concepts.h>
 #include <__ranges/subrange.h>
+#include <__type_traits/conditional.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_assignable.h>
+#include <__type_traits/is_convertible.h>
+#include <__type_traits/is_nothrow_copy_constructible.h>
+#include <__type_traits/is_pointer.h>
+#include <__type_traits/is_same.h>
+#include <__utility/declval.h>
 #include <__utility/move.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/allocator.h b/include/__memory/allocator.h
index 7a93095..54c9b78 100644
--- a/include/__memory/allocator.h
+++ b/include/__memory/allocator.h
@@ -13,11 +13,14 @@
 #include <__config>
 #include <__memory/allocate_at_least.h>
 #include <__memory/allocator_traits.h>
+#include <__type_traits/is_constant_evaluated.h>
+#include <__type_traits/is_same.h>
+#include <__type_traits/is_void.h>
+#include <__type_traits/is_volatile.h>
 #include <__utility/forward.h>
 #include <cstddef>
 #include <new>
 #include <stdexcept>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/allocator_arg_t.h b/include/__memory/allocator_arg_t.h
index 44df046..15f8c98 100644
--- a/include/__memory/allocator_arg_t.h
+++ b/include/__memory/allocator_arg_t.h
@@ -12,8 +12,10 @@
 
 #include <__config>
 #include <__memory/uses_allocator.h>
+#include <__type_traits/integral_constant.h>
+#include <__type_traits/is_constructible.h>
+#include <__type_traits/remove_cvref.h>
 #include <__utility/forward.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/allocator_traits.h b/include/__memory/allocator_traits.h
index 6acc14a..348d16c 100644
--- a/include/__memory/allocator_traits.h
+++ b/include/__memory/allocator_traits.h
@@ -13,9 +13,16 @@
 #include <__config>
 #include <__memory/construct_at.h>
 #include <__memory/pointer_traits.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_copy_constructible.h>
+#include <__type_traits/is_empty.h>
+#include <__type_traits/is_move_constructible.h>
+#include <__type_traits/make_unsigned.h>
+#include <__type_traits/remove_reference.h>
+#include <__type_traits/void_t.h>
+#include <__utility/declval.h>
 #include <__utility/forward.h>
 #include <limits>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/assume_aligned.h b/include/__memory/assume_aligned.h
index 0f12fb1..a1fd244 100644
--- a/include/__memory/assume_aligned.h
+++ b/include/__memory/assume_aligned.h
@@ -12,9 +12,9 @@
 
 #include <__assert>
 #include <__config>
+#include <__type_traits/is_constant_evaluated.h>
 #include <cstddef>
 #include <cstdint>
-#include <type_traits> // for is_constant_evaluated()
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/compressed_pair.h b/include/__memory/compressed_pair.h
index 6f747e7..8093d7c 100644
--- a/include/__memory/compressed_pair.h
+++ b/include/__memory/compressed_pair.h
@@ -14,11 +14,18 @@
 #include <__fwd/get.h>
 #include <__fwd/tuple.h>
 #include <__tuple_dir/tuple_indices.h>
+#include <__type_traits/decay.h>
 #include <__type_traits/dependent_type.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_default_constructible.h>
+#include <__type_traits/is_empty.h>
+#include <__type_traits/is_final.h>
+#include <__type_traits/is_same.h>
+#include <__type_traits/is_swappable.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
 #include <__utility/piecewise_construct.h>
-#include <type_traits>
+#include <cstddef>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/concepts.h b/include/__memory/concepts.h
index 76d2a2e..12d7bf8 100644
--- a/include/__memory/concepts.h
+++ b/include/__memory/concepts.h
@@ -17,7 +17,8 @@
 #include <__iterator/readable_traits.h>
 #include <__ranges/access.h>
 #include <__ranges/concepts.h>
-#include <type_traits>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/remove_cvref.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/construct_at.h b/include/__memory/construct_at.h
index a11a6eb..7f13b26 100644
--- a/include/__memory/construct_at.h
+++ b/include/__memory/construct_at.h
@@ -15,10 +15,12 @@
 #include <__iterator/access.h>
 #include <__memory/addressof.h>
 #include <__memory/voidify.h>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_array.h>
+#include <__utility/declval.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
 #include <new>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/pointer_traits.h b/include/__memory/pointer_traits.h
index fd52647..67f83f8 100644
--- a/include/__memory/pointer_traits.h
+++ b/include/__memory/pointer_traits.h
@@ -12,8 +12,15 @@
 
 #include <__config>
 #include <__memory/addressof.h>
+#include <__type_traits/conditional.h>
+#include <__type_traits/conjunction.h>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_class.h>
+#include <__type_traits/is_function.h>
+#include <__type_traits/is_void.h>
+#include <__type_traits/void_t.h>
+#include <__utility/declval.h>
 #include <cstddef>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/ranges_uninitialized_algorithms.h b/include/__memory/ranges_uninitialized_algorithms.h
index 7d2ac3a..07abdc9 100644
--- a/include/__memory/ranges_uninitialized_algorithms.h
+++ b/include/__memory/ranges_uninitialized_algorithms.h
@@ -23,9 +23,9 @@
 #include <__ranges/access.h>
 #include <__ranges/concepts.h>
 #include <__ranges/dangling.h>
+#include <__type_traits/remove_reference.h>
 #include <__utility/move.h>
 #include <new>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/shared_ptr.h b/include/__memory/shared_ptr.h
index 57051df..f8b9ee2 100644
--- a/include/__memory/shared_ptr.h
+++ b/include/__memory/shared_ptr.h
@@ -37,7 +37,6 @@
 #include <iosfwd>
 #include <new>
 #include <stdexcept>
-#include <type_traits>
 #include <typeinfo>
 #if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
 #  include <atomic>
diff --git a/include/__memory/uninitialized_algorithms.h b/include/__memory/uninitialized_algorithms.h
index 22f96d4..213428b 100644
--- a/include/__memory/uninitialized_algorithms.h
+++ b/include/__memory/uninitialized_algorithms.h
@@ -20,12 +20,21 @@
 #include <__memory/construct_at.h>
 #include <__memory/pointer_traits.h>
 #include <__memory/voidify.h>
+#include <__type_traits/extent.h>
+#include <__type_traits/is_array.h>
 #include <__type_traits/is_constant_evaluated.h>
+#include <__type_traits/is_trivially_copy_assignable.h>
+#include <__type_traits/is_trivially_copy_constructible.h>
+#include <__type_traits/is_trivially_move_assignable.h>
+#include <__type_traits/is_trivially_move_constructible.h>
+#include <__type_traits/is_unbounded_array.h>
+#include <__type_traits/negation.h>
+#include <__type_traits/remove_const.h>
+#include <__type_traits/remove_extent.h>
 #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)
 #  pragma GCC system_header
diff --git a/include/__memory/unique_ptr.h b/include/__memory/unique_ptr.h
index 9fed619..bb5399d 100644
--- a/include/__memory/unique_ptr.h
+++ b/include/__memory/unique_ptr.h
@@ -19,10 +19,26 @@
 #include <__memory/allocator_traits.h> // __pointer
 #include <__memory/auto_ptr.h>
 #include <__memory/compressed_pair.h>
+#include <__type_traits/add_lvalue_reference.h>
+#include <__type_traits/common_type.h>
+#include <__type_traits/dependent_type.h>
+#include <__type_traits/integral_constant.h>
+#include <__type_traits/is_array.h>
+#include <__type_traits/is_assignable.h>
+#include <__type_traits/is_constructible.h>
+#include <__type_traits/is_convertible.h>
+#include <__type_traits/is_default_constructible.h>
+#include <__type_traits/is_function.h>
+#include <__type_traits/is_pointer.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/is_same.h>
+#include <__type_traits/is_swappable.h>
+#include <__type_traits/is_void.h>
+#include <__type_traits/remove_extent.h>
+#include <__type_traits/type_identity.h>
 #include <__utility/forward.h>
 #include <__utility/move.h>
 #include <cstddef>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__memory/uses_allocator.h b/include/__memory/uses_allocator.h
index 4a07a4a..fe89704 100644
--- a/include/__memory/uses_allocator.h
+++ b/include/__memory/uses_allocator.h
@@ -11,8 +11,8 @@
 #define _LIBCPP___MEMORY_USES_ALLOCATOR_H
 
 #include <__config>
+#include <__type_traits/is_convertible.h>
 #include <cstddef>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/access.h b/include/__ranges/access.h
index 87392a1..29babf3 100644
--- a/include/__ranges/access.h
+++ b/include/__ranges/access.h
@@ -15,8 +15,13 @@
 #include <__iterator/concepts.h>
 #include <__iterator/readable_traits.h>
 #include <__ranges/enable_borrowed_range.h>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/remove_cvref.h>
+#include <__type_traits/remove_reference.h>
 #include <__utility/auto_cast.h>
-#include <type_traits>
+#include <__utility/declval.h>
+#include <cstddef>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/concepts.h b/include/__ranges/concepts.h
index 739e141..730b83c 100644
--- a/include/__ranges/concepts.h
+++ b/include/__ranges/concepts.h
@@ -24,8 +24,12 @@
 #include <__ranges/enable_borrowed_range.h>
 #include <__ranges/enable_view.h>
 #include <__ranges/size.h>
+#include <__type_traits/add_pointer.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/remove_cvref.h>
+#include <__type_traits/remove_reference.h>
+#include <__utility/declval.h>
 #include <initializer_list>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/dangling.h b/include/__ranges/dangling.h
index 525b5ff..c104534 100644
--- a/include/__ranges/dangling.h
+++ b/include/__ranges/dangling.h
@@ -13,7 +13,7 @@
 #include <__config>
 #include <__ranges/access.h>
 #include <__ranges/concepts.h>
-#include <type_traits>
+#include <__type_traits/conditional.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/data.h b/include/__ranges/data.h
index cadbfc8..0ac25b5 100644
--- a/include/__ranges/data.h
+++ b/include/__ranges/data.h
@@ -16,8 +16,13 @@
 #include <__iterator/iterator_traits.h>
 #include <__memory/pointer_traits.h>
 #include <__ranges/access.h>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_object.h>
+#include <__type_traits/is_pointer.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/remove_pointer.h>
+#include <__type_traits/remove_reference.h>
 #include <__utility/auto_cast.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/empty.h b/include/__ranges/empty.h
index 2370f13..8a1c75c 100644
--- a/include/__ranges/empty.h
+++ b/include/__ranges/empty.h
@@ -15,7 +15,6 @@
 #include <__iterator/concepts.h>
 #include <__ranges/access.h>
 #include <__ranges/size.h>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/enable_view.h b/include/__ranges/enable_view.h
index 2dc4752..c85064b 100644
--- a/include/__ranges/enable_view.h
+++ b/include/__ranges/enable_view.h
@@ -13,7 +13,9 @@
 #include <__concepts/derived_from.h>
 #include <__concepts/same_as.h>
 #include <__config>
-#include <type_traits>
+#include <__type_traits/is_class.h>
+#include <__type_traits/is_convertible.h>
+#include <__type_traits/remove_cv.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/size.h b/include/__ranges/size.h
index 720e3d4..4068a21 100644
--- a/include/__ranges/size.h
+++ b/include/__ranges/size.h
@@ -16,9 +16,12 @@
 #include <__iterator/concepts.h>
 #include <__iterator/iterator_traits.h>
 #include <__ranges/access.h>
+#include <__type_traits/decay.h>
+#include <__type_traits/make_signed.h>
+#include <__type_traits/make_unsigned.h>
+#include <__type_traits/remove_cvref.h>
 #include <__utility/auto_cast.h>
 #include <cstddef>
-#include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/subrange.h b/include/__ranges/subrange.h
index 55689fe..f47db6b 100644
--- a/include/__ranges/subrange.h
+++ b/include/__ranges/subrange.h
@@ -30,8 +30,15 @@
 #include <__ranges/view_interface.h>
 #include <__tuple_dir/tuple_element.h>
 #include <__tuple_dir/tuple_size.h>
+#include <__type_traits/conditional.h>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_pointer.h>
+#include <__type_traits/is_reference.h>
+#include <__type_traits/make_unsigned.h>
+#include <__type_traits/remove_const.h>
+#include <__type_traits/remove_pointer.h>
 #include <__utility/move.h>
-#include <type_traits>
+#include <cstddef>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__ranges/view_interface.h b/include/__ranges/view_interface.h
index b706c8d..5581eb9 100644
--- a/include/__ranges/view_interface.h
+++ b/include/__ranges/view_interface.h
@@ -21,7 +21,9 @@
 #include <__ranges/access.h>
 #include <__ranges/concepts.h>
 #include <__ranges/empty.h>
-#include <type_traits>
+#include <__type_traits/is_class.h>
+#include <__type_traits/make_unsigned.h>
+#include <__type_traits/remove_cv.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/__type_traits/is_trivially_destructible.h b/include/__type_traits/is_trivially_destructible.h
index 6639e29..0239fca 100644
--- a/include/__type_traits/is_trivially_destructible.h
+++ b/include/__type_traits/is_trivially_destructible.h
@@ -11,6 +11,7 @@
 
 #include <__config>
 #include <__type_traits/integral_constant.h>
+#include <__type_traits/is_destructible.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
diff --git a/include/cmath b/include/cmath
index ed88fe8..fd242e1 100644
--- a/include/cmath
+++ b/include/cmath
@@ -306,7 +306,11 @@
 
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__config>
-#include <type_traits>
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_arithmetic.h>
+#include <__type_traits/is_floating_point.h>
+#include <__type_traits/is_same.h>
+#include <__type_traits/remove_cv.h>
 #include <version>
 
 #include <math.h>
@@ -669,4 +673,8 @@
 
 _LIBCPP_POP_MACROS
 
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <type_traits>
+#endif
+
 #endif // _LIBCPP_CMATH
diff --git a/include/compare b/include/compare
index 6aa1abe..9272dbf 100644
--- a/include/compare
+++ b/include/compare
@@ -160,4 +160,8 @@
 #  pragma GCC system_header
 #endif
 
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <type_traits>
+#endif
+
 #endif // _LIBCPP_COMPARE
diff --git a/include/condition_variable b/include/condition_variable
index 6b4d506..f13df1c 100644
--- a/include/condition_variable
+++ b/include/condition_variable
@@ -270,6 +270,7 @@
 
 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
 #  include <concepts>
+#  include <type_traits>
 #endif
 
 #endif // _LIBCPP_CONDITION_VARIABLE
diff --git a/include/exception b/include/exception
index 98b355f..e0f4268 100644
--- a/include/exception
+++ b/include/exception
@@ -80,9 +80,15 @@
 #include <__availability>
 #include <__config>
 #include <__memory/addressof.h>
+#include <__type_traits/decay.h>
+#include <__type_traits/is_base_of.h>
+#include <__type_traits/is_class.h>
+#include <__type_traits/is_convertible.h>
+#include <__type_traits/is_copy_constructible.h>
+#include <__type_traits/is_final.h>
+#include <__type_traits/is_polymorphic.h>
 #include <cstddef>
 #include <cstdlib>
-#include <type_traits>
 #include <version>
 
 // <vcruntime_exception.h> defines its own std::exception and std::bad_exception types,
@@ -371,4 +377,8 @@
 
 } // namespace std
 
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <type_traits>
+#endif
+
 #endif // _LIBCPP_EXCEPTION
diff --git a/include/istream b/include/istream
index 1c9adcc..37ba09b 100644
--- a/include/istream
+++ b/include/istream
@@ -1639,6 +1639,7 @@
 
 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
 #  include <concepts>
+#  include <type_traits>
 #endif
 
 _LIBCPP_POP_MACROS
diff --git a/include/math.h b/include/math.h
index ac55983..dd68830 100644
--- a/include/math.h
+++ b/include/math.h
@@ -307,10 +307,13 @@
 // back to C++ linkage before including these C++ headers.
 extern "C++" {
 
+#include <__type_traits/enable_if.h>
+#include <__type_traits/is_floating_point.h>
+#include <__type_traits/is_integral.h>
+#include <__type_traits/is_same.h>
 #include <__type_traits/promote.h>
 #include <limits>
 #include <stdlib.h>
-#include <type_traits>
 
 
 #    ifdef fpclassify
diff --git a/include/module.modulemap.in b/include/module.modulemap.in
index 467f758..bff3f7e 100644
--- a/include/module.modulemap.in
+++ b/include/module.modulemap.in
@@ -1391,7 +1391,10 @@
       private header "__type_traits/is_arithmetic.h"
       export integral_constant
     }
-    module is_array                            { private header "__type_traits/is_array.h" }
+    module is_array                            {
+      private header "__type_traits/is_array.h"
+      export integral_constant
+    }
     module is_assignable                       { private header "__type_traits/is_assignable.h" }
     module is_base_of                          { private header "__type_traits/is_base_of.h" }
     module is_bounded_array                    { private header "__type_traits/is_bounded_array.h" }
diff --git a/include/mutex b/include/mutex
index d11ffb2..51c1a23 100644
--- a/include/mutex
+++ b/include/mutex
@@ -706,6 +706,7 @@
 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
 #  include <concepts>
 #  include <functional>
+#  include <type_traits>
 #endif
 
 #endif // _LIBCPP_MUTEX
diff --git a/include/new b/include/new
index 892ab7a..ddba2d9 100644
--- a/include/new
+++ b/include/new
@@ -89,10 +89,12 @@
 #include <__assert> // all public C++ headers provide the assertion handler
 #include <__availability>
 #include <__config>
+#include <__type_traits/is_function.h>
+#include <__type_traits/is_same.h>
+#include <__type_traits/remove_cv.h>
 #include <cstddef>
 #include <cstdlib>
 #include <exception>
-#include <type_traits>
 #include <version>
 
 #if defined(_LIBCPP_ABI_VCRUNTIME)
@@ -401,4 +403,8 @@
 
 _LIBCPP_END_NAMESPACE_STD
 
+#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
+#  include <type_traits>
+#endif
+
 #endif // _LIBCPP_NEW
diff --git a/include/ostream b/include/ostream
index 1d943d8..5e2099b 100644
--- a/include/ostream
+++ b/include/ostream
@@ -1191,6 +1191,7 @@
 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
 #  include <concepts>
 #  include <iterator>
+#  include <type_traits>
 #endif
 
 #endif // _LIBCPP_OSTREAM
diff --git a/include/scoped_allocator b/include/scoped_allocator
index f89db7b..d450f4f 100644
--- a/include/scoped_allocator
+++ b/include/scoped_allocator
@@ -725,6 +725,7 @@
 #  include <memory>
 #  include <ratio>
 #  include <stdexcept>
+#  include <type_traits>
 #  include <variant>
 #endif
 
diff --git a/include/valarray b/include/valarray
index 6c33d05..11a273d 100644
--- a/include/valarray
+++ b/include/valarray
@@ -353,6 +353,7 @@
 #include <__functional/operations.h>
 #include <__memory/allocator.h>
 #include <__memory/uninitialized_algorithms.h>
+#include <__type_traits/remove_reference.h>
 #include <__utility/move.h>
 #include <__utility/swap.h>
 #include <cmath>