[libcxx-commits] [libcxx] 23d6cde - [libc++] Add a test to pin down the set of transitive public includes

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jun 23 13:24:06 PDT 2022


Author: Louis Dionne
Date: 2022-06-23T16:23:34-04:00
New Revision: 23d6cde14de352e05c66ae34cd237e3a7a8955d1

URL: https://github.com/llvm/llvm-project/commit/23d6cde14de352e05c66ae34cd237e3a7a8955d1
DIFF: https://github.com/llvm/llvm-project/commit/23d6cde14de352e05c66ae34cd237e3a7a8955d1.diff

LOG: [libc++] Add a test to pin down the set of transitive public includes

A situation that happens fairly often in libc++ is that we remove some
transitive includes in a header (either purposefully or not) and that
ends up breaking users. Of course, we want to be able to remove our
transitive includes, however it's also good to have a grip on that
to know which commit changed what and when. Furthermore, it's good
to accumulate include removals for a couple of releases to avoid
breaking users at every release for this reason.

This commit adds a test that should break whenever we remove an
include. Hence, it should allow us to track which headers include
which other headers transitively, giving us a traceable way to
remove headers.

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

Added: 
    libcxx/test/libcxx/lit.local.cfg
    libcxx/test/libcxx/transitive_includes.sanitize.py
    libcxx/test/libcxx/transitive_includes.sh.cpp
    libcxx/test/libcxx/transitive_includes/expected.algorithm
    libcxx/test/libcxx/transitive_includes/expected.any
    libcxx/test/libcxx/transitive_includes/expected.array
    libcxx/test/libcxx/transitive_includes/expected.atomic
    libcxx/test/libcxx/transitive_includes/expected.barrier
    libcxx/test/libcxx/transitive_includes/expected.bit
    libcxx/test/libcxx/transitive_includes/expected.bitset
    libcxx/test/libcxx/transitive_includes/expected.cassert
    libcxx/test/libcxx/transitive_includes/expected.ccomplex
    libcxx/test/libcxx/transitive_includes/expected.cctype
    libcxx/test/libcxx/transitive_includes/expected.cerrno
    libcxx/test/libcxx/transitive_includes/expected.cfenv
    libcxx/test/libcxx/transitive_includes/expected.cfloat
    libcxx/test/libcxx/transitive_includes/expected.charconv
    libcxx/test/libcxx/transitive_includes/expected.chrono
    libcxx/test/libcxx/transitive_includes/expected.cinttypes
    libcxx/test/libcxx/transitive_includes/expected.ciso646
    libcxx/test/libcxx/transitive_includes/expected.climits
    libcxx/test/libcxx/transitive_includes/expected.clocale
    libcxx/test/libcxx/transitive_includes/expected.cmath
    libcxx/test/libcxx/transitive_includes/expected.codecvt
    libcxx/test/libcxx/transitive_includes/expected.compare
    libcxx/test/libcxx/transitive_includes/expected.complex
    libcxx/test/libcxx/transitive_includes/expected.concepts
    libcxx/test/libcxx/transitive_includes/expected.condition_variable
    libcxx/test/libcxx/transitive_includes/expected.coroutine
    libcxx/test/libcxx/transitive_includes/expected.csetjmp
    libcxx/test/libcxx/transitive_includes/expected.csignal
    libcxx/test/libcxx/transitive_includes/expected.cstdarg
    libcxx/test/libcxx/transitive_includes/expected.cstdbool
    libcxx/test/libcxx/transitive_includes/expected.cstddef
    libcxx/test/libcxx/transitive_includes/expected.cstdint
    libcxx/test/libcxx/transitive_includes/expected.cstdio
    libcxx/test/libcxx/transitive_includes/expected.cstdlib
    libcxx/test/libcxx/transitive_includes/expected.cstring
    libcxx/test/libcxx/transitive_includes/expected.ctgmath
    libcxx/test/libcxx/transitive_includes/expected.ctime
    libcxx/test/libcxx/transitive_includes/expected.cuchar
    libcxx/test/libcxx/transitive_includes/expected.cwchar
    libcxx/test/libcxx/transitive_includes/expected.cwctype
    libcxx/test/libcxx/transitive_includes/expected.deque
    libcxx/test/libcxx/transitive_includes/expected.exception
    libcxx/test/libcxx/transitive_includes/expected.execution
    libcxx/test/libcxx/transitive_includes/expected.experimental_algorithm
    libcxx/test/libcxx/transitive_includes/expected.experimental_coroutine
    libcxx/test/libcxx/transitive_includes/expected.experimental_deque
    libcxx/test/libcxx/transitive_includes/expected.experimental_forward_list
    libcxx/test/libcxx/transitive_includes/expected.experimental_functional
    libcxx/test/libcxx/transitive_includes/expected.experimental_iterator
    libcxx/test/libcxx/transitive_includes/expected.experimental_list
    libcxx/test/libcxx/transitive_includes/expected.experimental_map
    libcxx/test/libcxx/transitive_includes/expected.experimental_memory_resource
    libcxx/test/libcxx/transitive_includes/expected.experimental_propagate_const
    libcxx/test/libcxx/transitive_includes/expected.experimental_regex
    libcxx/test/libcxx/transitive_includes/expected.experimental_set
    libcxx/test/libcxx/transitive_includes/expected.experimental_simd
    libcxx/test/libcxx/transitive_includes/expected.experimental_string
    libcxx/test/libcxx/transitive_includes/expected.experimental_type_traits
    libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_map
    libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_set
    libcxx/test/libcxx/transitive_includes/expected.experimental_utility
    libcxx/test/libcxx/transitive_includes/expected.experimental_vector
    libcxx/test/libcxx/transitive_includes/expected.ext_hash_map
    libcxx/test/libcxx/transitive_includes/expected.ext_hash_set
    libcxx/test/libcxx/transitive_includes/expected.filesystem
    libcxx/test/libcxx/transitive_includes/expected.format
    libcxx/test/libcxx/transitive_includes/expected.forward_list
    libcxx/test/libcxx/transitive_includes/expected.fstream
    libcxx/test/libcxx/transitive_includes/expected.functional
    libcxx/test/libcxx/transitive_includes/expected.future
    libcxx/test/libcxx/transitive_includes/expected.initializer_list
    libcxx/test/libcxx/transitive_includes/expected.iomanip
    libcxx/test/libcxx/transitive_includes/expected.ios
    libcxx/test/libcxx/transitive_includes/expected.iosfwd
    libcxx/test/libcxx/transitive_includes/expected.iostream
    libcxx/test/libcxx/transitive_includes/expected.istream
    libcxx/test/libcxx/transitive_includes/expected.iterator
    libcxx/test/libcxx/transitive_includes/expected.latch
    libcxx/test/libcxx/transitive_includes/expected.limits
    libcxx/test/libcxx/transitive_includes/expected.list
    libcxx/test/libcxx/transitive_includes/expected.locale
    libcxx/test/libcxx/transitive_includes/expected.map
    libcxx/test/libcxx/transitive_includes/expected.memory
    libcxx/test/libcxx/transitive_includes/expected.mutex
    libcxx/test/libcxx/transitive_includes/expected.new
    libcxx/test/libcxx/transitive_includes/expected.numbers
    libcxx/test/libcxx/transitive_includes/expected.numeric
    libcxx/test/libcxx/transitive_includes/expected.optional
    libcxx/test/libcxx/transitive_includes/expected.ostream
    libcxx/test/libcxx/transitive_includes/expected.queue
    libcxx/test/libcxx/transitive_includes/expected.random
    libcxx/test/libcxx/transitive_includes/expected.ranges
    libcxx/test/libcxx/transitive_includes/expected.ratio
    libcxx/test/libcxx/transitive_includes/expected.regex
    libcxx/test/libcxx/transitive_includes/expected.scoped_allocator
    libcxx/test/libcxx/transitive_includes/expected.semaphore
    libcxx/test/libcxx/transitive_includes/expected.set
    libcxx/test/libcxx/transitive_includes/expected.shared_mutex
    libcxx/test/libcxx/transitive_includes/expected.span
    libcxx/test/libcxx/transitive_includes/expected.sstream
    libcxx/test/libcxx/transitive_includes/expected.stack
    libcxx/test/libcxx/transitive_includes/expected.stdexcept
    libcxx/test/libcxx/transitive_includes/expected.streambuf
    libcxx/test/libcxx/transitive_includes/expected.string
    libcxx/test/libcxx/transitive_includes/expected.string_view
    libcxx/test/libcxx/transitive_includes/expected.strstream
    libcxx/test/libcxx/transitive_includes/expected.system_error
    libcxx/test/libcxx/transitive_includes/expected.thread
    libcxx/test/libcxx/transitive_includes/expected.tuple
    libcxx/test/libcxx/transitive_includes/expected.type_traits
    libcxx/test/libcxx/transitive_includes/expected.typeindex
    libcxx/test/libcxx/transitive_includes/expected.typeinfo
    libcxx/test/libcxx/transitive_includes/expected.unordered_map
    libcxx/test/libcxx/transitive_includes/expected.unordered_set
    libcxx/test/libcxx/transitive_includes/expected.utility
    libcxx/test/libcxx/transitive_includes/expected.valarray
    libcxx/test/libcxx/transitive_includes/expected.variant
    libcxx/test/libcxx/transitive_includes/expected.vector
    libcxx/test/libcxx/transitive_includes/expected.version

