[libc++] Header inclusion tests.
As mandated by the Standard's various synopses, e.g. [iterator.synopsis].
Searching the TeX source for '#include' is a good way to find all of these
mandates.
The new tests are all autogenerated by utils/generate_header_inclusion_tests.py.
I was SHOCKED by how many mandates there are, and how many of them
libc++ wasn't conforming with.
Differential Revision: https://reviews.llvm.org/D99309
GitOrigin-RevId: 2d0f1fa472a99dbb46735623363fe918feeda795
diff --git a/docs/Contributing.rst b/docs/Contributing.rst
index 20b614f..de71c7e 100644
--- a/docs/Contributing.rst
+++ b/docs/Contributing.rst
@@ -45,9 +45,10 @@
When adding a new header to libc++:
1. Add a test under ``test/libcxx`` that the new header defines ``_LIBCPP_VERSION``. See ``test/libcxx/algorithms/version.pass.cpp`` for an example.
-2. Run ``python utils/generate_header_tests.py``, verify and commit the modifications.
-3. Create a submodule in ``include/module.modulemap`` for the new header.
-4. Update the ``include/CMakeLists.txt`` file to include the new header.
+2. Run ``python utils/generate_header_tests.py``; verify and commit the changes.
+3. Modify ``python utils/generate_header_inclusion_tests.py``; run it; verify and commit the changes.
+4. Create a submodule in ``include/module.modulemap`` for the new header.
+5. Update the ``include/CMakeLists.txt`` file to include the new header.
Exporting new symbols from the library
======================================
diff --git a/include/chrono b/include/chrono
index c8aab5d..d6a0de8 100644
--- a/include/chrono
+++ b/include/chrono
@@ -825,6 +825,7 @@
#include <__config>
#include <__availability>
+#include <compare>
#include <ctime>
#include <type_traits>
#include <ratio>
diff --git a/include/deque b/include/deque
index 429dcab..607611c 100644
--- a/include/deque
+++ b/include/deque
@@ -162,6 +162,7 @@
#include <__config>
#include <__split_buffer>
+#include <compare>
#include <type_traits>
#include <initializer_list>
#include <iterator>
diff --git a/include/filesystem b/include/filesystem
index dc4ac6d..fcfc637 100644
--- a/include/filesystem
+++ b/include/filesystem
@@ -234,6 +234,7 @@
#include <cstddef>
#include <cstdlib>
#include <chrono>
+#include <compare>
#include <iterator>
#include <iosfwd>
#include <memory>
diff --git a/include/iterator b/include/iterator
index c02f523..54ea2aa 100644
--- a/include/iterator
+++ b/include/iterator
@@ -418,6 +418,8 @@
#include <iosfwd> // for forward declarations of vector and string.
#include <__functional_base>
#include <type_traits>
+#include <compare>
+#include <concepts>
#include <cstddef>
#include <initializer_list>
#include <__memory/base.h>
diff --git a/include/map b/include/map
index 9c3e5e6..ddb596f 100644
--- a/include/map
+++ b/include/map
@@ -480,6 +480,8 @@
#include <__config>
#include <__tree>
#include <__node_handle>
+#include <compare>
+#include <initializer_list>
#include <iterator> // __libcpp_erase_if_container
#include <memory>
#include <utility>
diff --git a/include/memory b/include/memory
index 3fa0f2c..484dafe 100644
--- a/include/memory
+++ b/include/memory
@@ -668,6 +668,7 @@
#include <__availability>
#include <type_traits>
#include <typeinfo>
+#include <compare>
#include <cstddef>
#include <cstdint>
#include <new>
diff --git a/include/optional b/include/optional
index 97a0bbe..1de9c8a 100644
--- a/include/optional
+++ b/include/optional
@@ -150,6 +150,7 @@
#include <__availability>
#include <__debug>
#include <__functional_base>
+#include <compare>
#include <functional>
#include <initializer_list>
#include <new>
diff --git a/include/queue b/include/queue
index 05cc246..5091f67 100644
--- a/include/queue
+++ b/include/queue
@@ -179,6 +179,7 @@
*/
#include <__config>
+#include <compare>
#include <deque>
#include <vector>
#include <functional>
diff --git a/include/regex b/include/regex
index d78e488..466146d 100644
--- a/include/regex
+++ b/include/regex
@@ -765,6 +765,7 @@
#include <__config>
#include <stdexcept>
#include <__locale>
+#include <compare>
#include <initializer_list>
#include <utility>
#include <iterator>
diff --git a/include/set b/include/set
index a5cf399..11991af 100644
--- a/include/set
+++ b/include/set
@@ -428,7 +428,9 @@
#include <__config>
#include <__tree>
#include <__node_handle>
+#include <compare>
#include <functional>
+#include <initializer_list>
#include <iterator> // __libcpp_erase_if_container
#include <version>
diff --git a/include/string b/include/string
index 5f49b47..336922e 100644
--- a/include/string
+++ b/include/string
@@ -514,6 +514,7 @@
*/
#include <__config>
+#include <compare>
#include <string_view>
#include <iosfwd>
#include <cstring>
diff --git a/include/string_view b/include/string_view
index bc92dd5..3177fcd 100644
--- a/include/string_view
+++ b/include/string_view
@@ -182,6 +182,7 @@
#include <__string>
#include <iosfwd>
#include <algorithm>
+#include <compare>
#include <iterator>
#include <limits>
#include <stdexcept>
diff --git a/include/system_error b/include/system_error
index 784adcc..9f3d8ac 100644
--- a/include/system_error
+++ b/include/system_error
@@ -145,6 +145,7 @@
#include <__config>
#include <__errc>
#include <__functional_base> // unary_function
+#include <compare>
#include <stdexcept>
#include <string>
#include <type_traits>
diff --git a/include/tuple b/include/tuple
index 6e07892..61ff212 100644
--- a/include/tuple
+++ b/include/tuple
@@ -151,6 +151,7 @@
#include <__config>
#include <__tuple>
+#include <compare>
#include <cstddef>
#include <type_traits>
#include <__functional_base>
diff --git a/include/typeindex b/include/typeindex
index bff1e65..a8d582e 100644
--- a/include/typeindex
+++ b/include/typeindex
@@ -47,6 +47,7 @@
#include <__config>
#include <typeinfo>
#include <__functional_base>
+#include <compare>
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#pragma GCC system_header
diff --git a/include/unordered_map b/include/unordered_map
index fc10c8b..d061e52 100644
--- a/include/unordered_map
+++ b/include/unordered_map
@@ -434,6 +434,7 @@
#include <__config>
#include <__hash_table>
#include <__node_handle>
+#include <compare>
#include <functional>
#include <iterator> // __libcpp_erase_if_container
#include <stdexcept>
diff --git a/include/unordered_set b/include/unordered_set
index 726e373..99943f3 100644
--- a/include/unordered_set
+++ b/include/unordered_set
@@ -389,6 +389,7 @@
#include <__config>
#include <__hash_table>
#include <__node_handle>
+#include <compare>
#include <functional>
#include <iterator> // __libcpp_erase_if_container
#include <version>
diff --git a/include/utility b/include/utility
index e81fcbe..bfde01c 100644
--- a/include/utility
+++ b/include/utility
@@ -201,6 +201,7 @@
#include <__config>
#include <__tuple>
+#include <compare>
#include <type_traits>
#include <initializer_list>
#include <cstddef>
diff --git a/include/variant b/include/variant
index 4e3db1f..43b6aa7 100644
--- a/include/variant
+++ b/include/variant
@@ -203,6 +203,7 @@
#include <__availability>
#include <__tuple>
#include <array>
+#include <compare>
#include <exception>
#include <functional>
#include <initializer_list>
diff --git a/include/vector b/include/vector
index 4e1a46a..2cd243a 100644
--- a/include/vector
+++ b/include/vector
@@ -276,6 +276,7 @@
#include <__bit_reference>
#include <type_traits>
#include <climits>
+#include <compare>
#include <limits>
#include <initializer_list>
#include <memory>
diff --git a/test/libcxx/inclusions/algorithm.inclusions.compile.pass.cpp b/test/libcxx/inclusions/algorithm.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..d2fde39
--- /dev/null
+++ b/test/libcxx/inclusions/algorithm.inclusions.compile.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <algorithm>
+
+// Test that <algorithm> includes all the other headers it's supposed to.
+
+#include <algorithm>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_ALGORITHM)
+ # error "<algorithm> was expected to define _LIBCPP_ALGORITHM"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<algorithm> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/array.inclusions.compile.pass.cpp b/test/libcxx/inclusions/array.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..7ec19fb
--- /dev/null
+++ b/test/libcxx/inclusions/array.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <array>
+
+// Test that <array> includes all the other headers it's supposed to.
+
+#include <array>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_ARRAY)
+ # error "<array> was expected to define _LIBCPP_ARRAY"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<array> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<array> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/bitset.inclusions.compile.pass.cpp b/test/libcxx/inclusions/bitset.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..c8d413c
--- /dev/null
+++ b/test/libcxx/inclusions/bitset.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <bitset>
+
+// Test that <bitset> includes all the other headers it's supposed to.
+
+#include <bitset>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_BITSET)
+ # error "<bitset> was expected to define _LIBCPP_BITSET"
+#endif
+#if !defined(_LIBCPP_IOSFWD)
+ # error "<bitset> should include <iosfwd> in C++03 and later"
+#endif
+#if !defined(_LIBCPP_STRING)
+ # error "<bitset> should include <string> in C++03 and later"
+#endif
diff --git a/test/libcxx/inclusions/chrono.inclusions.compile.pass.cpp b/test/libcxx/inclusions/chrono.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..ffcaeed
--- /dev/null
+++ b/test/libcxx/inclusions/chrono.inclusions.compile.pass.cpp
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03
+
+// <chrono>
+
+// Test that <chrono> includes all the other headers it's supposed to.
+
+#include <chrono>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_CHRONO)
+ # error "<chrono> was expected to define _LIBCPP_CHRONO"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<chrono> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/cinttypes.inclusions.compile.pass.cpp b/test/libcxx/inclusions/cinttypes.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..61c0797
--- /dev/null
+++ b/test/libcxx/inclusions/cinttypes.inclusions.compile.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <cinttypes>
+
+// Test that <cinttypes> includes all the other headers it's supposed to.
+
+#include <cinttypes>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_CINTTYPES)
+ # error "<cinttypes> was expected to define _LIBCPP_CINTTYPES"
+#endif
+#if !defined(_LIBCPP_CSTDINT)
+ # error "<cinttypes> should include <cstdint> in C++03 and later"
+#endif
diff --git a/test/libcxx/inclusions/complex.h.inclusions.compile.pass.cpp b/test/libcxx/inclusions/complex.h.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..5d2e943
--- /dev/null
+++ b/test/libcxx/inclusions/complex.h.inclusions.compile.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <complex.h>
+
+// Test that <complex.h> includes all the other headers it's supposed to.
+
+#include <complex.h>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_COMPLEX_H)
+ # error "<complex.h> was expected to define _LIBCPP_COMPLEX_H"
+#endif
+#if !defined(_LIBCPP_COMPLEX)
+ # error "<complex.h> should include <complex> in C++03 and later"
+#endif
diff --git a/test/libcxx/inclusions/deque.inclusions.compile.pass.cpp b/test/libcxx/inclusions/deque.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..d1563de
--- /dev/null
+++ b/test/libcxx/inclusions/deque.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <deque>
+
+// Test that <deque> includes all the other headers it's supposed to.
+
+#include <deque>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_DEQUE)
+ # error "<deque> was expected to define _LIBCPP_DEQUE"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<deque> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<deque> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/filesystem.inclusions.compile.pass.cpp b/test/libcxx/inclusions/filesystem.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..6112320
--- /dev/null
+++ b/test/libcxx/inclusions/filesystem.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03, c++11, c++14
+// UNSUPPORTED: libcpp-has-no-filesystem-library
+
+// <filesystem>
+
+// Test that <filesystem> includes all the other headers it's supposed to.
+
+#include <filesystem>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_FILESYSTEM)
+ # error "<filesystem> was expected to define _LIBCPP_FILESYSTEM"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<filesystem> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/forward_list.inclusions.compile.pass.cpp b/test/libcxx/inclusions/forward_list.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..62ea06e
--- /dev/null
+++ b/test/libcxx/inclusions/forward_list.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <forward_list>
+
+// Test that <forward_list> includes all the other headers it's supposed to.
+
+#include <forward_list>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_FORWARD_LIST)
+ # error "<forward_list> was expected to define _LIBCPP_FORWARD_LIST"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<forward_list> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<forward_list> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/ios.inclusions.compile.pass.cpp b/test/libcxx/inclusions/ios.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..52fb9ee
--- /dev/null
+++ b/test/libcxx/inclusions/ios.inclusions.compile.pass.cpp
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: libcpp-has-no-localization
+
+// <ios>
+
+// Test that <ios> includes all the other headers it's supposed to.
+
+#include <ios>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_IOS)
+ # error "<ios> was expected to define _LIBCPP_IOS"
+#endif
+#if !defined(_LIBCPP_IOSFWD)
+ # error "<ios> should include <iosfwd> in C++03 and later"
+#endif
diff --git a/test/libcxx/inclusions/iostream.inclusions.compile.pass.cpp b/test/libcxx/inclusions/iostream.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..4d1b448
--- /dev/null
+++ b/test/libcxx/inclusions/iostream.inclusions.compile.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: libcpp-has-no-localization
+
+// <iostream>
+
+// Test that <iostream> includes all the other headers it's supposed to.
+
+#include <iostream>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_IOSTREAM)
+ # error "<iostream> was expected to define _LIBCPP_IOSTREAM"
+#endif
+#if !defined(_LIBCPP_IOS)
+ # error "<iostream> should include <ios> in C++03 and later"
+#endif
+#if !defined(_LIBCPP_ISTREAM)
+ # error "<iostream> should include <istream> in C++03 and later"
+#endif
+#if !defined(_LIBCPP_OSTREAM)
+ # error "<iostream> should include <ostream> in C++03 and later"
+#endif
+#if !defined(_LIBCPP_STREAMBUF)
+ # error "<iostream> should include <streambuf> in C++03 and later"
+#endif
diff --git a/test/libcxx/inclusions/iterator.inclusions.compile.pass.cpp b/test/libcxx/inclusions/iterator.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..11dfb74
--- /dev/null
+++ b/test/libcxx/inclusions/iterator.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <iterator>
+
+// Test that <iterator> includes all the other headers it's supposed to.
+
+#include <iterator>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_ITERATOR)
+ # error "<iterator> was expected to define _LIBCPP_ITERATOR"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<iterator> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_CONCEPTS)
+ # error "<iterator> should include <concepts> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/list.inclusions.compile.pass.cpp b/test/libcxx/inclusions/list.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..76cb06d
--- /dev/null
+++ b/test/libcxx/inclusions/list.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <list>
+
+// Test that <list> includes all the other headers it's supposed to.
+
+#include <list>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_LIST)
+ # error "<list> was expected to define _LIBCPP_LIST"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<list> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<list> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/map.inclusions.compile.pass.cpp b/test/libcxx/inclusions/map.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..319ee46
--- /dev/null
+++ b/test/libcxx/inclusions/map.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <map>
+
+// Test that <map> includes all the other headers it's supposed to.
+
+#include <map>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_MAP)
+ # error "<map> was expected to define _LIBCPP_MAP"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<map> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<map> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/memory.inclusions.compile.pass.cpp b/test/libcxx/inclusions/memory.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..6b1cd84
--- /dev/null
+++ b/test/libcxx/inclusions/memory.inclusions.compile.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <memory>
+
+// Test that <memory> includes all the other headers it's supposed to.
+
+#include <memory>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_MEMORY)
+ # error "<memory> was expected to define _LIBCPP_MEMORY"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<memory> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/optional.inclusions.compile.pass.cpp b/test/libcxx/inclusions/optional.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..7a6ff34
--- /dev/null
+++ b/test/libcxx/inclusions/optional.inclusions.compile.pass.cpp
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03, c++11, c++14
+
+// <optional>
+
+// Test that <optional> includes all the other headers it's supposed to.
+
+#include <optional>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_OPTIONAL)
+ # error "<optional> was expected to define _LIBCPP_OPTIONAL"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<optional> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/queue.inclusions.compile.pass.cpp b/test/libcxx/inclusions/queue.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..f0bf7fb
--- /dev/null
+++ b/test/libcxx/inclusions/queue.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <queue>
+
+// Test that <queue> includes all the other headers it's supposed to.
+
+#include <queue>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_QUEUE)
+ # error "<queue> was expected to define _LIBCPP_QUEUE"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<queue> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<queue> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/random.inclusions.compile.pass.cpp b/test/libcxx/inclusions/random.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..68da450
--- /dev/null
+++ b/test/libcxx/inclusions/random.inclusions.compile.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <random>
+
+// Test that <random> includes all the other headers it's supposed to.
+
+#include <random>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_RANDOM)
+ # error "<random> was expected to define _LIBCPP_RANDOM"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<random> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/regex.inclusions.compile.pass.cpp b/test/libcxx/inclusions/regex.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..a2a66f4
--- /dev/null
+++ b/test/libcxx/inclusions/regex.inclusions.compile.pass.cpp
@@ -0,0 +1,31 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: libcpp-has-no-localization
+
+// <regex>
+
+// Test that <regex> includes all the other headers it's supposed to.
+
+#include <regex>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_REGEX)
+ # error "<regex> was expected to define _LIBCPP_REGEX"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<regex> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<regex> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/set.inclusions.compile.pass.cpp b/test/libcxx/inclusions/set.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..68350f5
--- /dev/null
+++ b/test/libcxx/inclusions/set.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <set>
+
+// Test that <set> includes all the other headers it's supposed to.
+
+#include <set>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_SET)
+ # error "<set> was expected to define _LIBCPP_SET"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<set> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<set> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/stack.inclusions.compile.pass.cpp b/test/libcxx/inclusions/stack.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..323abc2
--- /dev/null
+++ b/test/libcxx/inclusions/stack.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <stack>
+
+// Test that <stack> includes all the other headers it's supposed to.
+
+#include <stack>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_STACK)
+ # error "<stack> was expected to define _LIBCPP_STACK"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<stack> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<stack> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/string.inclusions.compile.pass.cpp b/test/libcxx/inclusions/string.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..d77ee0e
--- /dev/null
+++ b/test/libcxx/inclusions/string.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <string>
+
+// Test that <string> includes all the other headers it's supposed to.
+
+#include <string>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_STRING)
+ # error "<string> was expected to define _LIBCPP_STRING"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<string> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<string> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/string_view.inclusions.compile.pass.cpp b/test/libcxx/inclusions/string_view.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..a4b999e
--- /dev/null
+++ b/test/libcxx/inclusions/string_view.inclusions.compile.pass.cpp
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03, c++11, c++14
+
+// <string_view>
+
+// Test that <string_view> includes all the other headers it's supposed to.
+
+#include <string_view>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_STRING_VIEW)
+ # error "<string_view> was expected to define _LIBCPP_STRING_VIEW"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<string_view> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/system_error.inclusions.compile.pass.cpp b/test/libcxx/inclusions/system_error.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..5c7f485
--- /dev/null
+++ b/test/libcxx/inclusions/system_error.inclusions.compile.pass.cpp
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03
+
+// <system_error>
+
+// Test that <system_error> includes all the other headers it's supposed to.
+
+#include <system_error>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_SYSTEM_ERROR)
+ # error "<system_error> was expected to define _LIBCPP_SYSTEM_ERROR"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<system_error> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/tgmath.h.inclusions.compile.pass.cpp b/test/libcxx/inclusions/tgmath.h.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..25bc00d
--- /dev/null
+++ b/test/libcxx/inclusions/tgmath.h.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <tgmath.h>
+
+// Test that <tgmath.h> includes all the other headers it's supposed to.
+
+#include <tgmath.h>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_TGMATH_H)
+ # error "<tgmath.h> was expected to define _LIBCPP_TGMATH_H"
+#endif
+#if !defined(_LIBCPP_CMATH)
+ # error "<tgmath.h> should include <cmath> in C++03 and later"
+#endif
+#if !defined(_LIBCPP_COMPLEX)
+ # error "<tgmath.h> should include <complex> in C++03 and later"
+#endif
diff --git a/test/libcxx/inclusions/thread.inclusions.compile.pass.cpp b/test/libcxx/inclusions/thread.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..fc54674
--- /dev/null
+++ b/test/libcxx/inclusions/thread.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03
+// UNSUPPORTED: libcpp-has-no-threads
+
+// <thread>
+
+// Test that <thread> includes all the other headers it's supposed to.
+
+#include <thread>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_THREAD)
+ # error "<thread> was expected to define _LIBCPP_THREAD"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<thread> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/tuple.inclusions.compile.pass.cpp b/test/libcxx/inclusions/tuple.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..58f05b1
--- /dev/null
+++ b/test/libcxx/inclusions/tuple.inclusions.compile.pass.cpp
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03
+
+// <tuple>
+
+// Test that <tuple> includes all the other headers it's supposed to.
+
+#include <tuple>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_TUPLE)
+ # error "<tuple> was expected to define _LIBCPP_TUPLE"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<tuple> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/typeindex.inclusions.compile.pass.cpp b/test/libcxx/inclusions/typeindex.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..1cecb54
--- /dev/null
+++ b/test/libcxx/inclusions/typeindex.inclusions.compile.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <typeindex>
+
+// Test that <typeindex> includes all the other headers it's supposed to.
+
+#include <typeindex>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_TYPEINDEX)
+ # error "<typeindex> was expected to define _LIBCPP_TYPEINDEX"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<typeindex> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/unordered_map.inclusions.compile.pass.cpp b/test/libcxx/inclusions/unordered_map.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..2abddcf
--- /dev/null
+++ b/test/libcxx/inclusions/unordered_map.inclusions.compile.pass.cpp
@@ -0,0 +1,31 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03
+
+// <unordered_map>
+
+// Test that <unordered_map> includes all the other headers it's supposed to.
+
+#include <unordered_map>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_UNORDERED_MAP)
+ # error "<unordered_map> was expected to define _LIBCPP_UNORDERED_MAP"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<unordered_map> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<unordered_map> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/unordered_set.inclusions.compile.pass.cpp b/test/libcxx/inclusions/unordered_set.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..58bf215
--- /dev/null
+++ b/test/libcxx/inclusions/unordered_set.inclusions.compile.pass.cpp
@@ -0,0 +1,31 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03
+
+// <unordered_set>
+
+// Test that <unordered_set> includes all the other headers it's supposed to.
+
+#include <unordered_set>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_UNORDERED_SET)
+ # error "<unordered_set> was expected to define _LIBCPP_UNORDERED_SET"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<unordered_set> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<unordered_set> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/utility.inclusions.compile.pass.cpp b/test/libcxx/inclusions/utility.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..b0e2163
--- /dev/null
+++ b/test/libcxx/inclusions/utility.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <utility>
+
+// Test that <utility> includes all the other headers it's supposed to.
+
+#include <utility>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_UTILITY)
+ # error "<utility> was expected to define _LIBCPP_UTILITY"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<utility> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<utility> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/valarray.inclusions.compile.pass.cpp b/test/libcxx/inclusions/valarray.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..3d3bf91
--- /dev/null
+++ b/test/libcxx/inclusions/valarray.inclusions.compile.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <valarray>
+
+// Test that <valarray> includes all the other headers it's supposed to.
+
+#include <valarray>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_VALARRAY)
+ # error "<valarray> was expected to define _LIBCPP_VALARRAY"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<valarray> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/test/libcxx/inclusions/variant.inclusions.compile.pass.cpp b/test/libcxx/inclusions/variant.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..96adb19
--- /dev/null
+++ b/test/libcxx/inclusions/variant.inclusions.compile.pass.cpp
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// UNSUPPORTED: c++03, c++11, c++14
+
+// <variant>
+
+// Test that <variant> includes all the other headers it's supposed to.
+
+#include <variant>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_VARIANT)
+ # error "<variant> was expected to define _LIBCPP_VARIANT"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<variant> should include <compare> in C++20 and later"
+#endif
diff --git a/test/libcxx/inclusions/vector.inclusions.compile.pass.cpp b/test/libcxx/inclusions/vector.inclusions.compile.pass.cpp
new file mode 100644
index 0000000..2e6b36e
--- /dev/null
+++ b/test/libcxx/inclusions/vector.inclusions.compile.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by generate_header_inclusion_tests.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <vector>
+
+// Test that <vector> includes all the other headers it's supposed to.
+
+#include <vector>
+#include "test_macros.h"
+
+#if !defined(_LIBCPP_VECTOR)
+ # error "<vector> was expected to define _LIBCPP_VECTOR"
+#endif
+#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
+ # error "<vector> should include <compare> in C++20 and later"
+#endif
+#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
+ # error "<vector> should include <initializer_list> in C++11 and later"
+#endif
diff --git a/utils/generate_header_inclusion_tests.py b/utils/generate_header_inclusion_tests.py
new file mode 100755
index 0000000..0bf318e
--- /dev/null
+++ b/utils/generate_header_inclusion_tests.py
@@ -0,0 +1,203 @@
+#!/usr/bin/env python
+
+import os
+
+
+def get_libcxx_paths():
+ utils_path = os.path.dirname(os.path.abspath(__file__))
+ script_name = os.path.basename(__file__)
+ assert os.path.exists(utils_path)
+ src_root = os.path.dirname(utils_path)
+ test_path = os.path.join(src_root, 'test', 'libcxx', 'inclusions')
+ assert os.path.exists(test_path)
+ assert os.path.exists(os.path.join(test_path, 'algorithm.inclusions.compile.pass.cpp'))
+ return script_name, src_root, test_path
+
+
+script_name, source_root, test_path = get_libcxx_paths()
+
+
+# This table was produced manually, by grepping the TeX source of the Standard's
+# library clauses for the string "#include". Each header's synopsis contains
+# explicit "#include" directives for its mandatory inclusions.
+# For example, [algorithm.syn] contains "#include <initializer_list>".
+#
+mandatory_inclusions = {
+ "algorithm": ["initializer_list"],
+ "array": ["compare", "initializer_list"],
+ "bitset": ["iosfwd", "string"],
+ "chrono": ["compare"],
+ "cinttypes": ["cstdint"],
+ "complex.h": ["complex"],
+ # TODO "coroutine": ["compare"],
+ "deque": ["compare", "initializer_list"],
+ "filesystem": ["compare"],
+ "forward_list": ["compare", "initializer_list"],
+ "ios": ["iosfwd"],
+ "iostream": ["ios", "istream", "ostream", "streambuf"],
+ "iterator": ["compare", "concepts"],
+ "list": ["compare", "initializer_list"],
+ "map": ["compare", "initializer_list"],
+ "memory": ["compare"],
+ "optional": ["compare"],
+ "queue": ["compare", "initializer_list"],
+ "random": ["initializer_list"],
+ # TODO "ranges": ["compare", "initializer_list", "iterator"],
+ "regex": ["compare", "initializer_list"],
+ "set": ["compare", "initializer_list"],
+ "stack": ["compare", "initializer_list"],
+ "string": ["compare", "initializer_list"],
+ "string_view": ["compare"],
+ # TODO "syncstream": ["ostream"],
+ "system_error": ["compare"],
+ "tgmath.h": ["cmath", "complex"],
+ "thread": ["compare"],
+ "tuple": ["compare"],
+ "typeindex": ["compare"],
+ "unordered_map": ["compare", "initializer_list"],
+ "unordered_set": ["compare", "initializer_list"],
+ "utility": ["compare", "initializer_list"],
+ "valarray": ["initializer_list"],
+ "variant": ["compare"],
+ "vector": ["compare", "initializer_list"],
+}
+
+new_in_version = {
+ "chrono": "11",
+ "compare": "20",
+ "concepts": "20",
+ "coroutine": "20",
+ "filesystem": "17",
+ "initializer_list": "11",
+ "optional": "17",
+ "system_error": "11",
+ "thread": "11",
+ "tuple": "11",
+ "unordered_map": "11",
+ "unordered_set": "11",
+ "string_view": "17",
+ "ranges": "20",
+ "syncstream": "20",
+ "variant": "17",
+}
+
+assert all(v == sorted(v) for k, v in mandatory_inclusions.items())
+
+# Map from each header to the Lit annotations that should be used for
+# tests that include that header.
+#
+# For example, when threads are not supported, any test
+# that includes <thread> should be marked as UNSUPPORTED, because including
+# <thread> is a hard error in that case.
+lit_markup = {
+ "atomic": ["UNSUPPORTED: libcpp-has-no-threads"],
+ "barrier": ["UNSUPPORTED: libcpp-has-no-threads"],
+ "filesystem": ["UNSUPPORTED: libcpp-has-no-filesystem-library"],
+ "iomanip": ["UNSUPPORTED: libcpp-has-no-localization"],
+ "istream": ["UNSUPPORTED: libcpp-has-no-localization"],
+ "ios": ["UNSUPPORTED: libcpp-has-no-localization"],
+ "iostream": ["UNSUPPORTED: libcpp-has-no-localization"],
+ "latch": ["UNSUPPORTED: libcpp-has-no-threads"],
+ "locale": ["UNSUPPORTED: libcpp-has-no-localization"],
+ "ostream": ["UNSUPPORTED: libcpp-has-no-localization"],
+ "regex": ["UNSUPPORTED: libcpp-has-no-localization"],
+ "semaphore": ["UNSUPPORTED: libcpp-has-no-threads"],
+ "shared_mutex": ["UNSUPPORTED: libcpp-has-no-threads"],
+ "thread": ["UNSUPPORTED: libcpp-has-no-threads"],
+}
+
+
+def get_std_ver_test(includee):
+ v = new_in_version.get(includee, "03")
+ if v == "03":
+ return ''
+ versions = ["03", "11", "14", "17", "20"]
+ return 'TEST_STD_VER > {} && '.format(max(i for i in versions if i < v))
+
+
+def get_unsupported_line(includee):
+ v = new_in_version.get(includee, "03")
+ return {
+ "03": [],
+ "11": ['UNSUPPORTED: c++03'],
+ "14": ['UNSUPPORTED: c++03, c++11'],
+ "17": ['UNSUPPORTED: c++03, c++11, c++14'],
+ "20": ['UNSUPPORTED: c++03, c++11, c++14, c++17'],
+ "2b": ['UNSUPPORTED: c++03, c++11, c++14, c++17, c++20'],
+ }[v]
+
+
+def get_libcpp_header_symbol(header_name):
+ return '_LIBCPP_' + header_name.upper().replace('.', '_')
+
+
+def get_includer_symbol_test(includer):
+ symbol = get_libcpp_header_symbol(includer)
+ return """
+#if !defined({symbol})
+ # error "{message}"
+#endif
+ """.strip().format(
+ symbol=symbol,
+ message="<{}> was expected to define {}".format(includer, symbol),
+ )
+
+
+def get_ifdef(includer, includee):
+ version = max(new_in_version.get(h, "03") for h in [includer, includee])
+ symbol = get_libcpp_header_symbol(includee)
+ return """
+#if {includee_test}!defined({symbol})
+ # error "{message}"
+#endif
+ """.strip().format(
+ includee_test=get_std_ver_test(includee),
+ symbol=symbol,
+ message="<{}> should include <{}> in C++{} and later".format(includer, includee, version)
+ )
+
+
+test_body_template = """
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// WARNING: This test was generated by {script_name}
+// and should not be edited manually.
+//
+// clang-format off
+{markup}
+// <{header}>
+
+// Test that <{header}> includes all the other headers it's supposed to.
+
+#include <{header}>
+#include "test_macros.h"
+
+{test_includers_symbol}
+{test_per_includee}
+""".strip()
+
+
+def produce_tests():
+ for includer, includees in mandatory_inclusions.items():
+ markup_tags = get_unsupported_line(includer) + lit_markup.get(includer, [])
+ test_body = test_body_template.format(
+ script_name=script_name,
+ header=includer,
+ markup=('\n' + '\n'.join('// ' + m for m in markup_tags) + '\n') if markup_tags else '',
+ test_includers_symbol=get_includer_symbol_test(includer),
+ test_per_includee='\n'.join(get_ifdef(includer, includee) for includee in includees),
+ )
+ test_name = "{header}.inclusions.compile.pass.cpp".format(header=includer)
+ out_path = os.path.join(test_path, test_name)
+ with open(out_path, 'w', newline='\n') as f:
+ f.write(test_body + '\n')
+
+
+if __name__ == '__main__':
+ produce_tests()