diff --git a/libcxx/docs/TestingLibcxx.rst b/libcxx/docs/TestingLibcxx.rst index cf092fabd046f..911a7f222ff65 100644 --- a/libcxx/docs/TestingLibcxx.rst +++ b/libcxx/docs/TestingLibcxx.rst @@ -435,6 +435,38 @@ writing tests easier. See `libc++-specific Lit Directives`_ for more information extension.) +C++ Standard version tests +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Historically libc++ tests used to filter the tests for C++ Standard versions +with lit directives like: + +.. code-block:: cpp + + // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23 + +With C++ Standards released every 3 years, this solution is not scalable. +Instead use: + +.. code-block:: cpp + + // UNSUPPORTED: std-at-least-c++26 + +There is no corresponding ``std-at-most-c++23``. This could be useful when +tests are only valid for a small set of standard versions. For example, a +deprecation test is only valid when the feature is deprecated until it is +removed from the Standard. These tests should be written like: + +.. code-block:: cpp + + // REQUIRES: c++17 || c++20 || c++23 + +.. note:: + + There are a lot of tests with the first style, these can remain as they are. + The new style is only intended to be used for new tests. + + Benchmarks ========== diff --git a/libcxx/test/std/input.output/iostream.format/print.fun/includes.compile.pass.cpp b/libcxx/test/std/input.output/iostream.format/print.fun/includes.compile.pass.cpp index 9b9b0e404e6b7..38e4e4d3fb9ef 100644 --- a/libcxx/test/std/input.output/iostream.format/print.fun/includes.compile.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/print.fun/includes.compile.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 +// REQUIRES: std-at-least-c++23 // UNSUPPORTED: no-filesystem // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME diff --git a/libcxx/test/std/input.output/iostream.format/print.fun/no_file_description.pass.cpp b/libcxx/test/std/input.output/iostream.format/print.fun/no_file_description.pass.cpp index d3e4463fe0bc8..5561a1a8b3334 100644 --- a/libcxx/test/std/input.output/iostream.format/print.fun/no_file_description.pass.cpp +++ b/libcxx/test/std/input.output/iostream.format/print.fun/no_file_description.pass.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 +// REQUIRES: std-at-least-c++23 // UNSUPPORTED: no-filesystem // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME diff --git a/libcxx/test/std/localization/locale.stdcvt/depr.verify.cpp b/libcxx/test/std/localization/locale.stdcvt/depr.verify.cpp index b3c6fc8674f8a..7bdcaa5190bd0 100644 --- a/libcxx/test/std/localization/locale.stdcvt/depr.verify.cpp +++ b/libcxx/test/std/localization/locale.stdcvt/depr.verify.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++26 +// REQUIRES: c++17 || c++20 || c++23 // UNSUPPORTED: no-wide-characters // diff --git a/libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/depr.verify.cpp b/libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/depr.verify.cpp index cb067e99a4764..dcab5cef3a550 100644 --- a/libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/depr.verify.cpp +++ b/libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/depr.verify.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -// UNSUPPORTED: c++03, c++11, c++14, c++26 +// REQUIRES: c++17 || c++20 || c++23 // XFAIL: no-wide-characters diff --git a/libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.string/depr.verify.cpp b/libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.string/depr.verify.cpp index f8bd156bdd5f6..6eab4a5dd9223 100644 --- a/libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.string/depr.verify.cpp +++ b/libcxx/test/std/localization/locales/locale.convenience/conversions/conversions.string/depr.verify.cpp @@ -8,7 +8,7 @@ // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT -// UNSUPPORTED: c++03, c++11, c++14, c++26 +// REQUIRES: c++17 || c++20 || c++23 // UNSUPPORTED: no-wide-characters // diff --git a/libcxx/test/std/strings/basic.string/string.capacity/reserve.deprecated_in_cxx20.verify.cpp b/libcxx/test/std/strings/basic.string/string.capacity/reserve.deprecated_in_cxx20.verify.cpp index 81edd9b83d184..87b56c06b9512 100644 --- a/libcxx/test/std/strings/basic.string/string.capacity/reserve.deprecated_in_cxx20.verify.cpp +++ b/libcxx/test/std/strings/basic.string/string.capacity/reserve.deprecated_in_cxx20.verify.cpp @@ -10,7 +10,7 @@ // void reserve(); // Deprecated in C++20 -// UNSUPPORTED: c++03, c++11, c++14, c++17, c++26 +// REQUIRES: c++20 || c++23 #include diff --git a/libcxx/utils/libcxx/test/params.py b/libcxx/utils/libcxx/test/params.py index 947cfd2651364..8fd3872cd8cbb 100644 --- a/libcxx/utils/libcxx/test/params.py +++ b/libcxx/utils/libcxx/test/params.py @@ -186,7 +186,8 @@ def getSuitableClangTidy(cfg): AddFeature(std), AddSubstitution("%{cxx_std}", re.sub(r"\+", "x", std)), AddCompileFlag(lambda cfg: getStdFlag(cfg, std)), - ], + ] + + [AddFeature(f"std-at-least-{s}") for s in _allStandards if s <= std], ), Parameter( name="optimization",