Modified: 
    libcxx/include/__debug
    libcxx/include/locale
    libcxx/test/libcxx/selftest/dsl/lit.local.cfg
    libcxx/utils/generate_header_tests.py

Removed: 
    libcxx/test/libcxx/lint/lit.local.cfg


################################################################################
diff  --git a/libcxx/include/__debug b/libcxx/include/__debug
index 403710600b0d6..d3dd202b54ab2 100644
--- a/libcxx/include/__debug
+++ b/libcxx/include/__debug
@@ -12,6 +12,7 @@
 
 #include <__assert>
 #include <__config>
+#include <cstddef>
 #include <type_traits>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -51,10 +52,6 @@
 
 #if defined(_LIBCPP_ENABLE_DEBUG_MODE) || defined(_LIBCPP_BUILDING_LIBRARY)
 
-#include <cstddef>
-#include <cstdio>
-#include <cstdlib>
-
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 struct _LIBCPP_TYPE_VIS __c_node;

diff  --git a/libcxx/include/locale b/libcxx/include/locale
index b95a64168777e..8ac2aacb6edfe 100644
--- a/libcxx/include/locale
+++ b/libcxx/include/locale
@@ -201,9 +201,7 @@ template <class charT> class messages_byname;
 #include <__iterator/istreambuf_iterator.h>
 #include <__iterator/ostreambuf_iterator.h>
 #include <__locale>
-#ifndef __APPLE__
-# include <cstdarg>
-#endif
+#include <cstdarg> // TODO: Remove this include
 #include <cstdio>
 #include <cstdlib>
 #include <ctime>

diff  --git a/libcxx/test/libcxx/lint/lit.local.cfg b/libcxx/test/libcxx/lit.local.cfg
similarity index 100%
rename from libcxx/test/libcxx/lint/lit.local.cfg
rename to libcxx/test/libcxx/lit.local.cfg

diff  --git a/libcxx/test/libcxx/selftest/dsl/lit.local.cfg b/libcxx/test/libcxx/selftest/dsl/lit.local.cfg
index ccadd41765a7e..ce4a323468161 100644
--- a/libcxx/test/libcxx/selftest/dsl/lit.local.cfg
+++ b/libcxx/test/libcxx/selftest/dsl/lit.local.cfg
@@ -12,7 +12,3 @@ import base64, lit.util, pickle
 base64Encode = lambda s: lit.util.to_string(base64.b64encode(lit.util.to_bytes(s)))
 escapedSubstitutions = base64Encode(pickle.dumps(config.substitutions))
 config.substitutions.append(('%{substitutions}', escapedSubstitutions))
-
-# The tests in this directory need to run Python
-import pipes, sys
-config.substitutions.append(('%{python}', pipes.quote(sys.executable)))

diff  --git a/libcxx/test/libcxx/transitive_includes.sanitize.py b/libcxx/test/libcxx/transitive_includes.sanitize.py
new file mode 100755
index 0000000000000..caf2b2cf8b4c7
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes.sanitize.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+#===----------------------------------------------------------------------===##
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===----------------------------------------------------------------------===##
+
+# This script reads lines from standard input and looks for the names of public C++ headers.
+# Specifically, it looks for lines of the form 'c++/v1/header' where 'header' is the name
+# of a public C++ header, excluding C compatibility headers.
+
+import os
+import re
+import sys
+
+headers = []
+for line in sys.stdin.readlines():
+  match = re.search('c\+\+/v[0-9]+/(.+)', line)
+  if not match:
+    continue
+
+  header = match.group(1)
+  if os.path.basename(header).endswith('.h'): # Skip C headers
+    continue
+
+  if os.path.basename(header).startswith('__'): # Skip internal headers
+    continue
+
+  headers.append(header)
+
+print('\n'.join(sorted(set(headers))))

