[libc++] Refactor the mandatory header inclusion tests to .gen.py

This allows removing a bunch of boilerplate from the test suite and
reducing the amount of manual stuff contributors have to do when they
add a new public header.

Differential Revision: https://reviews.llvm.org/D151830
This commit is contained in:
Louis Dionne 2023-05-31 09:43:14 -07:00
parent 6091025b85
commit 45307f1b0d
41 changed files with 93 additions and 1257 deletions

View File

@ -48,7 +48,7 @@ sure you don't forget anything:
- Did you add it to ``include/module.modulemap.in``?
- Did you add it to ``include/CMakeLists.txt``?
- If it's a public header, did you update ``utils/generate_header_inclusion_tests.py``?
- If it's a public header, did you update ``utils/libcxx/test/header_information.py``?
- Did you add the relevant feature test macro(s) for your feature? Did you update the ``generate_feature_test_macro_components.py`` script with it?
- Did you run the ``libcxx-generate-files`` target and verify its output?

View File

@ -0,0 +1,47 @@
#===----------------------------------------------------------------------===##
#
# 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 all headers include all the other headers they're supposed to, as
# prescribed by the Standard.
# RUN: %{python} %s %{libcxx}/utils
import sys
sys.path.append(sys.argv[1])
from libcxx.test.header_information import header_restrictions, public_headers, mandatory_inclusions
for header in public_headers:
test_condition_begin = '#if ' + header_restrictions[header] if header in header_restrictions else ''
test_condition_end = '#endif' if header in header_restrictions else ''
header_guard = lambda h: f"_LIBCPP_{h.upper().replace('.', '_').replace('/', '_')}"
# <cassert> has no header guards
if header == 'cassert':
checks = ''
else:
checks = f'''
#ifndef {header_guard(header)}
# error <{header}> was expected to define a header guard {header_guard(header)}
#endif
'''
for includee in mandatory_inclusions.get(header, []):
checks += f'''
#ifndef {header_guard(includee)}
# error <{header}> was expected to include <{includee}>
#endif
'''
print(f"""\
//--- {header}.compile.pass.cpp
#include <__config>
{test_condition_begin}
#include <{header}>
{checks}
{test_condition_end}
""")

View File

@ -1,26 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,28 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,26 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,26 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,28 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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, c++17
// <coroutine>
// Test that <coroutine> includes all the other headers it's supposed to.
#include <coroutine>
#include "test_macros.h"
#if !defined(_LIBCPP_COROUTINE)
# error "<coroutine> was expected to define _LIBCPP_COROUTINE"
#endif
#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
# error "<coroutine> should include <compare> in C++20 and later"
#endif

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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: no-filesystem
// <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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,28 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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: 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

View File

@ -1,37 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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: 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,26 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,28 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,26 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,34 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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, c++17
// <ranges>
// Test that <ranges> includes all the other headers it's supposed to.
#include <ranges>
#include "test_macros.h"
#if !defined(_LIBCPP_RANGES)
# error "<ranges> was expected to define _LIBCPP_RANGES"
#endif
#if TEST_STD_VER > 17 && !defined(_LIBCPP_COMPARE)
# error "<ranges> should include <compare> in C++20 and later"
#endif
#if TEST_STD_VER > 03 && !defined(_LIBCPP_INITIALIZER_LIST)
# error "<ranges> should include <initializer_list> in C++20 and later"
#endif
#if !defined(_LIBCPP_ITERATOR)
# error "<ranges> should include <iterator> in C++20 and later"
#endif

View File

@ -1,31 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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: 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,28 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,28 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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: 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

View File

@ -1,28 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,26 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,31 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,31 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,26 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,28 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,29 +0,0 @@
//===----------------------------------------------------------------------===//
//
// 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

View File

@ -1,8 +1,3 @@
add_custom_target(libcxx-generate-public-header-transitive-inclusion-tests
COMMAND "${Python3_EXECUTABLE}" "${LIBCXX_SOURCE_DIR}/utils/generate_header_inclusion_tests.py"
COMMENT "Generate tests checking for mandated transitive includes in public headers.")
add_custom_target(libcxx-generate-public-header-tests
COMMAND "${Python3_EXECUTABLE}" "${LIBCXX_SOURCE_DIR}/utils/generate_header_tests.py"
COMMENT "Generate tests for including public headers.")
@ -46,8 +41,7 @@ add_custom_target(libcxx-generate-iwyu-mapping
COMMENT "Generate the mapping file for include-what-you-use")
add_custom_target(libcxx-generate-files
DEPENDS libcxx-generate-public-header-transitive-inclusion-tests
libcxx-generate-public-header-tests
DEPENDS libcxx-generate-public-header-tests
libcxx-generate-feature-test-macros
libcxx-generate-extended-grapheme-cluster-tables
libcxx-generate-extended-grapheme-cluster-tests

View File

@ -1,215 +0,0 @@
#!/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"],
"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"],
"ranges": ["compare", "initializer_list", "iterator"],
"regex": ["compare", "initializer_list"],
"set": ["compare", "initializer_list"],
"stack": ["compare", "initializer_list"],
"string_view": ["compare"],
"string": ["compare", "initializer_list"],
# 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",
"cuchar": "11",
"expected": "23",
"filesystem": "17",
"initializer_list": "11",
"optional": "17",
"ranges": "20",
"string_view": "17",
"syncstream": "20",
"system_error": "11",
"thread": "11",
"tuple": "11",
"uchar.h": "11",
"unordered_map": "11",
"unordered_set": "11",
"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 = {
"barrier": ["UNSUPPORTED: no-threads"],
"filesystem": ["UNSUPPORTED: no-filesystem"],
"iomanip": ["UNSUPPORTED: no-localization"],
"ios": ["UNSUPPORTED: no-localization"],
"iostream": ["UNSUPPORTED: no-localization"],
"istream": ["UNSUPPORTED: no-localization"],
"latch": ["UNSUPPORTED: no-threads"],
"locale": ["UNSUPPORTED: no-localization"],
"mutex": ["UNSUPPORTED: no-threads"],
"ostream": ["UNSUPPORTED: no-localization"],
"regex": ["UNSUPPORTED: no-localization"],
"semaphore": ["UNSUPPORTED: no-threads"],
"shared_mutex": ["UNSUPPORTED: no-threads"],
"thread": ["UNSUPPORTED: 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"],
"23": ["UNSUPPORTED: c++03, c++11, c++14, c++17, c++20"],
"26": ["UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23"],
}[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()

View File

@ -121,6 +121,50 @@ private_headers_still_public_in_modules = [
"__verbose_abort",
]
# 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"],
"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"],
"ranges": ["compare", "initializer_list", "iterator"],
"regex": ["compare", "initializer_list"],
"set": ["compare", "initializer_list"],
"stack": ["compare", "initializer_list"],
"string_view": ["compare"],
"string": ["compare", "initializer_list"],
# 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"],
}
def is_header(file):
"""Returns whether the given file is a header (i.e. not a directory or the modulemap file)."""
return (