[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:
Mark de Wever 2022-08-20 10:34:26 +02:00
parent 9ac66f0650
commit 8ff2d6af69
192 changed files with 162 additions and 801 deletions

View File

@ -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.

View File

@ -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
----------------------------------

View File

@ -175,6 +175,7 @@ Design Documents
DesignDocs/ExtendedCXX03Support
DesignDocs/FeatureTestMacros
DesignDocs/FileTimeType
DesignDocs/HeaderRemovalPolicy
DesignDocs/NoexceptPolicy
DesignDocs/ThreadingSupportAPI
DesignDocs/UniquePtrTrivialAbi

View File

@ -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

View File

@ -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)

View File

@ -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>

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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)

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -1,7 +1,6 @@
algorithm
atomic
bit
chrono
climits
cmath
compare

View File

@ -1,6 +1,5 @@
any
atomic
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -1,5 +1,4 @@
atomic
chrono
climits
cmath
compare

View File

@ -1,6 +1,5 @@
atomic
barrier
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
bitset
cctype
chrono
climits
cmath
compare

View File

@ -6,7 +6,6 @@ bitset
ccomplex
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
codecvt

View File

@ -5,7 +5,6 @@ bit
bitset
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -6,7 +6,6 @@ bitset
ccomplex
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -1,7 +1,6 @@
algorithm
atomic
bit
chrono
climits
cmath
compare

View File

@ -1,5 +1,4 @@
atomic
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -1,5 +1,4 @@
atomic
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -3,7 +3,6 @@ array
atomic
bit
cctype
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -1,7 +1,6 @@
algorithm
atomic
bit
chrono
climits
cmath
compare

View File

@ -3,7 +3,6 @@ array
atomic
bit
cctype
chrono
climits
cmath
compare

View File

@ -3,7 +3,6 @@ array
atomic
bit
cctype
chrono
climits
cmath
compare

View File

@ -5,7 +5,6 @@ bit
bitset
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -5,7 +5,6 @@ bit
cctype
cerrno
charconv
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -5,7 +5,6 @@ bit
bitset
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -5,7 +5,6 @@ bit
bitset
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -5,7 +5,6 @@ bit
bitset
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -5,7 +5,6 @@ bit
bitset
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -1,5 +1,4 @@
atomic
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -1,5 +1,4 @@
atomic
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -1,5 +1,4 @@
atomic
chrono
climits
cmath
compare

View File

@ -5,7 +5,6 @@ bit
bitset
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -3,7 +3,6 @@ array
atomic
bit
cctype
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -1,5 +1,4 @@
atomic
chrono
climits
cmath
compare

View File

@ -1,5 +1,4 @@
atomic
chrono
climits
cmath
compare

View File

@ -2,7 +2,6 @@ algorithm
array
atomic
bit
chrono
climits
cmath
compare

View File

@ -4,7 +4,6 @@ atomic
bit
cctype
cerrno
chrono
climits
cmath
compare

View File

@ -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