diff  --git a/libcxx/test/libcxx/transitive_includes.sh.cpp b/libcxx/test/libcxx/transitive_includes.sh.cpp
new file mode 100644
index 0000000000000..7c4ff67d62e42
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes.sh.cpp
@@ -0,0 +1,674 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// Test that we don't remove transitive includes of public C++ headers in the library accidentally.
+// When we remove a transitive public include, clients tend to break because they don't always
+// properly include what they use. Note that we don't check which system (C) headers are
+// included transitively, because that is too unstable across platforms, and hence 
diff icult
+// to test for.
+//
+// This is not meant to block libc++ from removing unused transitive includes
+// forever, however we do try to group removals for a couple of releases
+// to avoid breaking users at every release.
+
+// This test doesn't support being run when some headers are not available, since we
+// would need to add significant complexity to make that work.
+// UNSUPPORTED: no-localization, no-threads, no-wide-characters, no-filesystem, libcpp-has-no-incomplete-format, libcpp-has-no-incomplete-ranges
+
+// This test only supports being run with the latest Standard, otherwise we'd
+// have to support various versions of the test.
+// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
+
+// When built with modules, this test doesn't work because --trace-includes doesn't
+// report the stack of includes correctly.
+// UNSUPPORTED: modules-build
+
+// This test uses --trace-includes, which is not supported by GCC.
+// UNSUPPORTED: gcc
+
+// This test doesn't work on AIX or Windows, but it should. Needs investigation.
+// XFAIL: buildhost=aix6, buildhost=windows
+
+// Prevent <ext/hash_map> from generating deprecated warnings for this test.
+#if defined(__DEPRECATED)
+#    undef __DEPRECATED
+#endif
+
+/*
+BEGIN-SCRIPT
+
+import re
+
+# To re-generate the list of expected headers, temporarily set this to True, re-generate
+# the file and run this test.
+regenerate_expected_results = False
+
+# Used because the sequence of tokens RUN : can't appear anywhere or it'll confuse Lit.
+RUN = "RUN"
+
+if regenerate_expected_results:
+  print(f"// {RUN}: rm -rf %S/transitive_includes")
+  print(f"// {RUN}: mkdir %S/transitive_includes")
+
+for i, header in enumerate(public_headers):
+  if header.endswith('.h'): # Skip C compatibility headers
+    continue
+
+  normalized_header = re.sub('/', '_', header)
+  trace_includes = "%{{cxx}} %s %{{flags}} %{{compile_flags}} --trace-includes -fsyntax-only -DTEST_{} 2>&1".format(i)
+  if regenerate_expected_results:
+    print(f"// {RUN}: {trace_includes} | %{{python}} %S/transitive_includes.sanitize.py > %S/transitive_includes/expected.{normalized_header}")
+  else:
+    print(f"// {RUN}: {trace_includes} | %{{python}} %S/transitive_includes.sanitize.py > %t.actual.{normalized_header}")
+    print(f"// {RUN}: 
diff  %S/transitive_includes/expected.{normalized_header} %t.actual.{normalized_header}")
+
+  print("#if defined(TEST_{})".format(i))
+  print("#include <{}>".format(header))
+  print("#endif")
+
+END-SCRIPT
+*/
+
+// DO NOT MANUALLY EDIT ANYTHING BETWEEN THE MARKERS BELOW
+// GENERATED-MARKER
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_0 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.algorithm
+// RUN: 
diff  %S/transitive_includes/expected.algorithm %t.actual.algorithm
+#if defined(TEST_0)
+#include <algorithm>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_1 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.any
+// RUN: 
diff  %S/transitive_includes/expected.any %t.actual.any
+#if defined(TEST_1)
+#include <any>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_2 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.array
+// RUN: 
diff  %S/transitive_includes/expected.array %t.actual.array
+#if defined(TEST_2)
+#include <array>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_3 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.atomic
+// RUN: 
diff  %S/transitive_includes/expected.atomic %t.actual.atomic
+#if defined(TEST_3)
+#include <atomic>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_4 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.barrier
+// RUN: 
diff  %S/transitive_includes/expected.barrier %t.actual.barrier
+#if defined(TEST_4)
+#include <barrier>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_5 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.bit
+// RUN: 
diff  %S/transitive_includes/expected.bit %t.actual.bit
+#if defined(TEST_5)
+#include <bit>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_6 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.bitset
+// RUN: 
diff  %S/transitive_includes/expected.bitset %t.actual.bitset
+#if defined(TEST_6)
+#include <bitset>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_7 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cassert
+// RUN: 
diff  %S/transitive_includes/expected.cassert %t.actual.cassert
+#if defined(TEST_7)
+#include <cassert>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_8 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ccomplex
+// RUN: 
diff  %S/transitive_includes/expected.ccomplex %t.actual.ccomplex
+#if defined(TEST_8)
+#include <ccomplex>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_9 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cctype
+// RUN: 
diff  %S/transitive_includes/expected.cctype %t.actual.cctype
+#if defined(TEST_9)
+#include <cctype>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_10 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cerrno
+// RUN: 
diff  %S/transitive_includes/expected.cerrno %t.actual.cerrno
+#if defined(TEST_10)
+#include <cerrno>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_11 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cfenv
+// RUN: 
diff  %S/transitive_includes/expected.cfenv %t.actual.cfenv
+#if defined(TEST_11)
+#include <cfenv>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_12 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cfloat
+// RUN: 
diff  %S/transitive_includes/expected.cfloat %t.actual.cfloat
+#if defined(TEST_12)
+#include <cfloat>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_13 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.charconv
+// RUN: 
diff  %S/transitive_includes/expected.charconv %t.actual.charconv
+#if defined(TEST_13)
+#include <charconv>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_14 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.chrono
+// RUN: 
diff  %S/transitive_includes/expected.chrono %t.actual.chrono
+#if defined(TEST_14)
+#include <chrono>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_15 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cinttypes
+// RUN: 
diff  %S/transitive_includes/expected.cinttypes %t.actual.cinttypes
+#if defined(TEST_15)
+#include <cinttypes>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_16 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ciso646
+// RUN: 
diff  %S/transitive_includes/expected.ciso646 %t.actual.ciso646
+#if defined(TEST_16)
+#include <ciso646>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_17 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.climits
+// RUN: 
diff  %S/transitive_includes/expected.climits %t.actual.climits
+#if defined(TEST_17)
+#include <climits>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_18 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.clocale
+// RUN: 
diff  %S/transitive_includes/expected.clocale %t.actual.clocale
+#if defined(TEST_18)
+#include <clocale>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_19 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cmath
+// RUN: 
diff  %S/transitive_includes/expected.cmath %t.actual.cmath
+#if defined(TEST_19)
+#include <cmath>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_20 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.codecvt
+// RUN: 
diff  %S/transitive_includes/expected.codecvt %t.actual.codecvt
+#if defined(TEST_20)
+#include <codecvt>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_21 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.compare
+// RUN: 
diff  %S/transitive_includes/expected.compare %t.actual.compare
+#if defined(TEST_21)
+#include <compare>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_22 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.complex
+// RUN: 
diff  %S/transitive_includes/expected.complex %t.actual.complex
+#if defined(TEST_22)
+#include <complex>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_24 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.concepts
+// RUN: 
diff  %S/transitive_includes/expected.concepts %t.actual.concepts
+#if defined(TEST_24)
+#include <concepts>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_25 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.condition_variable
+// RUN: 
diff  %S/transitive_includes/expected.condition_variable %t.actual.condition_variable
+#if defined(TEST_25)
+#include <condition_variable>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_26 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.coroutine
+// RUN: 
diff  %S/transitive_includes/expected.coroutine %t.actual.coroutine
+#if defined(TEST_26)
+#include <coroutine>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_27 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.csetjmp
+// RUN: 
diff  %S/transitive_includes/expected.csetjmp %t.actual.csetjmp
+#if defined(TEST_27)
+#include <csetjmp>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_28 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.csignal
+// RUN: 
diff  %S/transitive_includes/expected.csignal %t.actual.csignal
+#if defined(TEST_28)
+#include <csignal>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_29 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cstdarg
+// RUN: 
diff  %S/transitive_includes/expected.cstdarg %t.actual.cstdarg
+#if defined(TEST_29)
+#include <cstdarg>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_30 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cstdbool
+// RUN: 
diff  %S/transitive_includes/expected.cstdbool %t.actual.cstdbool
+#if defined(TEST_30)
+#include <cstdbool>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_31 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cstddef
+// RUN: 
diff  %S/transitive_includes/expected.cstddef %t.actual.cstddef
+#if defined(TEST_31)
+#include <cstddef>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_32 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cstdint
+// RUN: 
diff  %S/transitive_includes/expected.cstdint %t.actual.cstdint
+#if defined(TEST_32)
+#include <cstdint>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_33 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cstdio
+// RUN: 
diff  %S/transitive_includes/expected.cstdio %t.actual.cstdio
+#if defined(TEST_33)
+#include <cstdio>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_34 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cstdlib
+// RUN: 
diff  %S/transitive_includes/expected.cstdlib %t.actual.cstdlib
+#if defined(TEST_34)
+#include <cstdlib>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_35 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cstring
+// RUN: 
diff  %S/transitive_includes/expected.cstring %t.actual.cstring
+#if defined(TEST_35)
+#include <cstring>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_36 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ctgmath
+// RUN: 
diff  %S/transitive_includes/expected.ctgmath %t.actual.ctgmath
+#if defined(TEST_36)
+#include <ctgmath>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_37 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ctime
+// RUN: 
diff  %S/transitive_includes/expected.ctime %t.actual.ctime
+#if defined(TEST_37)
+#include <ctime>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_39 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cuchar
+// RUN: 
diff  %S/transitive_includes/expected.cuchar %t.actual.cuchar
+#if defined(TEST_39)
+#include <cuchar>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_40 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cwchar
+// RUN: 
diff  %S/transitive_includes/expected.cwchar %t.actual.cwchar
+#if defined(TEST_40)
+#include <cwchar>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_41 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.cwctype
+// RUN: 
diff  %S/transitive_includes/expected.cwctype %t.actual.cwctype
+#if defined(TEST_41)
+#include <cwctype>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_42 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.deque
+// RUN: 
diff  %S/transitive_includes/expected.deque %t.actual.deque
+#if defined(TEST_42)
+#include <deque>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_44 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.exception
+// RUN: 
diff  %S/transitive_includes/expected.exception %t.actual.exception
+#if defined(TEST_44)
+#include <exception>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_45 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.execution
+// RUN: 
diff  %S/transitive_includes/expected.execution %t.actual.execution
+#if defined(TEST_45)
+#include <execution>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_47 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.filesystem
+// RUN: 
diff  %S/transitive_includes/expected.filesystem %t.actual.filesystem
+#if defined(TEST_47)
+#include <filesystem>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_49 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.format
+// RUN: 
diff  %S/transitive_includes/expected.format %t.actual.format
+#if defined(TEST_49)
+#include <format>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_50 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.forward_list
+// RUN: 
diff  %S/transitive_includes/expected.forward_list %t.actual.forward_list
+#if defined(TEST_50)
+#include <forward_list>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_51 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.fstream
+// RUN: 
diff  %S/transitive_includes/expected.fstream %t.actual.fstream
+#if defined(TEST_51)
+#include <fstream>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_52 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.functional
+// RUN: 
diff  %S/transitive_includes/expected.functional %t.actual.functional
+#if defined(TEST_52)
+#include <functional>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_53 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.future
+// RUN: 
diff  %S/transitive_includes/expected.future %t.actual.future
+#if defined(TEST_53)
+#include <future>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_54 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.initializer_list
+// RUN: 
diff  %S/transitive_includes/expected.initializer_list %t.actual.initializer_list
+#if defined(TEST_54)
+#include <initializer_list>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_56 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.iomanip
+// RUN: 
diff  %S/transitive_includes/expected.iomanip %t.actual.iomanip
+#if defined(TEST_56)
+#include <iomanip>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_57 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ios
+// RUN: 
diff  %S/transitive_includes/expected.ios %t.actual.ios
+#if defined(TEST_57)
+#include <ios>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_58 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.iosfwd
+// RUN: 
diff  %S/transitive_includes/expected.iosfwd %t.actual.iosfwd
+#if defined(TEST_58)
+#include <iosfwd>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_59 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.iostream
+// RUN: 
diff  %S/transitive_includes/expected.iostream %t.actual.iostream
+#if defined(TEST_59)
+#include <iostream>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_60 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.istream
+// RUN: 
diff  %S/transitive_includes/expected.istream %t.actual.istream
+#if defined(TEST_60)
+#include <istream>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_61 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.iterator
+// RUN: 
diff  %S/transitive_includes/expected.iterator %t.actual.iterator
+#if defined(TEST_61)
+#include <iterator>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_62 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.latch
+// RUN: 
diff  %S/transitive_includes/expected.latch %t.actual.latch
+#if defined(TEST_62)
+#include <latch>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_63 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.limits
+// RUN: 
diff  %S/transitive_includes/expected.limits %t.actual.limits
+#if defined(TEST_63)
+#include <limits>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_65 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.list
+// RUN: 
diff  %S/transitive_includes/expected.list %t.actual.list
+#if defined(TEST_65)
+#include <list>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_66 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.locale
+// RUN: 
diff  %S/transitive_includes/expected.locale %t.actual.locale
+#if defined(TEST_66)
+#include <locale>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_68 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.map
+// RUN: 
diff  %S/transitive_includes/expected.map %t.actual.map
+#if defined(TEST_68)
+#include <map>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_70 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.memory
+// RUN: 
diff  %S/transitive_includes/expected.memory %t.actual.memory
+#if defined(TEST_70)
+#include <memory>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_71 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.mutex
+// RUN: 
diff  %S/transitive_includes/expected.mutex %t.actual.mutex
+#if defined(TEST_71)
+#include <mutex>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_72 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.new
+// RUN: 
diff  %S/transitive_includes/expected.new %t.actual.new
+#if defined(TEST_72)
+#include <new>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_73 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.numbers
+// RUN: 
diff  %S/transitive_includes/expected.numbers %t.actual.numbers
+#if defined(TEST_73)
+#include <numbers>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_74 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.numeric
+// RUN: 
diff  %S/transitive_includes/expected.numeric %t.actual.numeric
+#if defined(TEST_74)
+#include <numeric>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_75 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.optional
+// RUN: 
diff  %S/transitive_includes/expected.optional %t.actual.optional
+#if defined(TEST_75)
+#include <optional>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_76 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ostream
+// RUN: 
diff  %S/transitive_includes/expected.ostream %t.actual.ostream
+#if defined(TEST_76)
+#include <ostream>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_77 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.queue
+// RUN: 
diff  %S/transitive_includes/expected.queue %t.actual.queue
+#if defined(TEST_77)
+#include <queue>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_78 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.random
+// RUN: 
diff  %S/transitive_includes/expected.random %t.actual.random
+#if defined(TEST_78)
+#include <random>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_79 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ranges
+// RUN: 
diff  %S/transitive_includes/expected.ranges %t.actual.ranges
+#if defined(TEST_79)
+#include <ranges>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_80 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ratio
+// RUN: 
diff  %S/transitive_includes/expected.ratio %t.actual.ratio
+#if defined(TEST_80)
+#include <ratio>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_81 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.regex
+// RUN: 
diff  %S/transitive_includes/expected.regex %t.actual.regex
+#if defined(TEST_81)
+#include <regex>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_82 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.scoped_allocator
+// RUN: 
diff  %S/transitive_includes/expected.scoped_allocator %t.actual.scoped_allocator
+#if defined(TEST_82)
+#include <scoped_allocator>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_83 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.semaphore
+// RUN: 
diff  %S/transitive_includes/expected.semaphore %t.actual.semaphore
+#if defined(TEST_83)
+#include <semaphore>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_84 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.set
+// RUN: 
diff  %S/transitive_includes/expected.set %t.actual.set
+#if defined(TEST_84)
+#include <set>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_86 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.shared_mutex
+// RUN: 
diff  %S/transitive_includes/expected.shared_mutex %t.actual.shared_mutex
+#if defined(TEST_86)
+#include <shared_mutex>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_87 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.span
+// RUN: 
diff  %S/transitive_includes/expected.span %t.actual.span
+#if defined(TEST_87)
+#include <span>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_88 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.sstream
+// RUN: 
diff  %S/transitive_includes/expected.sstream %t.actual.sstream
+#if defined(TEST_88)
+#include <sstream>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_89 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.stack
+// RUN: 
diff  %S/transitive_includes/expected.stack %t.actual.stack
+#if defined(TEST_89)
+#include <stack>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_93 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.stdexcept
+// RUN: 
diff  %S/transitive_includes/expected.stdexcept %t.actual.stdexcept
+#if defined(TEST_93)
+#include <stdexcept>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_97 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.streambuf
+// RUN: 
diff  %S/transitive_includes/expected.streambuf %t.actual.streambuf
+#if defined(TEST_97)
+#include <streambuf>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_98 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.string
+// RUN: 
diff  %S/transitive_includes/expected.string %t.actual.string
+#if defined(TEST_98)
+#include <string>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_100 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.string_view
+// RUN: 
diff  %S/transitive_includes/expected.string_view %t.actual.string_view
+#if defined(TEST_100)
+#include <string_view>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_101 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.strstream
+// RUN: 
diff  %S/transitive_includes/expected.strstream %t.actual.strstream
+#if defined(TEST_101)
+#include <strstream>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_102 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.system_error
+// RUN: 
diff  %S/transitive_includes/expected.system_error %t.actual.system_error
+#if defined(TEST_102)
+#include <system_error>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_104 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.thread
+// RUN: 
diff  %S/transitive_includes/expected.thread %t.actual.thread
+#if defined(TEST_104)
+#include <thread>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_105 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.tuple
+// RUN: 
diff  %S/transitive_includes/expected.tuple %t.actual.tuple
+#if defined(TEST_105)
+#include <tuple>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_106 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.type_traits
+// RUN: 
diff  %S/transitive_includes/expected.type_traits %t.actual.type_traits
+#if defined(TEST_106)
+#include <type_traits>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_107 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.typeindex
+// RUN: 
diff  %S/transitive_includes/expected.typeindex %t.actual.typeindex
+#if defined(TEST_107)
+#include <typeindex>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_108 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.typeinfo
+// RUN: 
diff  %S/transitive_includes/expected.typeinfo %t.actual.typeinfo
+#if defined(TEST_108)
+#include <typeinfo>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_110 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.unordered_map
+// RUN: 
diff  %S/transitive_includes/expected.unordered_map %t.actual.unordered_map
+#if defined(TEST_110)
+#include <unordered_map>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_111 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.unordered_set
+// RUN: 
diff  %S/transitive_includes/expected.unordered_set %t.actual.unordered_set
+#if defined(TEST_111)
+#include <unordered_set>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_112 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.utility
+// RUN: 
diff  %S/transitive_includes/expected.utility %t.actual.utility
+#if defined(TEST_112)
+#include <utility>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_113 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.valarray
+// RUN: 
diff  %S/transitive_includes/expected.valarray %t.actual.valarray
+#if defined(TEST_113)
+#include <valarray>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_114 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.variant
+// RUN: 
diff  %S/transitive_includes/expected.variant %t.actual.variant
+#if defined(TEST_114)
+#include <variant>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_115 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.vector
+// RUN: 
diff  %S/transitive_includes/expected.vector %t.actual.vector
+#if defined(TEST_115)
+#include <vector>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_116 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.version
+// RUN: 
diff  %S/transitive_includes/expected.version %t.actual.version
+#if defined(TEST_116)
+#include <version>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_119 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_algorithm
+// RUN: 
diff  %S/transitive_includes/expected.experimental_algorithm %t.actual.experimental_algorithm
+#if defined(TEST_119)
+#include <experimental/algorithm>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_120 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_coroutine
+// RUN: 
diff  %S/transitive_includes/expected.experimental_coroutine %t.actual.experimental_coroutine
+#if defined(TEST_120)
+#include <experimental/coroutine>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_121 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_deque
+// RUN: 
diff  %S/transitive_includes/expected.experimental_deque %t.actual.experimental_deque
+#if defined(TEST_121)
+#include <experimental/deque>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_122 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_forward_list
+// RUN: 
diff  %S/transitive_includes/expected.experimental_forward_list %t.actual.experimental_forward_list
+#if defined(TEST_122)
+#include <experimental/forward_list>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_123 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_functional
+// RUN: 
diff  %S/transitive_includes/expected.experimental_functional %t.actual.experimental_functional
+#if defined(TEST_123)
+#include <experimental/functional>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_124 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_iterator
+// RUN: 
diff  %S/transitive_includes/expected.experimental_iterator %t.actual.experimental_iterator
+#if defined(TEST_124)
+#include <experimental/iterator>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_125 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_list
+// RUN: 
diff  %S/transitive_includes/expected.experimental_list %t.actual.experimental_list
+#if defined(TEST_125)
+#include <experimental/list>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_126 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_map
+// RUN: 
diff  %S/transitive_includes/expected.experimental_map %t.actual.experimental_map
+#if defined(TEST_126)
+#include <experimental/map>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_127 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_memory_resource
+// RUN: 
diff  %S/transitive_includes/expected.experimental_memory_resource %t.actual.experimental_memory_resource
+#if defined(TEST_127)
+#include <experimental/memory_resource>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_128 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_propagate_const
+// RUN: 
diff  %S/transitive_includes/expected.experimental_propagate_const %t.actual.experimental_propagate_const
+#if defined(TEST_128)
+#include <experimental/propagate_const>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_129 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_regex
+// RUN: 
diff  %S/transitive_includes/expected.experimental_regex %t.actual.experimental_regex
+#if defined(TEST_129)
+#include <experimental/regex>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_130 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_set
+// RUN: 
diff  %S/transitive_includes/expected.experimental_set %t.actual.experimental_set
+#if defined(TEST_130)
+#include <experimental/set>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_131 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_simd
+// RUN: 
diff  %S/transitive_includes/expected.experimental_simd %t.actual.experimental_simd
+#if defined(TEST_131)
+#include <experimental/simd>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_132 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_string
+// RUN: 
diff  %S/transitive_includes/expected.experimental_string %t.actual.experimental_string
+#if defined(TEST_132)
+#include <experimental/string>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_133 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_type_traits
+// RUN: 
diff  %S/transitive_includes/expected.experimental_type_traits %t.actual.experimental_type_traits
+#if defined(TEST_133)
+#include <experimental/type_traits>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_134 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_unordered_map
+// RUN: 
diff  %S/transitive_includes/expected.experimental_unordered_map %t.actual.experimental_unordered_map
+#if defined(TEST_134)
+#include <experimental/unordered_map>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_135 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_unordered_set
+// RUN: 
diff  %S/transitive_includes/expected.experimental_unordered_set %t.actual.experimental_unordered_set
+#if defined(TEST_135)
+#include <experimental/unordered_set>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_136 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_utility
+// RUN: 
diff  %S/transitive_includes/expected.experimental_utility %t.actual.experimental_utility
+#if defined(TEST_136)
+#include <experimental/utility>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_137 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.experimental_vector
+// RUN: 
diff  %S/transitive_includes/expected.experimental_vector %t.actual.experimental_vector
+#if defined(TEST_137)
+#include <experimental/vector>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_138 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ext_hash_map
+// RUN: 
diff  %S/transitive_includes/expected.ext_hash_map %t.actual.ext_hash_map
+#if defined(TEST_138)
+#include <ext/hash_map>
+#endif
+// RUN: %{cxx} %s %{flags} %{compile_flags} --trace-includes -fsyntax-only -DTEST_139 2>&1 | %{python} %S/transitive_includes.sanitize.py > %t.actual.ext_hash_set
+// RUN: 
diff  %S/transitive_includes/expected.ext_hash_set %t.actual.ext_hash_set
+#if defined(TEST_139)
+#include <ext/hash_set>
+#endif
+// GENERATED-MARKER

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.algorithm b/libcxx/test/libcxx/transitive_includes/expected.algorithm
new file mode 100644
index 0000000000000..8e539be98cbcc
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.algorithm
@@ -0,0 +1,24 @@
+algorithm
+atomic
+bit
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.any b/libcxx/test/libcxx/transitive_includes/expected.any
new file mode 100644
index 0000000000000..4f3cff5c06341
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.any
@@ -0,0 +1,23 @@
+any
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.array b/libcxx/test/libcxx/transitive_includes/expected.array
new file mode 100644
index 0000000000000..0fb1b67d13d02
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.array
@@ -0,0 +1,14 @@
+array
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+exception
+initializer_list
+iosfwd
+limits
+stdexcept
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.atomic b/libcxx/test/libcxx/transitive_includes/expected.atomic
new file mode 100644
index 0000000000000..42e3c191ac896
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.atomic
@@ -0,0 +1,11 @@
+atomic
+climits
+cstddef
+cstdint
+cstring
+ctime
+iosfwd
+limits
+ratio
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.barrier b/libcxx/test/libcxx/transitive_includes/expected.barrier
new file mode 100644
index 0000000000000..cb7845f45e0c1
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.barrier
@@ -0,0 +1,23 @@
+atomic
+barrier
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.bit b/libcxx/test/libcxx/transitive_includes/expected.bit
new file mode 100644
index 0000000000000..3f58643d60625
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.bit
@@ -0,0 +1,7 @@
+bit
+cstddef
+cstdint
+cstdlib
+limits
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.bitset b/libcxx/test/libcxx/transitive_includes/expected.bitset
new file mode 100644
index 0000000000000..d3ee4af66e1b9
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.bitset
@@ -0,0 +1,29 @@
+atomic
+bitset
+cctype
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+string
+string_view
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cassert b/libcxx/test/libcxx/transitive_includes/expected.cassert
new file mode 100644
index 0000000000000..69b779ef2f206
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cassert
@@ -0,0 +1 @@
+cassert

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ccomplex b/libcxx/test/libcxx/transitive_includes/expected.ccomplex
new file mode 100644
index 0000000000000..cfc2d04436fef
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ccomplex
@@ -0,0 +1,41 @@
+atomic
+bitset
+ccomplex
+cctype
+cerrno
+climits
+cmath
+compare
+complex
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+sstream
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cctype b/libcxx/test/libcxx/transitive_includes/expected.cctype
new file mode 100644
index 0000000000000..a82e62c088dce
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cctype
@@ -0,0 +1 @@
+cctype

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cerrno b/libcxx/test/libcxx/transitive_includes/expected.cerrno
new file mode 100644
index 0000000000000..24c00a9877c3b
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cerrno
@@ -0,0 +1 @@
+cerrno

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cfenv b/libcxx/test/libcxx/transitive_includes/expected.cfenv
new file mode 100644
index 0000000000000..9980586372456
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cfenv
@@ -0,0 +1 @@
+cfenv

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cfloat b/libcxx/test/libcxx/transitive_includes/expected.cfloat
new file mode 100644
index 0000000000000..3bb5aa14cfbfe
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cfloat
@@ -0,0 +1 @@
+cfloat

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.charconv b/libcxx/test/libcxx/transitive_includes/expected.charconv
new file mode 100644
index 0000000000000..5ce64d0c6a233
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.charconv
@@ -0,0 +1,11 @@
+cerrno
+charconv
+cmath
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+limits
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.chrono b/libcxx/test/libcxx/transitive_includes/expected.chrono
new file mode 100644
index 0000000000000..fdb624bc1df42
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.chrono
@@ -0,0 +1,11 @@
+chrono
+climits
+cmath
+compare
+cstddef
+cstdint
+ctime
+limits
+ratio
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cinttypes b/libcxx/test/libcxx/transitive_includes/expected.cinttypes
new file mode 100644
index 0000000000000..911d5dd27d082
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cinttypes
@@ -0,0 +1,2 @@
+cinttypes
+cstdint

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ciso646 b/libcxx/test/libcxx/transitive_includes/expected.ciso646
new file mode 100644
index 0000000000000..6c1d5458c9c9c
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ciso646
@@ -0,0 +1 @@
+ciso646

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.climits b/libcxx/test/libcxx/transitive_includes/expected.climits
new file mode 100644
index 0000000000000..271e000221016
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.climits
@@ -0,0 +1 @@
+climits

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.clocale b/libcxx/test/libcxx/transitive_includes/expected.clocale
new file mode 100644
index 0000000000000..0ac42c4b403ed
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.clocale
@@ -0,0 +1 @@
+clocale

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cmath b/libcxx/test/libcxx/transitive_includes/expected.cmath
new file mode 100644
index 0000000000000..7678c0e38802c
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cmath
@@ -0,0 +1,6 @@
+cmath
+cstddef
+cstdint
+limits
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.codecvt b/libcxx/test/libcxx/transitive_includes/expected.codecvt
new file mode 100644
index 0000000000000..f846715edf800
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.codecvt
@@ -0,0 +1,32 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+codecvt
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+mutex
+new
+ratio
+stdexcept
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.compare b/libcxx/test/libcxx/transitive_includes/expected.compare
new file mode 100644
index 0000000000000..df2d92f5d4b6c
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.compare
@@ -0,0 +1,7 @@
+cmath
+compare
+cstddef
+cstdint
+limits
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.complex b/libcxx/test/libcxx/transitive_includes/expected.complex
new file mode 100644
index 0000000000000..eb5fe7c87bf7a
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.complex
@@ -0,0 +1,40 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+complex
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+sstream
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.concepts b/libcxx/test/libcxx/transitive_includes/expected.concepts
new file mode 100644
index 0000000000000..31e9f436e6cd3
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.concepts
@@ -0,0 +1,5 @@
+concepts
+cstddef
+cstdint
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.condition_variable b/libcxx/test/libcxx/transitive_includes/expected.condition_variable
new file mode 100644
index 0000000000000..081849db56d28
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.condition_variable
@@ -0,0 +1,31 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+condition_variable
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.coroutine b/libcxx/test/libcxx/transitive_includes/expected.coroutine
new file mode 100644
index 0000000000000..1f31012bf5be6
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.coroutine
@@ -0,0 +1,9 @@
+cmath
+compare
+coroutine
+cstddef
+cstdint
+cstring
+limits
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.csetjmp b/libcxx/test/libcxx/transitive_includes/expected.csetjmp
new file mode 100644
index 0000000000000..2f72e67f0324d
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.csetjmp
@@ -0,0 +1 @@
+csetjmp

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.csignal b/libcxx/test/libcxx/transitive_includes/expected.csignal
new file mode 100644
index 0000000000000..c17f2a3b99dfb
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.csignal
@@ -0,0 +1 @@
+csignal

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cstdarg b/libcxx/test/libcxx/transitive_includes/expected.cstdarg
new file mode 100644
index 0000000000000..ce71517eeb149
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cstdarg
@@ -0,0 +1 @@
+cstdarg

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cstdbool b/libcxx/test/libcxx/transitive_includes/expected.cstdbool
new file mode 100644
index 0000000000000..f3a52bba86c16
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cstdbool
@@ -0,0 +1 @@
+cstdbool

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cstddef b/libcxx/test/libcxx/transitive_includes/expected.cstddef
new file mode 100644
index 0000000000000..7b45506ea14b3
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cstddef
@@ -0,0 +1,2 @@
+cstddef
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cstdint b/libcxx/test/libcxx/transitive_includes/expected.cstdint
new file mode 100644
index 0000000000000..37103a4f4b892
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cstdint
@@ -0,0 +1 @@
+cstdint

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cstdio b/libcxx/test/libcxx/transitive_includes/expected.cstdio
new file mode 100644
index 0000000000000..5b70aa3cf8d42
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cstdio
@@ -0,0 +1 @@
+cstdio

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cstdlib b/libcxx/test/libcxx/transitive_includes/expected.cstdlib
new file mode 100644
index 0000000000000..b98a7237dde79
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cstdlib
@@ -0,0 +1 @@
+cstdlib

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cstring b/libcxx/test/libcxx/transitive_includes/expected.cstring
new file mode 100644
index 0000000000000..0fdbe597c9df1
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cstring
@@ -0,0 +1 @@
+cstring

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ctgmath b/libcxx/test/libcxx/transitive_includes/expected.ctgmath
new file mode 100644
index 0000000000000..ac37b74ac56e2
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ctgmath
@@ -0,0 +1,42 @@
+atomic
+bitset
+ccomplex
+cctype
+cerrno
+climits
+cmath
+compare
+complex
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctgmath
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+sstream
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ctime b/libcxx/test/libcxx/transitive_includes/expected.ctime
new file mode 100644
index 0000000000000..ee049c40b25b3
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ctime
@@ -0,0 +1 @@
+ctime

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cuchar b/libcxx/test/libcxx/transitive_includes/expected.cuchar
new file mode 100644
index 0000000000000..588664ab50b3f
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cuchar
@@ -0,0 +1 @@
+cuchar

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cwchar b/libcxx/test/libcxx/transitive_includes/expected.cwchar
new file mode 100644
index 0000000000000..1e6c2091fa4a0
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cwchar
@@ -0,0 +1,3 @@
+cctype
+cwchar
+cwctype

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.cwctype b/libcxx/test/libcxx/transitive_includes/expected.cwctype
new file mode 100644
index 0000000000000..fa1b7f2569941
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.cwctype
@@ -0,0 +1,2 @@
+cctype
+cwctype

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.deque b/libcxx/test/libcxx/transitive_includes/expected.deque
new file mode 100644
index 0000000000000..aa51131432eac
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.deque
@@ -0,0 +1,23 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+deque
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.exception b/libcxx/test/libcxx/transitive_includes/expected.exception
new file mode 100644
index 0000000000000..c48f9ed9e744d
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.exception
@@ -0,0 +1,6 @@
+cstddef
+cstdint
+cstdlib
+exception
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.execution b/libcxx/test/libcxx/transitive_includes/expected.execution
new file mode 100644
index 0000000000000..b42e7095b5800
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.execution
@@ -0,0 +1,2 @@
+execution
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_algorithm b/libcxx/test/libcxx/transitive_includes/expected.experimental_algorithm
new file mode 100644
index 0000000000000..7e307913a9fe4
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_algorithm
@@ -0,0 +1,25 @@
+algorithm
+atomic
+bit
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/algorithm
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_coroutine b/libcxx/test/libcxx/transitive_includes/expected.experimental_coroutine
new file mode 100644
index 0000000000000..89fc3edcec46d
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_coroutine
@@ -0,0 +1,23 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/coroutine
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_deque b/libcxx/test/libcxx/transitive_includes/expected.experimental_deque
new file mode 100644
index 0000000000000..e1677c7dd843b
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_deque
@@ -0,0 +1,27 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+deque
+exception
+experimental/deque
+experimental/memory_resource
+experimental/utility
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_forward_list b/libcxx/test/libcxx/transitive_includes/expected.experimental_forward_list
new file mode 100644
index 0000000000000..af433ce909496
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_forward_list
@@ -0,0 +1,27 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/forward_list
+experimental/memory_resource
+experimental/utility
+forward_list
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_functional b/libcxx/test/libcxx/transitive_includes/expected.experimental_functional
new file mode 100644
index 0000000000000..ce502b5e98035
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_functional
@@ -0,0 +1,28 @@
+array
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/functional
+functional
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+unordered_map
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_iterator b/libcxx/test/libcxx/transitive_includes/expected.experimental_iterator
new file mode 100644
index 0000000000000..83a9b8d93c65e
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_iterator
@@ -0,0 +1,18 @@
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+exception
+experimental/iterator
+initializer_list
+iosfwd
+iterator
+limits
+new
+tuple
+type_traits
+variant
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_list b/libcxx/test/libcxx/transitive_includes/expected.experimental_list
new file mode 100644
index 0000000000000..aae9f23d08e97
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_list
@@ -0,0 +1,27 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/list
+experimental/memory_resource
+experimental/utility
+initializer_list
+iosfwd
+limits
+list
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_map b/libcxx/test/libcxx/transitive_includes/expected.experimental_map
new file mode 100644
index 0000000000000..cb76c7642ec9c
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_map
@@ -0,0 +1,28 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/map
+experimental/memory_resource
+experimental/utility
+initializer_list
+iosfwd
+limits
+map
+memory
+new
+optional
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_memory_resource b/libcxx/test/libcxx/transitive_includes/expected.experimental_memory_resource
new file mode 100644
index 0000000000000..67d2441ae3691
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_memory_resource
@@ -0,0 +1,25 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/memory_resource
+experimental/utility
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_propagate_const b/libcxx/test/libcxx/transitive_includes/expected.experimental_propagate_const
new file mode 100644
index 0000000000000..a78fa83bc983f
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_propagate_const
@@ -0,0 +1,5 @@
+cstddef
+cstdint
+experimental/propagate_const
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_regex b/libcxx/test/libcxx/transitive_includes/expected.experimental_regex
new file mode 100644
index 0000000000000..6490adb5a1b4e
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_regex
@@ -0,0 +1,39 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+deque
+exception
+experimental/memory_resource
+experimental/regex
+experimental/string
+experimental/utility
+initializer_list
+iosfwd
+limits
+memory
+mutex
+new
+ratio
+regex
+stdexcept
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+utility
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_set b/libcxx/test/libcxx/transitive_includes/expected.experimental_set
new file mode 100644
index 0000000000000..03a09aff0574b
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_set
@@ -0,0 +1,28 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/memory_resource
+experimental/set
+experimental/utility
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+set
+stdexcept
+tuple
+type_traits
+typeinfo
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_simd b/libcxx/test/libcxx/transitive_includes/expected.experimental_simd
new file mode 100644
index 0000000000000..999b0aafb666a
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_simd
@@ -0,0 +1,16 @@
+array
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+exception
+experimental/simd
+initializer_list
+iosfwd
+limits
+stdexcept
+tuple
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_string b/libcxx/test/libcxx/transitive_includes/expected.experimental_string
new file mode 100644
index 0000000000000..4fb05391c7b46
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_string
@@ -0,0 +1,32 @@
+atomic
+cctype
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+experimental/memory_resource
+experimental/string
+experimental/utility
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+string
+string_view
+tuple
+type_traits
+typeinfo
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_type_traits b/libcxx/test/libcxx/transitive_includes/expected.experimental_type_traits
new file mode 100644
index 0000000000000..c1e83e731fbd2
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_type_traits
@@ -0,0 +1,6 @@
+cstddef
+cstdint
+experimental/type_traits
+initializer_list
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_map b/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_map
new file mode 100644
index 0000000000000..04efa3377d816
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_map
@@ -0,0 +1,28 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/memory_resource
+experimental/unordered_map
+experimental/utility
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+unordered_map
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_set b/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_set
new file mode 100644
index 0000000000000..798b920506cfa
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_unordered_set
@@ -0,0 +1,28 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/memory_resource
+experimental/unordered_set
+experimental/utility
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+unordered_set
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_utility b/libcxx/test/libcxx/transitive_includes/expected.experimental_utility
new file mode 100644
index 0000000000000..788283fb30b9c
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_utility
@@ -0,0 +1,11 @@
+cmath
+compare
+cstddef
+cstdint
+cstdlib
+experimental/utility
+initializer_list
+limits
+type_traits
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.experimental_vector b/libcxx/test/libcxx/transitive_includes/expected.experimental_vector
new file mode 100644
index 0000000000000..35355e4d3547e
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.experimental_vector
@@ -0,0 +1,27 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+experimental/memory_resource
+experimental/utility
+experimental/vector
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+utility
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ext_hash_map b/libcxx/test/libcxx/transitive_includes/expected.ext_hash_map
new file mode 100644
index 0000000000000..238ba8fade717
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ext_hash_map
@@ -0,0 +1,36 @@
+algorithm
+array
+atomic
+bit
+cctype
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+ext/hash_map
+functional
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+stdexcept
+string
+string_view
+tuple
+type_traits
+typeinfo
+unordered_map
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ext_hash_set b/libcxx/test/libcxx/transitive_includes/expected.ext_hash_set
new file mode 100644
index 0000000000000..5e58c46663a50
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ext_hash_set
@@ -0,0 +1,36 @@
+algorithm
+array
+atomic
+bit
+cctype
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+ext/hash_set
+functional
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+stdexcept
+string
+string_view
+tuple
+type_traits
+typeinfo
+unordered_map
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.filesystem b/libcxx/test/libcxx/transitive_includes/expected.filesystem
new file mode 100644
index 0000000000000..adc5812121df0
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.filesystem
@@ -0,0 +1,40 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+filesystem
+initializer_list
+iomanip
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.format b/libcxx/test/libcxx/transitive_includes/expected.format
new file mode 100644
index 0000000000000..d88f3f66919f8
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.format
@@ -0,0 +1,40 @@
+array
+atomic
+bit
+cctype
+cerrno
+charconv
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+format
+initializer_list
+ios
+iosfwd
+limits
+locale
+memory
+mutex
+new
+optional
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.forward_list b/libcxx/test/libcxx/transitive_includes/expected.forward_list
new file mode 100644
index 0000000000000..de184d39a0dae
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.forward_list
@@ -0,0 +1,23 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+forward_list
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.fstream b/libcxx/test/libcxx/transitive_includes/expected.fstream
new file mode 100644
index 0000000000000..31ef4da046304
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.fstream
@@ -0,0 +1,41 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+filesystem
+fstream
+initializer_list
+iomanip
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.functional b/libcxx/test/libcxx/transitive_includes/expected.functional
new file mode 100644
index 0000000000000..944f5a2cedd79
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.functional
@@ -0,0 +1,27 @@
+array
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+functional
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+unordered_map
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.future b/libcxx/test/libcxx/transitive_includes/expected.future
new file mode 100644
index 0000000000000..978baba9b8ecb
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.future
@@ -0,0 +1,33 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+future
+initializer_list
+iosfwd
+limits
+memory
+mutex
+new
+ratio
+stdexcept
+string
+string_view
+system_error
+thread
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.initializer_list b/libcxx/test/libcxx/transitive_includes/expected.initializer_list
new file mode 100644
index 0000000000000..8b92a6553ca19
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.initializer_list
@@ -0,0 +1,3 @@
+cstddef
+initializer_list
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.iomanip b/libcxx/test/libcxx/transitive_includes/expected.iomanip
new file mode 100644
index 0000000000000..86446ab031fbf
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.iomanip
@@ -0,0 +1,39 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iomanip
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ios b/libcxx/test/libcxx/transitive_includes/expected.ios
new file mode 100644
index 0000000000000..3ecae9323ab41
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ios
@@ -0,0 +1,32 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+limits
+memory
+mutex
+new
+ratio
+stdexcept
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.iosfwd b/libcxx/test/libcxx/transitive_includes/expected.iosfwd
new file mode 100644
index 0000000000000..ff6e0e3d092b7
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.iosfwd
@@ -0,0 +1,2 @@
+iosfwd
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.iostream b/libcxx/test/libcxx/transitive_includes/expected.iostream
new file mode 100644
index 0000000000000..2e4e74cc18b47
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.iostream
@@ -0,0 +1,39 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+iostream
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.istream b/libcxx/test/libcxx/transitive_includes/expected.istream
new file mode 100644
index 0000000000000..cbd4a87c16134
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.istream
@@ -0,0 +1,38 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.iterator b/libcxx/test/libcxx/transitive_includes/expected.iterator
new file mode 100644
index 0000000000000..698f6cf9de2f0
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.iterator
@@ -0,0 +1,17 @@
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+exception
+initializer_list
+iosfwd
+iterator
+limits
+new
+tuple
+type_traits
+variant
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.latch b/libcxx/test/libcxx/transitive_includes/expected.latch
new file mode 100644
index 0000000000000..3d00941b92311
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.latch
@@ -0,0 +1,12 @@
+atomic
+climits
+cstddef
+cstdint
+cstring
+ctime
+iosfwd
+latch
+limits
+ratio
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.limits b/libcxx/test/libcxx/transitive_includes/expected.limits
new file mode 100644
index 0000000000000..49fcbf44c5b21
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.limits
@@ -0,0 +1,5 @@
+cstddef
+cstdint
+limits
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.list b/libcxx/test/libcxx/transitive_includes/expected.list
new file mode 100644
index 0000000000000..96d4f33db7d4e
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.list
@@ -0,0 +1,23 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+list
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.locale b/libcxx/test/libcxx/transitive_includes/expected.locale
new file mode 100644
index 0000000000000..cdd6609f84403
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.locale
@@ -0,0 +1,35 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+limits
+locale
+memory
+mutex
+new
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.map b/libcxx/test/libcxx/transitive_includes/expected.map
new file mode 100644
index 0000000000000..a6896289ab3fd
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.map
@@ -0,0 +1,24 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+map
+memory
+new
+optional
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.memory b/libcxx/test/libcxx/transitive_includes/expected.memory
new file mode 100644
index 0000000000000..3b7a13de63fe8
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.memory
@@ -0,0 +1,22 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.mutex b/libcxx/test/libcxx/transitive_includes/expected.mutex
new file mode 100644
index 0000000000000..1aa71f549fd49
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.mutex
@@ -0,0 +1,31 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+mutex
+new
+ratio
+stdexcept
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.new b/libcxx/test/libcxx/transitive_includes/expected.new
new file mode 100644
index 0000000000000..9fd8f6aabd0c9
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.new
@@ -0,0 +1,7 @@
+cstddef
+cstdint
+cstdlib
+exception
+new
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.numbers b/libcxx/test/libcxx/transitive_includes/expected.numbers
new file mode 100644
index 0000000000000..a8b65fc82096b
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.numbers
@@ -0,0 +1,6 @@
+concepts
+cstddef
+cstdint
+numbers
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.numeric b/libcxx/test/libcxx/transitive_includes/expected.numeric
new file mode 100644
index 0000000000000..843582958e10f
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.numeric
@@ -0,0 +1,8 @@
+cmath
+concepts
+cstddef
+cstdint
+limits
+numeric
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.optional b/libcxx/test/libcxx/transitive_includes/expected.optional
new file mode 100644
index 0000000000000..e888c8f4e0bd4
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.optional
@@ -0,0 +1,15 @@
+cmath
+compare
+cstddef
+cstdint
+cstdlib
+cstring
+exception
+initializer_list
+iosfwd
+limits
+new
+optional
+stdexcept
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ostream b/libcxx/test/libcxx/transitive_includes/expected.ostream
new file mode 100644
index 0000000000000..1d7da3e2f96dc
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ostream
@@ -0,0 +1,37 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.queue b/libcxx/test/libcxx/transitive_includes/expected.queue
new file mode 100644
index 0000000000000..07743c837beb6
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.queue
@@ -0,0 +1,25 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+deque
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+queue
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.random b/libcxx/test/libcxx/transitive_includes/expected.random
new file mode 100644
index 0000000000000..c8060db2909ac
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.random
@@ -0,0 +1,32 @@
+atomic
+bit
+cctype
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+numeric
+random
+ratio
+stdexcept
+string
+string_view
+tuple
+type_traits
+typeinfo
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ranges b/libcxx/test/libcxx/transitive_includes/expected.ranges
new file mode 100644
index 0000000000000..f16d5e5d55052
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ranges
@@ -0,0 +1,22 @@
+array
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+exception
+initializer_list
+iosfwd
+iterator
+limits
+new
+optional
+ranges
+span
+stdexcept
+tuple
+type_traits
+variant
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.ratio b/libcxx/test/libcxx/transitive_includes/expected.ratio
new file mode 100644
index 0000000000000..deda945f1b575
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.ratio
@@ -0,0 +1,6 @@
+climits
+cstddef
+cstdint
+ratio
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.regex b/libcxx/test/libcxx/transitive_includes/expected.regex
new file mode 100644
index 0000000000000..447e31831d8fc
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.regex
@@ -0,0 +1,34 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+deque
+exception
+initializer_list
+iosfwd
+limits
+memory
+mutex
+new
+ratio
+regex
+stdexcept
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.scoped_allocator b/libcxx/test/libcxx/transitive_includes/expected.scoped_allocator
new file mode 100644
index 0000000000000..f4345de47a6ab
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.scoped_allocator
@@ -0,0 +1,23 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+scoped_allocator
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.semaphore b/libcxx/test/libcxx/transitive_includes/expected.semaphore
new file mode 100644
index 0000000000000..6893d09955064
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.semaphore
@@ -0,0 +1,12 @@
+atomic
+climits
+cstddef
+cstdint
+cstring
+ctime
+iosfwd
+limits
+ratio
+semaphore
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.set b/libcxx/test/libcxx/transitive_includes/expected.set
new file mode 100644
index 0000000000000..9b0f3cb52c187
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.set
@@ -0,0 +1,24 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+set
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.shared_mutex b/libcxx/test/libcxx/transitive_includes/expected.shared_mutex
new file mode 100644
index 0000000000000..2bd4140b3d11c
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.shared_mutex
@@ -0,0 +1,31 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+shared_mutex
+stdexcept
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.span b/libcxx/test/libcxx/transitive_includes/expected.span
new file mode 100644
index 0000000000000..4ec98478d7ab6
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.span
@@ -0,0 +1,15 @@
+array
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+exception
+initializer_list
+iosfwd
+limits
+span
+stdexcept
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.sstream b/libcxx/test/libcxx/transitive_includes/expected.sstream
new file mode 100644
index 0000000000000..1acc28a14008e
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.sstream
@@ -0,0 +1,39 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+sstream
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.stack b/libcxx/test/libcxx/transitive_includes/expected.stack
new file mode 100644
index 0000000000000..17c8d991260c8
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.stack
@@ -0,0 +1,24 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+deque
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stack
+stdexcept
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.stdexcept b/libcxx/test/libcxx/transitive_includes/expected.stdexcept
new file mode 100644
index 0000000000000..b8dd684ffcbbf
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.stdexcept
@@ -0,0 +1,8 @@
+cstddef
+cstdint
+cstdlib
+exception
+iosfwd
+stdexcept
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.streambuf b/libcxx/test/libcxx/transitive_includes/expected.streambuf
new file mode 100644
index 0000000000000..5e8e278a70ff5
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.streambuf
@@ -0,0 +1,33 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+limits
+memory
+mutex
+new
+ratio
+stdexcept
+streambuf
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.string b/libcxx/test/libcxx/transitive_includes/expected.string
new file mode 100644
index 0000000000000..960707082bab5
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.string
@@ -0,0 +1,28 @@
+atomic
+cctype
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+string
+string_view
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.string_view b/libcxx/test/libcxx/transitive_includes/expected.string_view
new file mode 100644
index 0000000000000..6bb7edfd0bf09
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.string_view
@@ -0,0 +1,19 @@
+cctype
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+stdexcept
+string_view
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.strstream b/libcxx/test/libcxx/transitive_includes/expected.strstream
new file mode 100644
index 0000000000000..ed208f4d5eb37
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.strstream
@@ -0,0 +1,39 @@
+atomic
+bitset
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstdarg
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+ios
+iosfwd
+istream
+limits
+locale
+memory
+mutex
+new
+ostream
+ratio
+stdexcept
+streambuf
+string
+string_view
+strstream
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.system_error b/libcxx/test/libcxx/transitive_includes/expected.system_error
new file mode 100644
index 0000000000000..30ca93cf23bdd
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.system_error
@@ -0,0 +1,30 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+string
+string_view
+system_error
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.thread b/libcxx/test/libcxx/transitive_includes/expected.thread
new file mode 100644
index 0000000000000..102ca58917136
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.thread
@@ -0,0 +1,31 @@
+atomic
+cctype
+cerrno
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdio
+cstdlib
+cstring
+ctime
+cwchar
+cwctype
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+string
+string_view
+system_error
+thread
+tuple
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.tuple b/libcxx/test/libcxx/transitive_includes/expected.tuple
new file mode 100644
index 0000000000000..2a4e44c6f4e91
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.tuple
@@ -0,0 +1,8 @@
+cmath
+compare
+cstddef
+cstdint
+limits
+tuple
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.type_traits b/libcxx/test/libcxx/transitive_includes/expected.type_traits
new file mode 100644
index 0000000000000..8448275a1728c
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.type_traits
@@ -0,0 +1,4 @@
+cstddef
+cstdint
+type_traits
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.typeindex b/libcxx/test/libcxx/transitive_includes/expected.typeindex
new file mode 100644
index 0000000000000..8ed579013db7c
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.typeindex
@@ -0,0 +1,11 @@
+cmath
+compare
+cstddef
+cstdint
+cstdlib
+exception
+limits
+type_traits
+typeindex
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.typeinfo b/libcxx/test/libcxx/transitive_includes/expected.typeinfo
new file mode 100644
index 0000000000000..609a604805c9b
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.typeinfo
@@ -0,0 +1,7 @@
+cstddef
+cstdint
+cstdlib
+exception
+type_traits
+typeinfo
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.unordered_map b/libcxx/test/libcxx/transitive_includes/expected.unordered_map
new file mode 100644
index 0000000000000..4f2f2ff023885
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.unordered_map
@@ -0,0 +1,24 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+unordered_map
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.unordered_set b/libcxx/test/libcxx/transitive_includes/expected.unordered_set
new file mode 100644
index 0000000000000..2c825fb58ac98
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.unordered_set
@@ -0,0 +1,24 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+optional
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+unordered_set
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.utility b/libcxx/test/libcxx/transitive_includes/expected.utility
new file mode 100644
index 0000000000000..30781fff93362
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.utility
@@ -0,0 +1,10 @@
+cmath
+compare
+cstddef
+cstdint
+cstdlib
+initializer_list
+limits
+type_traits
+utility
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.valarray b/libcxx/test/libcxx/transitive_includes/expected.valarray
new file mode 100644
index 0000000000000..b5543ea5c701d
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.valarray
@@ -0,0 +1,15 @@
+cmath
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+exception
+initializer_list
+iosfwd
+limits
+new
+stdexcept
+type_traits
+valarray
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.variant b/libcxx/test/libcxx/transitive_includes/expected.variant
new file mode 100644
index 0000000000000..44553c77ce567
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.variant
@@ -0,0 +1,14 @@
+cmath
+compare
+cstddef
+cstdint
+cstdlib
+cstring
+exception
+initializer_list
+limits
+new
+tuple
+type_traits
+variant
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.vector b/libcxx/test/libcxx/transitive_includes/expected.vector
new file mode 100644
index 0000000000000..9553eb0c04d73
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.vector
@@ -0,0 +1,23 @@
+atomic
+climits
+cmath
+compare
+concepts
+cstddef
+cstdint
+cstdlib
+cstring
+ctime
+exception
+initializer_list
+iosfwd
+limits
+memory
+new
+ratio
+stdexcept
+tuple
+type_traits
+typeinfo
+vector
+version

diff  --git a/libcxx/test/libcxx/transitive_includes/expected.version b/libcxx/test/libcxx/transitive_includes/expected.version
new file mode 100644
index 0000000000000..088eda41aa61d
--- /dev/null
+++ b/libcxx/test/libcxx/transitive_includes/expected.version
@@ -0,0 +1 @@
+version

diff  --git a/libcxx/utils/generate_header_tests.py b/libcxx/utils/generate_header_tests.py
index 59b90489f16b1..0c29974505179 100755
--- a/libcxx/utils/generate_header_tests.py
+++ b/libcxx/utils/generate_header_tests.py
@@ -144,6 +144,7 @@ def main():
     produce(test.joinpath('libcxx/nasty_macros.compile.pass.cpp'), variables)
     produce(test.joinpath('libcxx/no_assert_include.compile.pass.cpp'), variables)
     produce(test.joinpath('libcxx/private_headers.verify.cpp'), variables)
+    produce(test.joinpath('libcxx/transitive_includes.sh.cpp'), variables)
 
 
 if __name__ == '__main__':


        


More information about the libcxx-commits mailing list