blob: 681c2fd65d5e93dc356a38de5ee4ecd8d07f4e60 [file] [log] [blame]
commit de4a57cb21a19179d7be830967e642b868a05a91
Author: Louis Dionne <ldionne.2@gmail.com>
Date: Mon Jun 27 15:53:41 2022 -0400
[libc++] Re-add transitive includes that had been removed since LLVM 14
This commit re-adds transitive includes that had been removed by
4cd04d1687f1, c36870c8e79c, a83f4b9cda57, 1458458b558d, 2e2f3158c604,
and 489637e66dd3. This should cover almost all the includes that had
been removed since LLVM 14 and that would contribute to breaking user
code when releasing LLVM 15.
It is possible to disable the inclusion of these headers by defining
_LIBCPP_REMOVE_TRANSITIVE_INCLUDES. The intent is that vendors will
enable that macro and start fixing downstream issues immediately. We
can then remove the macro (and the transitive includes) by default in
a future release. That way, we will break users only once by removing
transitive includes in bulk instead of doing it bit by bit a every
release, which is more disruptive for users.
Note 1: The set of headers to re-add was found by re-generating the
transitive include test on a checkout of release/14.x, which
provided the list of all transitive includes we used to provide.
Note 2: Several includes of <vector>, <optional>, <array> and <unordered_map>
have been added in this commit. These transitive inclusions were
added when we implemented boyer_moore_searcher in <functional>.
Note 3: This is a best effort patch to try and resolve downstream breakage
caused since branching LLVM 14. I wasn't able to perfectly mirror
transitive includes in LLVM 14 for a few headers, so I added a
release note explaining it. To summarize, adding boyer_moore_searcher
created a bunch of circular dependencies, so we have to break
backwards compatibility in a few cases.
Differential Revision: https://reviews.llvm.org/D128661
diff --git a/libcxx/cmake/caches/Generic-no-transitive-includes.cmake b/libcxx/cmake/caches/Generic-no-transitive-includes.cmake
new file mode 100644
index 000000000000..31e807366e16
--- /dev/null
+++ b/libcxx/cmake/caches/Generic-no-transitive-includes.cmake
@@ -0,0 +1,2 @@
+set(LIBCXX_TEST_PARAMS "enable_transitive_includes=False" CACHE STRING "")
+set(LIBCXXABI_TEST_PARAMS "${LIBCXX_TEST_PARAMS}" CACHE STRING "")
diff --git a/libcxx/docs/ReleaseNotes.rst b/libcxx/docs/ReleaseNotes.rst
index c7f9cb3c270f..dfc849c771fa 100644
--- a/libcxx/docs/ReleaseNotes.rst
+++ b/libcxx/docs/ReleaseNotes.rst
@@ -97,19 +97,15 @@ API Changes
``<filesystem>`` header. The associated macro
``_LIBCPP_DEPRECATED_EXPERIMENTAL_FILESYSTEM`` has also been removed.
-- Some libc++ headers no longer transitively include all of:
- - ``<algorithm>``
- - ``<chrono>``
- - ``<exception>``
- - ``<functional>``
- - ``<iterator>``
- - ``<new>``
- - ``<typeinfo>``
- - ``<utility>``
-
- If, after updating libc++, you see compiler errors related to missing declarations
- in namespace ``std``, it might be because one of your source files now needs to
- include one or more of the headers listed above.
+- Libc++ is getting ready to remove unnecessary transitive inclusions. This may
+ break your code in the future. To future-proof your code to these removals,
+ please compile your code with ``_LIBCPP_REMOVE_TRANSITIVE_INCLUDES`` defined
+ and fix any compilation error resulting from missing includes.
+
+- The ``<algorithm>``, ``<array>``, ``<optional>``, ``<unordered_map>`` and ``<vector>``
+ headers no longer transitively include the ``<functional>`` header. If you see compiler
+ errors related to missing declarations in namespace ``std``, make sure you have the
+ necessary includes.
- The integer distributions ``binomial_distribution``, ``discrete_distribution``,
``geometric_distribution``, ``negative_binomial_distribution``, ``poisson_distribution``,
diff --git a/libcxx/include/algorithm b/libcxx/include/algorithm
index cb1cb1dc6b43..9ae647181c5f 100644
--- a/libcxx/include/algorithm
+++ b/libcxx/include/algorithm
@@ -1260,6 +1260,12 @@ template <class BidirectionalIterator, class Compare>
#include <__algorithm/unwrap_iter.h>
#include <__algorithm/upper_bound.h>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <chrono>
+# include <iterator>
+# include <utility>
+#endif
+
// standard-mandated includes
#include <initializer_list>
diff --git a/libcxx/include/any b/libcxx/include/any
index 991d887bf29a..7e12034b45a7 100644
--- a/libcxx/include/any
+++ b/libcxx/include/any
@@ -94,6 +94,10 @@ namespace std {
#include <typeinfo>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <chrono>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/array b/libcxx/include/array
index ab919309b966..e96c3d813339 100644
--- a/libcxx/include/array
+++ b/libcxx/include/array
@@ -123,6 +123,12 @@ template <size_t I, class T, size_t N> const T&& get(const array<T, N>&&) noexce
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <iterator>
+# include <utility>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/atomic b/libcxx/include/atomic
index 3ccc8bc94436..0c6d3079c96a 100644
--- a/libcxx/include/atomic
+++ b/libcxx/include/atomic
@@ -534,6 +534,10 @@ template <class T>
# include <__threading_support>
#endif
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <chrono>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/bit b/libcxx/include/bit
index f634372836b3..fe1bcadc818a 100644
--- a/libcxx/include/bit
+++ b/libcxx/include/bit
@@ -71,6 +71,10 @@ namespace std {
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iosfwd>
+#endif
+
#if defined(__IBMCPP__)
# include "__support/ibm/support.h"
#endif
diff --git a/libcxx/include/charconv b/libcxx/include/charconv
index 80aa44d28e81..6a63e5fe9057 100644
--- a/libcxx/include/charconv
+++ b/libcxx/include/charconv
@@ -96,6 +96,10 @@ namespace std {
#include <limits>
#include <type_traits>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iosfwd>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/coroutine b/libcxx/include/coroutine
index a96c4a7a5af8..6582f5554ed0 100644
--- a/libcxx/include/coroutine
+++ b/libcxx/include/coroutine
@@ -46,6 +46,10 @@ struct suspend_always;
#include <__coroutine/trivial_awaitables.h>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iosfwd>
+#endif
+
// standard-mandated includes
#include <compare>
diff --git a/libcxx/include/deque b/libcxx/include/deque
index 27cd7b213e81..d8f48f07954c 100644
--- a/libcxx/include/deque
+++ b/libcxx/include/deque
@@ -185,6 +185,12 @@ template <class T, class Allocator, class Predicate>
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <functional>
+# include <iterator>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/experimental/simd b/libcxx/include/experimental/simd
index 02a7a490a160..9b55cc009986 100644
--- a/libcxx/include/experimental/simd
+++ b/libcxx/include/experimental/simd
@@ -656,6 +656,11 @@ public:
#include <experimental/__config>
#include <tuple>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <functional>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/experimental/unordered_map b/libcxx/include/experimental/unordered_map
index 71ce4408c49f..636d31bdc557 100644
--- a/libcxx/include/experimental/unordered_map
+++ b/libcxx/include/experimental/unordered_map
@@ -45,6 +45,14 @@ namespace pmr {
#include <experimental/memory_resource>
#include <unordered_map>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <array>
+# include <bit>
+# include <functional>
+# include <vector>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/ext/hash_map b/libcxx/include/ext/hash_map
index 92572c08c24c..8afe12f6319b 100644
--- a/libcxx/include/ext/hash_map
+++ b/libcxx/include/ext/hash_map
@@ -210,6 +210,10 @@ template <class Key, class T, class Hash, class Pred, class Alloc>
#include <stdexcept>
#include <type_traits>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iterator>
+#endif
+
#if defined(__DEPRECATED) && __DEPRECATED
#if defined(_LIBCPP_WARNING)
_LIBCPP_WARNING("Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>")
diff --git a/libcxx/include/ext/hash_set b/libcxx/include/ext/hash_set
index eb6193940668..433c13f80bb2 100644
--- a/libcxx/include/ext/hash_set
+++ b/libcxx/include/ext/hash_set
@@ -199,6 +199,10 @@ template <class Value, class Hash, class Pred, class Alloc>
#include <ext/__hash>
#include <functional>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iterator>
+#endif
+
#if defined(__DEPRECATED) && __DEPRECATED
#if defined(_LIBCPP_WARNING)
_LIBCPP_WARNING("Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>")
diff --git a/libcxx/include/forward_list b/libcxx/include/forward_list
index 4600d82ecdd8..6a7272027351 100644
--- a/libcxx/include/forward_list
+++ b/libcxx/include/forward_list
@@ -194,6 +194,12 @@ template <class T, class Allocator, class Predicate>
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <functional>
+# include <iterator>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/functional b/libcxx/include/functional
index dd39e274a56b..ca17dd4ed3de 100644
--- a/libcxx/include/functional
+++ b/libcxx/include/functional
@@ -529,6 +529,10 @@ POLICY: For non-variadic implementations, the number of arguments is limited
#include <typeinfo>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <utility>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/future b/libcxx/include/future
index 4f49bf158bac..f4a5b43eef08 100644
--- a/libcxx/include/future
+++ b/libcxx/include/future
@@ -378,6 +378,10 @@ template <class R, class Alloc> struct uses_allocator<packaged_task<R>, Alloc>;
#include <thread>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <chrono>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/iterator b/libcxx/include/iterator
index dfa1d35e0d90..d2f5ac2c0e93 100644
--- a/libcxx/include/iterator
+++ b/libcxx/include/iterator
@@ -724,6 +724,13 @@ template <class E> constexpr const E* data(initializer_list<E> il) noexcept;
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <exception>
+# include <new>
+# include <typeinfo>
+# include <utility>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/list b/libcxx/include/list
index 7ae1bc897ce0..d75b15c060be 100644
--- a/libcxx/include/list
+++ b/libcxx/include/list
@@ -202,6 +202,12 @@ template <class T, class Allocator, class Predicate>
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <functional>
+# include <iterator>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/locale b/libcxx/include/locale
index 8ac2aacb6edf..7f6f1e509745 100644
--- a/libcxx/include/locale
+++ b/libcxx/include/locale
@@ -211,6 +211,10 @@ template <class charT> class messages_byname;
#include <streambuf>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iterator>
+#endif
+
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
// Most unix variants have catopen. These are the specific ones that don't.
# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION) && !defined(__EMSCRIPTEN__)
diff --git a/libcxx/include/map b/libcxx/include/map
index b253d0ffc848..106ed5259ed9 100644
--- a/libcxx/include/map
+++ b/libcxx/include/map
@@ -546,6 +546,12 @@ erase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <functional>
+# include <iterator>
+# include <utility>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/memory b/libcxx/include/memory
index aafe4bf4ba00..299746022274 100644
--- a/libcxx/include/memory
+++ b/libcxx/include/memory
@@ -871,6 +871,11 @@ template<size_t N, class T>
#include <typeinfo>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iterator>
+# include <utility>
+#endif
+
// standard-mandated includes
#include <compare>
diff --git a/libcxx/include/mutex b/libcxx/include/mutex
index ded33514f79d..5dfaad2b3510 100644
--- a/libcxx/include/mutex
+++ b/libcxx/include/mutex
@@ -198,6 +198,10 @@ template<class Callable, class ...Args>
#endif
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <functional>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/numeric b/libcxx/include/numeric
index 809838b21071..057faf508e6b 100644
--- a/libcxx/include/numeric
+++ b/libcxx/include/numeric
@@ -163,6 +163,11 @@ template<class T>
#include <__numeric/transform_inclusive_scan.h>
#include <__numeric/transform_reduce.h>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <functional>
+# include <iterator>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/optional b/libcxx/include/optional
index 73e902dc84be..349ceb5bc7f6 100644
--- a/libcxx/include/optional
+++ b/libcxx/include/optional
@@ -177,6 +177,21 @@ template<class T>
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <atomic>
+# include <chrono>
+# include <climits>
+# include <concepts>
+# include <ctime>
+# include <iterator>
+# include <memory>
+# include <ratio>
+# include <tuple>
+# include <typeinfo>
+# include <utility>
+# include <variant>
+#endif
+
// standard-mandated includes
#include <compare>
diff --git a/libcxx/include/ostream b/libcxx/include/ostream
index aa4c8c3d8792..283774585b92 100644
--- a/libcxx/include/ostream
+++ b/libcxx/include/ostream
@@ -142,6 +142,10 @@ template <class Stream, class T>
#include <streambuf>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iterator>
+#endif
+
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
# pragma GCC system_header
#endif
diff --git a/libcxx/include/queue b/libcxx/include/queue
index a6e8a52e19b5..9a5cfb39f24e 100644
--- a/libcxx/include/queue
+++ b/libcxx/include/queue
@@ -231,6 +231,10 @@ template <class T, class Container, class Compare>
#include <vector>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <functional>
+#endif
+
// standard-mandated includes
#include <compare>
#include <initializer_list>
diff --git a/libcxx/include/random b/libcxx/include/random
index b0817dd3a7cc..41ee4d85fda3 100644
--- a/libcxx/include/random
+++ b/libcxx/include/random
@@ -1718,6 +1718,10 @@ class piecewise_linear_distribution
#include <__random/weibull_distribution.h>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+#endif
+
// standard-mandated includes
#include <initializer_list>
diff --git a/libcxx/include/regex b/libcxx/include/regex
index a0a6561ef030..a117c50f3984 100644
--- a/libcxx/include/regex
+++ b/libcxx/include/regex
@@ -778,6 +778,11 @@ typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
#include <vector>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iterator>
+# include <utility>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/set b/libcxx/include/set
index 3c062a123125..da62f6f5ca5b 100644
--- a/libcxx/include/set
+++ b/libcxx/include/set
@@ -485,6 +485,11 @@ erase_if(multiset<Key, Compare, Allocator>& c, Predicate pred); // C++20
#include <__utility/forward.h>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <functional>
+# include <iterator>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/span b/libcxx/include/span
index 84b23ce60287..00793a210cbe 100644
--- a/libcxx/include/span
+++ b/libcxx/include/span
@@ -148,6 +148,11 @@ template<class R>
#include <type_traits> // for remove_cv, etc
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <functional>
+# include <iterator>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/stack b/libcxx/include/stack
index 59878c1d84df..86435c4559de 100644
--- a/libcxx/include/stack
+++ b/libcxx/include/stack
@@ -107,6 +107,10 @@ template <class T, class Container>
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <functional>
+#endif
+
// standard-mandated includes
#include <compare>
#include <initializer_list>
diff --git a/libcxx/include/string b/libcxx/include/string
index 0ce8c4fecebd..bb169a82c9e7 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -555,6 +555,16 @@ basic_string<char32_t> operator "" s( const char32_t *str, size_t len );
# include <cwchar>
#endif
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <functional>
+# include <iterator>
+# include <new>
+# include <typeinfo>
+# include <utility>
+# include <vector>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/string_view b/libcxx/include/string_view
index 8088f66bcdc5..28013e7cb08e 100644
--- a/libcxx/include/string_view
+++ b/libcxx/include/string_view
@@ -218,6 +218,12 @@ namespace std {
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <functional>
+# include <iterator>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/thread b/libcxx/include/thread
index 06b4824d4c6f..1c8eb198986d 100644
--- a/libcxx/include/thread
+++ b/libcxx/include/thread
@@ -98,6 +98,11 @@ void sleep_for(const chrono::duration<Rep, Period>& rel_time);
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <chrono>
+# include <functional>
+#endif
+
// standard-mandated includes
#include <compare>
diff --git a/libcxx/include/tuple b/libcxx/include/tuple
index d36b9902526b..221eb23dd3f8 100644
--- a/libcxx/include/tuple
+++ b/libcxx/include/tuple
@@ -219,6 +219,14 @@ template <class... Types>
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <exception>
+# include <iosfwd>
+# include <new>
+# include <typeinfo>
+# include <utility>
+#endif
+
// standard-mandated includes
#include <compare>
diff --git a/libcxx/include/typeindex b/libcxx/include/typeindex
index fb61cfc81769..5fb7b30ecfee 100644
--- a/libcxx/include/typeindex
+++ b/libcxx/include/typeindex
@@ -50,6 +50,12 @@ struct hash<type_index>
#include <typeinfo>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iosfwd>
+# include <new>
+# include <utility>
+#endif
+
// standard-mandated includes
#include <compare>
diff --git a/libcxx/include/unordered_map b/libcxx/include/unordered_map
index 12b4e5af63f5..72749e11e843 100644
--- a/libcxx/include/unordered_map
+++ b/libcxx/include/unordered_map
@@ -531,6 +531,12 @@ template <class Key, class T, class Hash, class Pred, class Alloc>
#include <tuple>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <bit>
+# include <iterator>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/unordered_set b/libcxx/include/unordered_set
index 3fc686c8d354..97aa935f187c 100644
--- a/libcxx/include/unordered_set
+++ b/libcxx/include/unordered_set
@@ -474,6 +474,11 @@ template <class Value, class Hash, class Pred, class Alloc>
#include <__utility/forward.h>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <functional>
+# include <iterator>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/include/utility b/libcxx/include/utility
index fc7909aef11a..7a1a45e334a3 100644
--- a/libcxx/include/utility
+++ b/libcxx/include/utility
@@ -243,6 +243,10 @@ template <class T>
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <iosfwd>
+#endif
+
// standard-mandated includes
#include <compare>
#include <initializer_list>
diff --git a/libcxx/include/valarray b/libcxx/include/valarray
index 5e601758e041..6f8a3b84197b 100644
--- a/libcxx/include/valarray
+++ b/libcxx/include/valarray
@@ -360,6 +360,11 @@ template <class T> unspecified2 end(const valarray<T>& v);
#include <new>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <functional>
+#endif
+
// standard-mandated includes
#include <initializer_list>
diff --git a/libcxx/include/variant b/libcxx/include/variant
index 5f8c06510d91..65dec64dbbbd 100644
--- a/libcxx/include/variant
+++ b/libcxx/include/variant
@@ -219,6 +219,11 @@ namespace std {
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <typeinfo>
+# include <utility>
+#endif
+
// standard-mandated includes
#include <compare>
diff --git a/libcxx/include/vector b/libcxx/include/vector
index 1cb4cbf10794..f5c09011948d 100644
--- a/libcxx/include/vector
+++ b/libcxx/include/vector
@@ -305,6 +305,12 @@ erase_if(vector<T, Allocator>& c, Predicate pred); // C++20
#include <type_traits>
#include <version>
+#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
+# include <algorithm>
+# include <typeinfo>
+# include <utility>
+#endif
+
// standard-mandated includes
// [iterator.range]
diff --git a/libcxx/test/libcxx/transitive_includes.sh.cpp b/libcxx/test/libcxx/transitive_includes.sh.cpp
index 19d6ab036f68..aaf26fbf40dc 100644
--- a/libcxx/test/libcxx/transitive_includes.sh.cpp
+++ b/libcxx/test/libcxx/transitive_includes.sh.cpp
@@ -34,6 +34,11 @@
// This test doesn't work on AIX or Windows, but it should. Needs investigation.
// XFAIL: buildhost=aix, buildhost=windows
+// 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
+
// Prevent <ext/hash_map> from generating deprecated warnings for this test.
#if defined(__DEPRECATED)
# undef __DEPRECATED
diff --git a/libcxx/test/libcxx/transitive_includes/expected.algorithm b/libcxx/test/libcxx/transitive_includes/expected.algorithm
index 8e539be98cbc..944a3eeea2d6 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.algorithm
+++ b/libcxx/test/libcxx/transitive_includes/expected.algorithm
@@ -1,6 +1,7 @@
algorithm
atomic
bit
+chrono
climits
cmath
compare
@@ -13,6 +14,7 @@ ctime
exception
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -21,4 +23,6 @@ stdexcept
tuple
type_traits
typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.any b/libcxx/test/libcxx/transitive_includes/expected.any
index 4f3cff5c0634..86009188e53e 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.any
+++ b/libcxx/test/libcxx/transitive_includes/expected.any
@@ -1,5 +1,6 @@
any
atomic
+chrono
climits
cmath
compare
@@ -12,6 +13,7 @@ ctime
exception
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -20,4 +22,6 @@ stdexcept
tuple
type_traits
typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.array b/libcxx/test/libcxx/transitive_includes/expected.array
index 0fb1b67d13d0..7145642a8f46 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.array
+++ b/libcxx/test/libcxx/transitive_includes/expected.array
@@ -1,14 +1,29 @@
+algorithm
array
+atomic
+bit
+chrono
+climits
cmath
compare
concepts
cstddef
cstdint
cstdlib
+cstring
+ctime
exception
initializer_list
iosfwd
+iterator
limits
+memory
+new
+ratio
stdexcept
+tuple
type_traits
+typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.atomic b/libcxx/test/libcxx/transitive_includes/expected.atomic
index 42e3c191ac89..3e9917b3da1a 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.atomic
+++ b/libcxx/test/libcxx/transitive_includes/expected.atomic
@@ -1,5 +1,8 @@
atomic
+chrono
climits
+cmath
+compare
cstddef
cstdint
cstring
diff --git a/libcxx/test/libcxx/transitive_includes/expected.barrier b/libcxx/test/libcxx/transitive_includes/expected.barrier
index cb7845f45e0c..c2865c8d3ef0 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.barrier
+++ b/libcxx/test/libcxx/transitive_includes/expected.barrier
@@ -1,5 +1,6 @@
atomic
barrier
+chrono
climits
cmath
compare
@@ -12,6 +13,7 @@ ctime
exception
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -20,4 +22,6 @@ stdexcept
tuple
type_traits
typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.bit b/libcxx/test/libcxx/transitive_includes/expected.bit
index 3f58643d6062..4fb5285f8142 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.bit
+++ b/libcxx/test/libcxx/transitive_includes/expected.bit
@@ -2,6 +2,7 @@ bit
cstddef
cstdint
cstdlib
+iosfwd
limits
type_traits
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.bitset b/libcxx/test/libcxx/transitive_includes/expected.bitset
index d3ee4af66e1b..3cf3e8dbdfc7 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.bitset
+++ b/libcxx/test/libcxx/transitive_includes/expected.bitset
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
bitset
cctype
+chrono
climits
cmath
compare
@@ -14,11 +18,14 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
string
@@ -26,4 +33,8 @@ string_view
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.ccomplex b/libcxx/test/libcxx/transitive_includes/expected.ccomplex
index cfc2d04436fe..98bf9a8010e4 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.ccomplex
+++ b/libcxx/test/libcxx/transitive_includes/expected.ccomplex
@@ -1,8 +1,12 @@
+algorithm
+array
atomic
+bit
bitset
ccomplex
cctype
cerrno
+chrono
climits
cmath
compare
@@ -18,15 +22,18 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
sstream
@@ -38,4 +45,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.charconv b/libcxx/test/libcxx/transitive_includes/expected.charconv
index 5ce64d0c6a23..1ca2d688ddea 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.charconv
+++ b/libcxx/test/libcxx/transitive_includes/expected.charconv
@@ -6,6 +6,7 @@ cstddef
cstdint
cstdlib
cstring
+iosfwd
limits
type_traits
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.codecvt b/libcxx/test/libcxx/transitive_includes/expected.codecvt
index f846715edf80..0931ca137c0b 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.codecvt
+++ b/libcxx/test/libcxx/transitive_includes/expected.codecvt
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
codecvt
@@ -15,12 +19,15 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
mutex
new
+optional
ratio
stdexcept
string
@@ -29,4 +36,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.complex b/libcxx/test/libcxx/transitive_includes/expected.complex
index eb5fe7c87bf7..64161c1d331f 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.complex
+++ b/libcxx/test/libcxx/transitive_includes/expected.complex
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -17,15 +21,18 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
sstream
@@ -37,4 +44,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.condition_variable b/libcxx/test/libcxx/transitive_includes/expected.condition_variable
index 081849db56d2..968007a37cef 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.condition_variable
+++ b/libcxx/test/libcxx/transitive_includes/expected.condition_variable
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -15,11 +19,14 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
string
@@ -28,4 +35,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.coroutine b/libcxx/test/libcxx/transitive_includes/expected.coroutine
index 1f31012bf5be..8dd332d47254 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.coroutine
+++ b/libcxx/test/libcxx/transitive_includes/expected.coroutine
@@ -4,6 +4,7 @@ coroutine
cstddef
cstdint
cstring
+iosfwd
limits
type_traits
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.ctgmath b/libcxx/test/libcxx/transitive_includes/expected.ctgmath
index ac37b74ac56e..7467a5ab5952 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.ctgmath
+++ b/libcxx/test/libcxx/transitive_includes/expected.ctgmath
@@ -1,8 +1,12 @@
+algorithm
+array
atomic
+bit
bitset
ccomplex
cctype
cerrno
+chrono
climits
cmath
compare
@@ -19,15 +23,18 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
sstream
@@ -39,4 +46,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.deque b/libcxx/test/libcxx/transitive_includes/expected.deque
index aa51131432ea..c26bdc7479b6 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.deque
+++ b/libcxx/test/libcxx/transitive_includes/expected.deque
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -10,14 +14,21 @@ cstring
ctime
deque
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_algorithm b/libcxx/test/libcxx/transitive_includes/expected.experimental_algorithm
index 7e307913a9fe..8a5cd7de65d8 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_algorithm
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_algorithm
@@ -1,6 +1,7 @@
algorithm
atomic
bit
+chrono
climits
cmath
compare
@@ -14,6 +15,7 @@ exception
experimental/algorithm
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -22,4 +24,6 @@ stdexcept
tuple
type_traits
typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_coroutine b/libcxx/test/libcxx/transitive_includes/expected.experimental_coroutine
index 89fc3edcec46..682f0fa0e7a8 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_coroutine
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_coroutine
@@ -1,4 +1,5 @@
atomic
+chrono
climits
cmath
compare
@@ -12,6 +13,7 @@ exception
experimental/coroutine
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -20,4 +22,6 @@ stdexcept
tuple
type_traits
typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_deque b/libcxx/test/libcxx/transitive_includes/expected.experimental_deque
index e1677c7dd843..bd86d1588beb 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_deque
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_deque
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -13,15 +17,21 @@ exception
experimental/deque
experimental/memory_resource
experimental/utility
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
tuple
type_traits
typeinfo
+unordered_map
utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_forward_list b/libcxx/test/libcxx/transitive_includes/expected.experimental_forward_list
index af433ce90949..c43fab08b41f 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_forward_list
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_forward_list
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -13,15 +17,21 @@ experimental/forward_list
experimental/memory_resource
experimental/utility
forward_list
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
tuple
type_traits
typeinfo
+unordered_map
utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_functional b/libcxx/test/libcxx/transitive_includes/expected.experimental_functional
index ce502b5e9803..87cee2d28882 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_functional
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_functional
@@ -1,5 +1,8 @@
+algorithm
array
atomic
+bit
+chrono
climits
cmath
compare
@@ -14,6 +17,7 @@ experimental/functional
functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -24,5 +28,7 @@ tuple
type_traits
typeinfo
unordered_map
+utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_iterator b/libcxx/test/libcxx/transitive_includes/expected.experimental_iterator
index 83a9b8d93c65..14d31c215ffb 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_iterator
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_iterator
@@ -14,5 +14,7 @@ limits
new
tuple
type_traits
+typeinfo
+utility
variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_list b/libcxx/test/libcxx/transitive_includes/expected.experimental_list
index aae9f23d08e9..ac800654f532 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_list
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_list
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -12,16 +16,22 @@ exception
experimental/list
experimental/memory_resource
experimental/utility
+functional
initializer_list
iosfwd
+iterator
limits
list
memory
new
+optional
ratio
stdexcept
tuple
type_traits
typeinfo
+unordered_map
utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_map b/libcxx/test/libcxx/transitive_includes/expected.experimental_map
index cb76c7642ec9..d132098b01a1 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_map
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_map
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -12,8 +16,10 @@ exception
experimental/map
experimental/memory_resource
experimental/utility
+functional
initializer_list
iosfwd
+iterator
limits
map
memory
@@ -24,5 +30,8 @@ stdexcept
tuple
type_traits
typeinfo
+unordered_map
utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_memory_resource b/libcxx/test/libcxx/transitive_includes/expected.experimental_memory_resource
index 67d2441ae369..94d9abd26b6c 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_memory_resource
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_memory_resource
@@ -1,4 +1,5 @@
atomic
+chrono
climits
cmath
compare
@@ -13,6 +14,7 @@ experimental/memory_resource
experimental/utility
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -22,4 +24,5 @@ tuple
type_traits
typeinfo
utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_regex b/libcxx/test/libcxx/transitive_includes/expected.experimental_regex
index 6490adb5a1b4..8a49aac962c2 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_regex
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_regex
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -19,12 +23,15 @@ experimental/memory_resource
experimental/regex
experimental/string
experimental/utility
+functional
initializer_list
iosfwd
+iterator
limits
memory
mutex
new
+optional
ratio
regex
stdexcept
@@ -34,6 +41,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_set b/libcxx/test/libcxx/transitive_includes/expected.experimental_set
index 03a09aff0574..f1d2953360dc 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_set
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_set
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -12,8 +16,10 @@ exception
experimental/memory_resource
experimental/set
experimental/utility
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -24,5 +30,8 @@ stdexcept
tuple
type_traits
typeinfo
+unordered_map
utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_simd b/libcxx/test/libcxx/transitive_includes/expected.experimental_simd
index 999b0aafb666..f06f6e9cea01 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_simd
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_simd
@@ -1,16 +1,34 @@
+algorithm
array
+atomic
+bit
+chrono
+climits
cmath
compare
concepts
cstddef
cstdint
cstdlib
+cstring
+ctime
exception
experimental/simd
+functional
initializer_list
iosfwd
+iterator
limits
+memory
+new
+optional
+ratio
stdexcept
tuple
type_traits
+typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_string b/libcxx/test/libcxx/transitive_includes/expected.experimental_string
index 4fb05391c7b4..367a9ed7da4b 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_string
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_string
@@ -1,5 +1,9 @@
+algorithm
+array
atomic
+bit
cctype
+chrono
climits
cmath
compare
@@ -16,11 +20,14 @@ exception
experimental/memory_resource
experimental/string
experimental/utility
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
string
@@ -28,5 +35,8 @@ string_view
tuple
type_traits
typeinfo
+unordered_map
utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_map b/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_map
index 04efa3377d81..16753ae30a7b 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_map
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_map
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -12,8 +16,10 @@ exception
experimental/memory_resource
experimental/unordered_map
experimental/utility
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -25,4 +31,6 @@ type_traits
typeinfo
unordered_map
utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_set b/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_set
index 798b920506cf..1aafa61386b7 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_set
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_set
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -12,8 +16,10 @@ exception
experimental/memory_resource
experimental/unordered_set
experimental/utility
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -23,6 +29,9 @@ stdexcept
tuple
type_traits
typeinfo
+unordered_map
unordered_set
utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_utility b/libcxx/test/libcxx/transitive_includes/expected.experimental_utility
index 788283fb30b9..a399b3ebb27c 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_utility
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_utility
@@ -5,6 +5,7 @@ cstdint
cstdlib
experimental/utility
initializer_list
+iosfwd
limits
type_traits
utility
diff --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_vector b/libcxx/test/libcxx/transitive_includes/expected.experimental_vector
index 35355e4d3547..1c569628be18 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.experimental_vector
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_vector
@@ -1,4 +1,7 @@
+algorithm
atomic
+bit
+chrono
climits
cmath
compare
@@ -14,6 +17,7 @@ experimental/utility
experimental/vector
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -23,5 +27,6 @@ tuple
type_traits
typeinfo
utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.ext_hash_map b/libcxx/test/libcxx/transitive_includes/expected.ext_hash_map
index 238ba8fade71..459536294e0c 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.ext_hash_map
+++ b/libcxx/test/libcxx/transitive_includes/expected.ext_hash_map
@@ -3,6 +3,7 @@ array
atomic
bit
cctype
+chrono
climits
cmath
compare
@@ -20,6 +21,7 @@ ext/hash_map
functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -32,5 +34,7 @@ tuple
type_traits
typeinfo
unordered_map
+utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.ext_hash_set b/libcxx/test/libcxx/transitive_includes/expected.ext_hash_set
index 5e58c46663a5..160335aab367 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.ext_hash_set
+++ b/libcxx/test/libcxx/transitive_includes/expected.ext_hash_set
@@ -3,6 +3,7 @@ array
atomic
bit
cctype
+chrono
climits
cmath
compare
@@ -20,6 +21,7 @@ ext/hash_set
functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -32,5 +34,7 @@ tuple
type_traits
typeinfo
unordered_map
+utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.filesystem b/libcxx/test/libcxx/transitive_includes/expected.filesystem
index adc5812121df..22e80bc11192 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.filesystem
+++ b/libcxx/test/libcxx/transitive_includes/expected.filesystem
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -17,16 +21,19 @@ cwchar
cwctype
exception
filesystem
+functional
initializer_list
iomanip
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
stdexcept
@@ -37,4 +44,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.format b/libcxx/test/libcxx/transitive_includes/expected.format
index d88f3f66919f..08d46d27a9c0 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.format
+++ b/libcxx/test/libcxx/transitive_includes/expected.format
@@ -1,9 +1,11 @@
+algorithm
array
atomic
bit
cctype
cerrno
charconv
+chrono
climits
cmath
compare
@@ -19,9 +21,11 @@ cwchar
cwctype
exception
format
+functional
initializer_list
ios
iosfwd
+iterator
limits
locale
memory
@@ -37,4 +41,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.forward_list b/libcxx/test/libcxx/transitive_includes/expected.forward_list
index de184d39a0da..33afc74bd420 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.forward_list
+++ b/libcxx/test/libcxx/transitive_includes/expected.forward_list
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -10,14 +14,21 @@ cstring
ctime
exception
forward_list
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.fstream b/libcxx/test/libcxx/transitive_includes/expected.fstream
index 31ef4da04630..7a892e11bfe6 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.fstream
+++ b/libcxx/test/libcxx/transitive_includes/expected.fstream
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -18,16 +22,19 @@ cwctype
exception
filesystem
fstream
+functional
initializer_list
iomanip
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
stdexcept
@@ -38,4 +45,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.functional b/libcxx/test/libcxx/transitive_includes/expected.functional
index 944f5a2cedd7..7625982373f8 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.functional
+++ b/libcxx/test/libcxx/transitive_includes/expected.functional
@@ -1,5 +1,8 @@
+algorithm
array
atomic
+bit
+chrono
climits
cmath
compare
@@ -13,6 +16,7 @@ exception
functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -23,5 +27,7 @@ tuple
type_traits
typeinfo
unordered_map
+utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.future b/libcxx/test/libcxx/transitive_includes/expected.future
index 978baba9b8ec..92bd4e044ecc 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.future
+++ b/libcxx/test/libcxx/transitive_includes/expected.future
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -14,13 +18,16 @@ ctime
cwchar
cwctype
exception
+functional
future
initializer_list
iosfwd
+iterator
limits
memory
mutex
new
+optional
ratio
stdexcept
string
@@ -30,4 +37,8 @@ thread
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.iomanip b/libcxx/test/libcxx/transitive_includes/expected.iomanip
index 86446ab031fb..39829086f4cb 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.iomanip
+++ b/libcxx/test/libcxx/transitive_includes/expected.iomanip
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -16,16 +20,19 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iomanip
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
stdexcept
@@ -36,4 +43,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.ios b/libcxx/test/libcxx/transitive_includes/expected.ios
index 3ecae9323ab4..6e7e5b268976 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.ios
+++ b/libcxx/test/libcxx/transitive_includes/expected.ios
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -14,13 +18,16 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
+iterator
limits
memory
mutex
new
+optional
ratio
stdexcept
string
@@ -29,4 +36,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.iostream b/libcxx/test/libcxx/transitive_includes/expected.iostream
index 2e4e74cc18b4..580aeaf86734 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.iostream
+++ b/libcxx/test/libcxx/transitive_includes/expected.iostream
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -16,16 +20,19 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
iostream
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
stdexcept
@@ -36,4 +43,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.istream b/libcxx/test/libcxx/transitive_includes/expected.istream
index cbd4a87c1613..fd0c4b4ca736 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.istream
+++ b/libcxx/test/libcxx/transitive_includes/expected.istream
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -16,15 +20,18 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
stdexcept
@@ -35,4 +42,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.iterator b/libcxx/test/libcxx/transitive_includes/expected.iterator
index 698f6cf9de2f..447087a3f6f9 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.iterator
+++ b/libcxx/test/libcxx/transitive_includes/expected.iterator
@@ -13,5 +13,7 @@ limits
new
tuple
type_traits
+typeinfo
+utility
variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.latch b/libcxx/test/libcxx/transitive_includes/expected.latch
index 3d00941b9231..a7a6bbc912ce 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.latch
+++ b/libcxx/test/libcxx/transitive_includes/expected.latch
@@ -1,5 +1,8 @@
atomic
+chrono
climits
+cmath
+compare
cstddef
cstdint
cstring
diff --git a/libcxx/test/libcxx/transitive_includes/expected.list b/libcxx/test/libcxx/transitive_includes/expected.list
index 96d4f33db7d4..b596079c340b 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.list
+++ b/libcxx/test/libcxx/transitive_includes/expected.list
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -9,15 +13,22 @@ cstdlib
cstring
ctime
exception
+functional
initializer_list
iosfwd
+iterator
limits
list
memory
new
+optional
ratio
stdexcept
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.locale b/libcxx/test/libcxx/transitive_includes/expected.locale
index cdd6609f8440..29719367689e 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.locale
+++ b/libcxx/test/libcxx/transitive_includes/expected.locale
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -15,14 +19,17 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
+iterator
limits
locale
memory
mutex
new
+optional
ratio
stdexcept
streambuf
@@ -32,4 +39,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.map b/libcxx/test/libcxx/transitive_includes/expected.map
index a6896289ab3f..c871579ea35e 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.map
+++ b/libcxx/test/libcxx/transitive_includes/expected.map
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -9,8 +13,10 @@ cstdlib
cstring
ctime
exception
+functional
initializer_list
iosfwd
+iterator
limits
map
memory
@@ -21,4 +27,8 @@ stdexcept
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.memory b/libcxx/test/libcxx/transitive_includes/expected.memory
index 3b7a13de63fe..f36910fde696 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.memory
+++ b/libcxx/test/libcxx/transitive_includes/expected.memory
@@ -1,4 +1,5 @@
atomic
+chrono
climits
cmath
compare
@@ -11,6 +12,7 @@ ctime
exception
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -19,4 +21,6 @@ stdexcept
tuple
type_traits
typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.mutex b/libcxx/test/libcxx/transitive_includes/expected.mutex
index 1aa71f549fd4..4d101cb290c1 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.mutex
+++ b/libcxx/test/libcxx/transitive_includes/expected.mutex
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -14,12 +18,15 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
mutex
new
+optional
ratio
stdexcept
string
@@ -28,4 +35,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.numeric b/libcxx/test/libcxx/transitive_includes/expected.numeric
index 843582958e10..558b32457eb4 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.numeric
+++ b/libcxx/test/libcxx/transitive_includes/expected.numeric
@@ -1,8 +1,34 @@
+algorithm
+array
+atomic
+bit
+chrono
+climits
cmath
+compare
concepts
cstddef
cstdint
+cstdlib
+cstring
+ctime
+exception
+functional
+initializer_list
+iosfwd
+iterator
limits
+memory
+new
numeric
+optional
+ratio
+stdexcept
+tuple
type_traits
+typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.optional b/libcxx/test/libcxx/transitive_includes/expected.optional
index e888c8f4e0bd..993ce23d8009 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.optional
+++ b/libcxx/test/libcxx/transitive_includes/expected.optional
@@ -1,15 +1,27 @@
+atomic
+chrono
+climits
cmath
compare
+concepts
cstddef
cstdint
cstdlib
cstring
+ctime
exception
initializer_list
iosfwd
+iterator
limits
+memory
new
optional
+ratio
stdexcept
+tuple
type_traits
+typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.ostream b/libcxx/test/libcxx/transitive_includes/expected.ostream
index 1d7da3e2f96d..762d13c26ac3 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.ostream
+++ b/libcxx/test/libcxx/transitive_includes/expected.ostream
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -16,14 +20,17 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
stdexcept
@@ -34,4 +41,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.queue b/libcxx/test/libcxx/transitive_includes/expected.queue
index 07743c837beb..5861852fc532 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.queue
+++ b/libcxx/test/libcxx/transitive_includes/expected.queue
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -10,16 +14,22 @@ cstring
ctime
deque
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
queue
ratio
stdexcept
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.random b/libcxx/test/libcxx/transitive_includes/expected.random
index c8060db2909a..96a956ad800a 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.random
+++ b/libcxx/test/libcxx/transitive_includes/expected.random
@@ -1,6 +1,9 @@
+algorithm
+array
atomic
bit
cctype
+chrono
climits
cmath
compare
@@ -14,12 +17,15 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
numeric
+optional
random
ratio
stdexcept
@@ -28,5 +34,8 @@ string_view
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.ranges b/libcxx/test/libcxx/transitive_includes/expected.ranges
index f16d5e5d5505..3dbb13bb9680 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.ranges
+++ b/libcxx/test/libcxx/transitive_includes/expected.ranges
@@ -1,4 +1,9 @@
+algorithm
array
+atomic
+bit
+chrono
+climits
cmath
compare
concepts
@@ -6,17 +11,25 @@ cstddef
cstdint
cstdlib
cstring
+ctime
exception
+functional
initializer_list
iosfwd
iterator
limits
+memory
new
optional
ranges
+ratio
span
stdexcept
tuple
type_traits
+typeinfo
+unordered_map
+utility
variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.regex b/libcxx/test/libcxx/transitive_includes/expected.regex
index 447e31831d8f..76df20736662 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.regex
+++ b/libcxx/test/libcxx/transitive_includes/expected.regex
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -15,12 +19,15 @@ cwchar
cwctype
deque
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
mutex
new
+optional
ratio
regex
stdexcept
@@ -30,5 +37,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.scoped_allocator b/libcxx/test/libcxx/transitive_includes/expected.scoped_allocator
index f4345de47a6a..22dcb319a5e6 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.scoped_allocator
+++ b/libcxx/test/libcxx/transitive_includes/expected.scoped_allocator
@@ -1,4 +1,5 @@
atomic
+chrono
climits
cmath
compare
@@ -11,6 +12,7 @@ ctime
exception
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -20,4 +22,6 @@ stdexcept
tuple
type_traits
typeinfo
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.semaphore b/libcxx/test/libcxx/transitive_includes/expected.semaphore
index 6893d0995506..d6802e25aa70 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.semaphore
+++ b/libcxx/test/libcxx/transitive_includes/expected.semaphore
@@ -1,5 +1,8 @@
atomic
+chrono
climits
+cmath
+compare
cstddef
cstdint
cstring
diff --git a/libcxx/test/libcxx/transitive_includes/expected.set b/libcxx/test/libcxx/transitive_includes/expected.set
index 9b0f3cb52c18..849e87331b72 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.set
+++ b/libcxx/test/libcxx/transitive_includes/expected.set
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -9,8 +13,10 @@ cstdlib
cstring
ctime
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -21,4 +27,8 @@ stdexcept
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.shared_mutex b/libcxx/test/libcxx/transitive_includes/expected.shared_mutex
index 2bd4140b3d11..fdea61e19bba 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.shared_mutex
+++ b/libcxx/test/libcxx/transitive_includes/expected.shared_mutex
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -14,11 +18,14 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
shared_mutex
stdexcept
@@ -28,4 +35,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.span b/libcxx/test/libcxx/transitive_includes/expected.span
index 4ec98478d7ab..a46c30df8851 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.span
+++ b/libcxx/test/libcxx/transitive_includes/expected.span
@@ -1,15 +1,34 @@
+algorithm
array
+atomic
+bit
+chrono
+climits
cmath
compare
concepts
cstddef
cstdint
cstdlib
+cstring
+ctime
exception
+functional
initializer_list
iosfwd
+iterator
limits
+memory
+new
+optional
+ratio
span
stdexcept
+tuple
type_traits
+typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.sstream b/libcxx/test/libcxx/transitive_includes/expected.sstream
index 1acc28a14008..1724fbdde39e 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.sstream
+++ b/libcxx/test/libcxx/transitive_includes/expected.sstream
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -16,15 +20,18 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
sstream
@@ -36,4 +43,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.stack b/libcxx/test/libcxx/transitive_includes/expected.stack
index 17c8d991260c..1a7d18cb85f2 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.stack
+++ b/libcxx/test/libcxx/transitive_includes/expected.stack
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -10,15 +14,22 @@ cstring
ctime
deque
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stack
stdexcept
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.streambuf b/libcxx/test/libcxx/transitive_includes/expected.streambuf
index 5e8e278a70ff..a3001ce44a1b 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.streambuf
+++ b/libcxx/test/libcxx/transitive_includes/expected.streambuf
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -14,13 +18,16 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
+iterator
limits
memory
mutex
new
+optional
ratio
stdexcept
streambuf
@@ -30,4 +37,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.string b/libcxx/test/libcxx/transitive_includes/expected.string
index 960707082bab..0dacf739a785 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.string
+++ b/libcxx/test/libcxx/transitive_includes/expected.string
@@ -1,5 +1,9 @@
+algorithm
+array
atomic
+bit
cctype
+chrono
climits
cmath
compare
@@ -13,11 +17,14 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
string
@@ -25,4 +32,8 @@ string_view
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.string_view b/libcxx/test/libcxx/transitive_includes/expected.string_view
index 6bb7edfd0bf0..e814351725ef 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.string_view
+++ b/libcxx/test/libcxx/transitive_includes/expected.string_view
@@ -1,4 +1,10 @@
+algorithm
+array
+atomic
+bit
cctype
+chrono
+climits
cmath
compare
concepts
@@ -7,13 +13,26 @@ cstdint
cstdio
cstdlib
cstring
+ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
+memory
+new
+optional
+ratio
stdexcept
string_view
+tuple
type_traits
+typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.strstream b/libcxx/test/libcxx/transitive_includes/expected.strstream
index ed208f4d5eb3..782153b595b6 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.strstream
+++ b/libcxx/test/libcxx/transitive_includes/expected.strstream
@@ -1,7 +1,11 @@
+algorithm
+array
atomic
+bit
bitset
cctype
cerrno
+chrono
climits
cmath
compare
@@ -16,15 +20,18 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
ios
iosfwd
istream
+iterator
limits
locale
memory
mutex
new
+optional
ostream
ratio
stdexcept
@@ -36,4 +43,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.system_error b/libcxx/test/libcxx/transitive_includes/expected.system_error
index 30ca93cf23bd..4101ee5209a3 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.system_error
+++ b/libcxx/test/libcxx/transitive_includes/expected.system_error
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -14,11 +18,14 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
string
@@ -27,4 +34,8 @@ system_error
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.thread b/libcxx/test/libcxx/transitive_includes/expected.thread
index 102ca5891713..ab8c3c7c85ba 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.thread
+++ b/libcxx/test/libcxx/transitive_includes/expected.thread
@@ -1,6 +1,10 @@
+algorithm
+array
atomic
+bit
cctype
cerrno
+chrono
climits
cmath
compare
@@ -14,11 +18,14 @@ ctime
cwchar
cwctype
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
+optional
ratio
stdexcept
string
@@ -28,4 +35,8 @@ thread
tuple
type_traits
typeinfo
+unordered_map
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.tuple b/libcxx/test/libcxx/transitive_includes/expected.tuple
index 2a4e44c6f4e9..69858dc888c3 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.tuple
+++ b/libcxx/test/libcxx/transitive_includes/expected.tuple
@@ -2,7 +2,14 @@ cmath
compare
cstddef
cstdint
+cstdlib
+exception
+initializer_list
+iosfwd
limits
+new
tuple
type_traits
+typeinfo
+utility
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.typeindex b/libcxx/test/libcxx/transitive_includes/expected.typeindex
index 8ed579013db7..8f1c65253537 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.typeindex
+++ b/libcxx/test/libcxx/transitive_includes/expected.typeindex
@@ -4,8 +4,12 @@ cstddef
cstdint
cstdlib
exception
+initializer_list
+iosfwd
limits
+new
type_traits
typeindex
typeinfo
+utility
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.unordered_map b/libcxx/test/libcxx/transitive_includes/expected.unordered_map
index 4f2f2ff02388..2250cf96690a 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.unordered_map
+++ b/libcxx/test/libcxx/transitive_includes/expected.unordered_map
@@ -1,4 +1,7 @@
+algorithm
atomic
+bit
+chrono
climits
cmath
compare
@@ -11,6 +14,7 @@ ctime
exception
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -21,4 +25,6 @@ tuple
type_traits
typeinfo
unordered_map
+utility
+variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.unordered_set b/libcxx/test/libcxx/transitive_includes/expected.unordered_set
index 2c825fb58ac9..9352f0b05b72 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.unordered_set
+++ b/libcxx/test/libcxx/transitive_includes/expected.unordered_set
@@ -1,4 +1,8 @@
+algorithm
+array
atomic
+bit
+chrono
climits
cmath
compare
@@ -9,8 +13,10 @@ cstdlib
cstring
ctime
exception
+functional
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -20,5 +26,9 @@ stdexcept
tuple
type_traits
typeinfo
+unordered_map
unordered_set
+utility
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.utility b/libcxx/test/libcxx/transitive_includes/expected.utility
index 30781fff9336..799a14724cf4 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.utility
+++ b/libcxx/test/libcxx/transitive_includes/expected.utility
@@ -4,6 +4,7 @@ cstddef
cstdint
cstdlib
initializer_list
+iosfwd
limits
type_traits
utility
diff --git a/libcxx/test/libcxx/transitive_includes/expected.valarray b/libcxx/test/libcxx/transitive_includes/expected.valarray
index b5543ea5c701..a069f37119fa 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.valarray
+++ b/libcxx/test/libcxx/transitive_includes/expected.valarray
@@ -1,15 +1,34 @@
+algorithm
+array
+atomic
+bit
+chrono
+climits
cmath
+compare
concepts
cstddef
cstdint
cstdlib
cstring
+ctime
exception
+functional
initializer_list
iosfwd
+iterator
limits
+memory
new
+optional
+ratio
stdexcept
+tuple
type_traits
+typeinfo
+unordered_map
+utility
valarray
+variant
+vector
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.variant b/libcxx/test/libcxx/transitive_includes/expected.variant
index 44553c77ce56..d94d72974cb8 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.variant
+++ b/libcxx/test/libcxx/transitive_includes/expected.variant
@@ -6,9 +6,12 @@ cstdlib
cstring
exception
initializer_list
+iosfwd
limits
new
tuple
type_traits
+typeinfo
+utility
variant
version
diff --git a/libcxx/test/libcxx/transitive_includes/expected.vector b/libcxx/test/libcxx/transitive_includes/expected.vector
index 9553eb0c04d7..5fb9d7d19cc1 100644
--- a/libcxx/test/libcxx/transitive_includes/expected.vector
+++ b/libcxx/test/libcxx/transitive_includes/expected.vector
@@ -1,4 +1,7 @@
+algorithm
atomic
+bit
+chrono
climits
cmath
compare
@@ -11,6 +14,7 @@ ctime
exception
initializer_list
iosfwd
+iterator
limits
memory
new
@@ -19,5 +23,7 @@ stdexcept
tuple
type_traits
typeinfo
+utility
+variant
vector
version
diff --git a/libcxx/utils/ci/buildkite-pipeline.yml b/libcxx/utils/ci/buildkite-pipeline.yml
index 9264ea19576d..755f98d9c6b3 100644
--- a/libcxx/utils/ci/buildkite-pipeline.yml
+++ b/libcxx/utils/ci/buildkite-pipeline.yml
@@ -336,7 +336,6 @@ steps:
timeout_in_minutes: 120
# Tests with various build configurations.
-
- label: "Static libraries"
command: "libcxx/utils/ci/run-buildbot generic-static"
artifact_paths:
@@ -393,6 +392,20 @@ steps:
limit: 2
timeout_in_minutes: 120
+ - label: "No transitive includes"
+ command: "libcxx/utils/ci/run-buildbot generic-no-transitive-includes"
+ artifact_paths:
+ - "**/test-results.xml"
+ - "**/*.abilist"
+ agents:
+ queue: "libcxx-builders"
+ os: "linux"
+ retry:
+ automatic:
+ - exit_status: -1 # Agent was lost
+ limit: 2
+ timeout_in_minutes: 120
+
- label: "With LLVM's libunwind"
command: "libcxx/utils/ci/run-buildbot generic-with_llvm_unwinder"
artifact_paths:
diff --git a/libcxx/utils/ci/run-buildbot b/libcxx/utils/ci/run-buildbot
index 81f7d6cafc74..81a68467e3e1 100755
--- a/libcxx/utils/ci/run-buildbot
+++ b/libcxx/utils/ci/run-buildbot
@@ -324,6 +324,11 @@ generic-with_llvm_unwinder)
generate-cmake -DLIBCXXABI_USE_LLVM_UNWINDER=ON
check-runtimes
;;
+generic-no-transitive-includes)
+ clean
+ generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-transitive-includes.cmake"
+ check-runtimes
+;;
generic-no-threads)
clean
generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-threads.cmake"
diff --git a/libcxx/utils/libcxx/test/params.py b/libcxx/utils/libcxx/test/params.py
index 82fe93fc48fe..dcfefeced957 100644
--- a/libcxx/utils/libcxx/test/params.py
+++ b/libcxx/utils/libcxx/test/params.py
@@ -186,6 +186,15 @@ DEFAULT_PARAMETERS = [
"This should be used sparingly since specifying ad-hoc features manually is error-prone and "
"brittle in the long run as changes are made to the test suite.",
actions=lambda features: [AddFeature(f) for f in features]),
+
+ Parameter(name='enable_transitive_includes', choices=[True, False], type=bool, default=True,
+ help="Whether to enable backwards-compatibility transitive includes when running the tests. This "
+ "is provided to ensure that the trimmed-down version of libc++ does not bit-rot in between "
+ "points at which we bulk-remove transitive includes.",
+ actions=lambda enabled: [] if enabled else [
+ AddFeature('transitive-includes-disabled'),
+ AddCompileFlag('-D_LIBCPP_REMOVE_TRANSITIVE_INCLUDES')
+ ]),
]
DEFAULT_PARAMETERS += [