Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
28 changes: 28 additions & 0 deletions libcxx/test/libcxx/inclusions/ios.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
37 changes: 37 additions & 0 deletions libcxx/test/libcxx/inclusions/iostream.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/iterator.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/list.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/map.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
26 changes: 26 additions & 0 deletions libcxx/test/libcxx/inclusions/memory.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
28 changes: 28 additions & 0 deletions libcxx/test/libcxx/inclusions/optional.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/queue.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
26 changes: 26 additions & 0 deletions libcxx/test/libcxx/inclusions/random.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
31 changes: 31 additions & 0 deletions libcxx/test/libcxx/inclusions/regex.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/set.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/stack.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/string.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/tgmath.h.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/thread.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
28 changes: 28 additions & 0 deletions libcxx/test/libcxx/inclusions/tuple.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/utility.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
26 changes: 26 additions & 0 deletions libcxx/test/libcxx/inclusions/valarray.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
28 changes: 28 additions & 0 deletions libcxx/test/libcxx/inclusions/variant.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
29 changes: 29 additions & 0 deletions libcxx/test/libcxx/inclusions/vector.inclusions.compile.pass.cpp
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -226,26 +226,14 @@ struct multiple_overloads {
struct B { B(int); };
struct AB : A, B {};
struct O {};
struct DA : A {};
struct DB : B {};
void operator()(A) {};
void operator()(B) {};
void operator()(A) const;
void operator()(B) const;
};
static_assert(std::invocable<multiple_overloads&, multiple_overloads::A>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::B>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::DA>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::DB>);
static_assert(std::invocable<multiple_overloads&, int>);
static_assert(!std::invocable<multiple_overloads&, multiple_overloads::AB>);
static_assert(!std::invocable<multiple_overloads&, multiple_overloads::O>);

static_assert(std::invocable<multiple_overloads&, multiple_overloads::A&>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::B&>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::DA&>);
static_assert(std::invocable<multiple_overloads&, multiple_overloads::DB&>);
static_assert(std::invocable<multiple_overloads&, int&>);
static_assert(!std::invocable<multiple_overloads&, multiple_overloads::AB&>);
static_assert(!std::invocable<multiple_overloads&, multiple_overloads::O&>);
static_assert(std::invocable<multiple_overloads, multiple_overloads::A>);
static_assert(std::invocable<multiple_overloads, multiple_overloads::B>);
static_assert(std::invocable<multiple_overloads, int>);
static_assert(!std::invocable<multiple_overloads, multiple_overloads::AB>);
static_assert(!std::invocable<multiple_overloads, multiple_overloads::O>);
} // namespace function_objects

namespace pointer_to_member_functions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,26 +252,14 @@ struct multiple_overloads {
struct B { B(int); };
struct AB : A, B {};
struct O {};
struct DA : A {};
struct DB : B {};
void operator()(A) {};
void operator()(B) {};
void operator()(A) const;
void operator()(B) const;
};
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::A>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::B>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::DA>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::DB>);
static_assert(std::regular_invocable<multiple_overloads&, int>);
static_assert(!std::regular_invocable<multiple_overloads&, multiple_overloads::AB>);
static_assert(!std::regular_invocable<multiple_overloads&, multiple_overloads::O>);

static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::A&>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::B&>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::DA&>);
static_assert(std::regular_invocable<multiple_overloads&, multiple_overloads::DB&>);
static_assert(std::regular_invocable<multiple_overloads&, int&>);
static_assert(!std::regular_invocable<multiple_overloads&, multiple_overloads::AB&>);
static_assert(!std::regular_invocable<multiple_overloads&, multiple_overloads::O&>);
static_assert(std::regular_invocable<multiple_overloads, multiple_overloads::A>);
static_assert(std::regular_invocable<multiple_overloads, multiple_overloads::B>);
static_assert(std::regular_invocable<multiple_overloads, int>);
static_assert(!std::regular_invocable<multiple_overloads, multiple_overloads::AB>);
static_assert(!std::regular_invocable<multiple_overloads, multiple_overloads::O>);
} // namespace function_objects

namespace pointer_to_member_functions {
Expand Down
203 changes: 203 additions & 0 deletions libcxx/utils/generate_header_inclusion_tests.py
Original file line number Diff line number Diff line change
@@ -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()