forked from OSchip/llvm-project
[libc++] Reduces the number of transitive includes.
This defines a new policy for removal of transitive includes. The goal of the policy it to make it relatively easy to remove headers when needed, but avoid breaking developers using and vendors shipping libc++. The method used is to guard transitive includes based on the C++ language version. For the upcoming C++23 we can remove headers when we want, but for other language versions we try to keep it to a minimum. In this code the transitive include of `<chrono>` is removed since D128577 introduces a header cycle between `<format>` and `<chrono>`. This cycle is indirectly required by the Standard. Our cycle dependency tool basically is a grep based tool, so it needs some hints to ignore cycles. With the input of our transitive include tests we can create a better tool. However that's out of the scope of this patch. Note the flag `_LIBCPP_REMOVE_TRANSITIVE_INCLUDES` remains unchanged. So users can still opt-out of transitives includes entirely. Reviewed By: #libc, ldionne, philnik Differential Revision: https://reviews.llvm.org/D132284
This commit is contained in:
parent
9ac66f0650
commit
8ff2d6af69
|
@ -0,0 +1,74 @@
|
|||
=====================
|
||||
Header Removal Policy
|
||||
=====================
|
||||
|
||||
Policy
|
||||
------
|
||||
|
||||
Libc++ is in the process of splitting larger headers into smaller modular
|
||||
headers. This makes it possible to remove these large headers from other
|
||||
headers. For example, instead of including ``<algorithm>`` entirely it is
|
||||
possible to only include the headers for the algorithms used. When the
|
||||
Standard indirectly adds additional header includes, using the smaller headers
|
||||
aids reducing the growth of top-level headers. For example ``<atomic>`` uses
|
||||
``std::chrono::nanoseconds`` and included ``<chrono>``. In C++20 ``<chrono>``
|
||||
requires ``<format>`` which adds several other headers (like ``<string>``,
|
||||
``<optional>``, ``<tuple>``) which are not needed in ``<atomic>``.
|
||||
|
||||
The benefit of using minimal headers is that the size of libc++'s top-level
|
||||
headers becomes smaller. This improves the compilation time when users include
|
||||
a top-level header. It also avoids header inclusion cycles and makes it easier
|
||||
to port headers to platforms with reduced functionality.
|
||||
|
||||
A disadvantage is that users unknowingly depend on these transitive includes.
|
||||
Thus removing an include might break their build after upgrading a newer
|
||||
version of libc++. For example, ``<algorithm>`` is often forgotten but using
|
||||
algorithms will still work through those transitive includes. This problem is
|
||||
solved by modules, however in practice most people do not use modules (yet).
|
||||
|
||||
To ease the removal of transitive includes in libc++, libc++ will remove
|
||||
unnecessary transitive includes in newly supported C++ versions. This means
|
||||
that users will have to fix their missing includes in order to upgrade to a
|
||||
newer version of the Standard. Libc++ also reserves the right to remove
|
||||
transitive includes at any other time, however new language versions will be
|
||||
used as a convenient way to perform bulk removals of transitive includes.
|
||||
|
||||
For libc++ developers, this means that any transitive include removal must be
|
||||
guarded by something of the form:
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <iterator>
|
||||
# include <utility>
|
||||
#endif
|
||||
|
||||
When users define ``_LIBCPP_REMOVE_TRANSITIVE_INCLUDES``, libc++ will not
|
||||
include transitive headers, regardless of the language version. This can be
|
||||
useful for users to aid the transition to a newer language version, or by users
|
||||
who simply want to make sure they include what they use in their code.
|
||||
|
||||
One of the issues for libc++ with transitive includes is that these includes
|
||||
may create dependency cycles and cause the validation script
|
||||
``libcxx/utils/graph_header_deps.py`` to have false positives. To ignore an
|
||||
include from the validation script, add a comment containing ``IGNORE-CYCLE``.
|
||||
This should only be used when there is a cycle and it has been verified it is a
|
||||
false positive.
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
|
||||
# include <chrono> // IGNORE-CYCLE due to <format>
|
||||
#endif
|
||||
|
||||
|
||||
Rationale
|
||||
---------
|
||||
|
||||
Removing headers is not only an issue for software developers, but also for
|
||||
vendors. When a vendor updates libc++ several of their upstream packages might
|
||||
fail to compile, forcing them to fix these packages or file a bug with their
|
||||
upstream packages. Usually upgrading software to a new language standard is
|
||||
done explicitly by software developers. This means they most likely will
|
||||
discover and fix the missing includes, lessening the burden for the vendors.
|
|
@ -45,6 +45,24 @@ Improvements and New Features
|
|||
|
||||
Deprecations and Removals
|
||||
-------------------------
|
||||
- Several incidental transitive includes have been removed from libc++. Those
|
||||
includes are removed based on the language version used. Incidental transitive
|
||||
inclusions of the following headers have been removed:
|
||||
|
||||
- C++20: ``chrono``
|
||||
- C++2b: ``algorithm``, ``array``, ``atomic``, ``bit``, ``chrono``,
|
||||
``climits``, ``cmath``, ``compare``, ``concepts``, ``cstdlib``,
|
||||
``cstring``, ``ctime``, ``exception``, ``functional``,
|
||||
``initializer_list``, ``iosfwd``, ``iterator``, ``memory``, ``new``,
|
||||
``optional``, ``ratio``, ``stdexcept``, ``tuple``, ``typeinfo``,
|
||||
``unordered_map``, ``utility``, ``variant``, ``vector``.
|
||||
|
||||
Users can also remove all incidental transitive includes by defining
|
||||
``_LIBCPP_REMOVE_TRANSITIVE_INCLUDES`` regardless of the language version
|
||||
in use. Note that in the future, libc++ reserves the right to remove
|
||||
incidental transitive includes more aggressively, in particular regardless
|
||||
of the language version in use.
|
||||
|
||||
|
||||
Upcoming Deprecations and Removals
|
||||
----------------------------------
|
||||
|
|
|
@ -175,6 +175,7 @@ Design Documents
|
|||
DesignDocs/ExtendedCXX03Support
|
||||
DesignDocs/FeatureTestMacros
|
||||
DesignDocs/FileTimeType
|
||||
DesignDocs/HeaderRemovalPolicy
|
||||
DesignDocs/NoexceptPolicy
|
||||
DesignDocs/ThreadingSupportAPI
|
||||
DesignDocs/UniquePtrTrivialAbi
|
||||
|
|
|
@ -1899,8 +1899,11 @@ template <class BidirectionalIterator, class Compare>
|
|||
#include <__algorithm/unwrap_iter.h>
|
||||
#include <__algorithm/upper_bound.h>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
# include <chrono>
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
|
||||
# include <chrono> // IGNORE-CYCLE due to <format>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iterator>
|
||||
# include <utility>
|
||||
#endif
|
||||
|
|
|
@ -94,8 +94,8 @@ namespace std {
|
|||
#include <typeinfo>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
# include <chrono>
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
|
||||
# include <chrono> // IGNORE-CYCLE due to <format>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
|
|
|
@ -123,7 +123,7 @@ 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
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <iterator>
|
||||
# include <utility>
|
||||
|
|
|
@ -534,8 +534,13 @@ template <class T>
|
|||
# include <__threading_support>
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
# include <chrono>
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
|
||||
# include <chrono> // IGNORE-CYCLE due to <format>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <cmath>
|
||||
# include <compare>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
|
|
|
@ -71,7 +71,7 @@ namespace std {
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iosfwd>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -97,7 +97,7 @@ namespace std {
|
|||
#include <limits>
|
||||
#include <type_traits>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iosfwd>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ struct suspend_always;
|
|||
#include <__coroutine/trivial_awaitables.h>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iosfwd>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -185,7 +185,7 @@ template <class T, class Allocator, class Predicate>
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
|
|
|
@ -656,7 +656,7 @@ public:
|
|||
#include <experimental/__config>
|
||||
#include <tuple>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <functional>
|
||||
#endif
|
||||
|
|
|
@ -45,7 +45,7 @@ namespace pmr {
|
|||
#include <experimental/memory_resource>
|
||||
#include <unordered_map>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <array>
|
||||
# include <bit>
|
||||
|
|
|
@ -210,7 +210,7 @@ template <class Key, class T, class Hash, class Pred, class Alloc>
|
|||
#include <stdexcept>
|
||||
#include <type_traits>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iterator>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -199,7 +199,7 @@ template <class Value, class Hash, class Pred, class Alloc>
|
|||
#include <ext/__hash>
|
||||
#include <functional>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iterator>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -195,7 +195,7 @@ template <class T, class Allocator, class Predicate>
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
|
|
|
@ -539,7 +539,7 @@ POLICY: For non-variadic implementations, the number of arguments is limited
|
|||
#include <typeinfo>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <utility>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -378,8 +378,8 @@ template <class R, class Alloc> struct uses_allocator<packaged_task<R>, Alloc>;
|
|||
#include <thread>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
# include <chrono>
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
|
||||
# include <chrono> // IGNORE-CYCLE due to <format>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
||||
|
|
|
@ -724,7 +724,7 @@ template <class E> constexpr const E* data(initializer_list<E> il) noexcept;
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <exception>
|
||||
# include <new>
|
||||
# include <typeinfo>
|
||||
|
|
|
@ -203,7 +203,7 @@ template <class T, class Allocator, class Predicate>
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
|
|
|
@ -211,7 +211,7 @@ template <class charT> class messages_byname;
|
|||
#include <streambuf>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iterator>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -546,7 +546,7 @@ erase_if(multimap<Key, T, Compare, Allocator>& c, Predicate pred); // C++20
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
# include <utility>
|
||||
|
|
|
@ -887,7 +887,7 @@ template<size_t N, class T>
|
|||
#include <typeinfo>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iterator>
|
||||
# include <utility>
|
||||
#endif
|
||||
|
|
|
@ -198,7 +198,7 @@ template<class Callable, class ...Args>
|
|||
#endif
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <functional>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -163,7 +163,7 @@ template<class T>
|
|||
#include <__numeric/transform_inclusive_scan.h>
|
||||
#include <__numeric/transform_reduce.h>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
#endif
|
||||
|
|
|
@ -177,9 +177,12 @@ template<class T>
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
|
||||
# include <chrono> // IGNORE-CYCLE due to <format>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <atomic>
|
||||
# include <chrono>
|
||||
# include <climits>
|
||||
# include <concepts>
|
||||
# include <ctime>
|
||||
|
|
|
@ -171,7 +171,7 @@ basic_ostream<wchar_t, traits>& operator<<(basic_ostream<wchar_t, traits>&, cons
|
|||
#include <streambuf>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iterator>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1718,7 +1718,7 @@ class piecewise_linear_distribution
|
|||
#include <__random/weibull_distribution.h>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -778,7 +778,7 @@ typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
|
|||
#include <vector>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iterator>
|
||||
# include <utility>
|
||||
#endif
|
||||
|
|
|
@ -485,7 +485,7 @@ erase_if(multiset<Key, Compare, Allocator>& c, Predicate pred); // C++20
|
|||
#include <__utility/forward.h>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
#endif
|
||||
|
|
|
@ -148,7 +148,7 @@ template<class R>
|
|||
#include <type_traits> // for remove_cv, etc
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
#endif
|
||||
|
|
|
@ -107,7 +107,7 @@ template <class T, class Container>
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <functional>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -569,7 +569,7 @@ basic_string<char32_t> operator "" s( const char32_t *str, size_t len );
|
|||
# include <cwchar>
|
||||
#endif
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
|
|
|
@ -224,7 +224,7 @@ namespace std {
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
|
|
|
@ -99,8 +99,11 @@ void sleep_for(const chrono::duration<Rep, Period>& rel_time);
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
# include <chrono>
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
|
||||
# include <chrono> // IGNORE-CYCLE due to <format>
|
||||
#endif
|
||||
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <functional>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -220,7 +220,7 @@ template <class... Types>
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <exception>
|
||||
# include <iosfwd>
|
||||
# include <new>
|
||||
|
|
|
@ -51,7 +51,7 @@ struct hash<type_index>
|
|||
#include <typeinfo>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iosfwd>
|
||||
# include <new>
|
||||
# include <utility>
|
||||
|
|
|
@ -531,7 +531,7 @@ template <class Key, class T, class Hash, class Pred, class Alloc>
|
|||
#include <tuple>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <bit>
|
||||
# include <iterator>
|
||||
|
|
|
@ -474,7 +474,7 @@ template <class Value, class Hash, class Pred, class Alloc>
|
|||
#include <__utility/forward.h>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <functional>
|
||||
# include <iterator>
|
||||
#endif
|
||||
|
|
|
@ -243,7 +243,7 @@ template <class T>
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <iosfwd>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -360,7 +360,7 @@ template <class T> unspecified2 end(const valarray<T>& v);
|
|||
#include <new>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <functional>
|
||||
#endif
|
||||
|
|
|
@ -228,7 +228,7 @@ namespace std {
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <typeinfo>
|
||||
# include <utility>
|
||||
#endif
|
||||
|
|
|
@ -307,7 +307,7 @@ erase_if(vector<T, Allocator>& c, Predicate pred); // C++20
|
|||
#include <type_traits>
|
||||
#include <version>
|
||||
|
||||
#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
|
||||
#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
|
||||
# include <algorithm>
|
||||
# include <typeinfo>
|
||||
# include <utility>
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
algorithm
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
any
|
||||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
atomic
|
||||
barrier
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
bitset
|
||||
cctype
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -6,7 +6,6 @@ bitset
|
|||
ccomplex
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
codecvt
|
||||
|
|
|
@ -5,7 +5,6 @@ bit
|
|||
bitset
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -6,7 +6,6 @@ bitset
|
|||
ccomplex
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
algorithm
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -3,7 +3,6 @@ array
|
|||
atomic
|
||||
bit
|
||||
cctype
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
algorithm
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -3,7 +3,6 @@ array
|
|||
atomic
|
||||
bit
|
||||
cctype
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -3,7 +3,6 @@ array
|
|||
atomic
|
||||
bit
|
||||
cctype
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -5,7 +5,6 @@ bit
|
|||
bitset
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -5,7 +5,6 @@ bit
|
|||
cctype
|
||||
cerrno
|
||||
charconv
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -5,7 +5,6 @@ bit
|
|||
bitset
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -5,7 +5,6 @@ bit
|
|||
bitset
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -5,7 +5,6 @@ bit
|
|||
bitset
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -5,7 +5,6 @@ bit
|
|||
bitset
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -5,7 +5,6 @@ bit
|
|||
bitset
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -3,7 +3,6 @@ array
|
|||
atomic
|
||||
bit
|
||||
cctype
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
atomic
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -4,7 +4,6 @@ atomic
|
|||
bit
|
||||
cctype
|
||||
cerrno
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
|
@ -2,7 +2,6 @@ algorithm
|
|||
array
|
||||
atomic
|
||||
bit
|
||||
chrono
|
||||
climits
|
||||
cmath
|
||||
compare
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue