[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
NOKEYCHECK=True
GitOrigin-RevId: 8ff2d6af6906261567d8c10be62711ce899fb485
diff --git a/docs/ReleaseNotes.rst b/docs/ReleaseNotes.rst
index a89d4cd..fda4b69 100644
--- a/docs/ReleaseNotes.rst
+++ b/docs/ReleaseNotes.rst
@@ -45,6 +45,24 @@
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
----------------------------------