aboutsummaryrefslogtreecommitdiff
path: root/libcxx/test
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test')
-rw-r--r--libcxx/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp2
-rw-r--r--libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp14
-rw-r--r--libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp14
-rw-r--r--libcxx/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp2
-rw-r--r--libcxx/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp2
-rw-r--r--libcxx/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp2
-rw-r--r--libcxx/test/libcxx/time/time.zone/time.zone.db/leap_seconds.pass.cpp119
-rw-r--r--libcxx/test/libcxx/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp84
-rw-r--r--libcxx/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp4
-rw-r--r--libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp4
-rw-r--r--libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp4
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp2
-rw-r--r--libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp2
-rw-r--r--libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp19
-rw-r--r--libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp19
-rw-r--r--libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp76
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp56
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp34
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp44
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp49
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp48
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp34
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp48
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp34
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/random.version.compile.pass.cpp71
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp90
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp62
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp52
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp34
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp34
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp48
-rw-r--r--libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp669
-rw-r--r--libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp51
-rw-r--r--libcxx/test/std/numerics/rand/rand.util/rand.util.seedseq/generate.mandates.verify.cpp58
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.db/leap_seconds.pass.cpp75
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp77
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp3
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/locate_zone.pass.cpp62
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp79
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp64
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp6
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.leap/assign.copy.pass.cpp71
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.leap/cons.copy.pass.cpp69
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.leap/members/date.pass.cpp53
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.leap/members/value.pass.cpp53
-rw-r--r--libcxx/test/std/time/time.zone/time.zone.leap/nonmembers/comparison.pass.cpp85
-rw-r--r--libcxx/test/support/test_chrono_leap_second.h52
-rw-r--r--libcxx/test/support/test_iterators.h22
90 files changed, 2341 insertions, 399 deletions
diff --git a/libcxx/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp b/libcxx/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp
index defd43c..2790916 100644
--- a/libcxx/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp
+++ b/libcxx/test/libcxx/atomics/diagnose_invalid_memory_order.verify.cpp
@@ -9,7 +9,7 @@
// This test fails with Clang <18 because diagnose_if doesn't emit all of the
// diagnostics when -fdelayed-template-parsing is enabled, like it is in MSVC
// mode.
-// XFAIL: msvc && (clang-16 || clang-17)
+// XFAIL: msvc && clang-17
// REQUIRES: diagnose-if-support
diff --git a/libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp b/libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp
index 8019824..9acb57f 100644
--- a/libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp
+++ b/libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.compile.pass.cpp
@@ -26,6 +26,7 @@
// These types have "private" constructors.
extern std::chrono::time_zone tz;
extern std::chrono::time_zone_link link;
+extern std::chrono::leap_second leap;
void test() {
std::chrono::tzdb_list& list = std::chrono::get_tzdb_list();
@@ -37,9 +38,17 @@ void test() {
std::chrono::get_tzdb_list();
std::chrono::get_tzdb();
+ std::chrono::locate_zone("name");
+ std::chrono::current_zone();
std::chrono::remote_version();
{
+ const std::chrono::tzdb& t = list.front();
+ t.locate_zone("name");
+ t.current_zone();
+ }
+
+ {
tz.name();
operator==(tz, tz);
operator<=>(tz, tz);
@@ -51,4 +60,9 @@ void test() {
operator==(link, link);
operator<=>(link, link);
}
+
+ {
+ leap.date();
+ leap.value();
+ }
}
diff --git a/libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp b/libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp
index e9b2755..8795a4e 100644
--- a/libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp
+++ b/libcxx/test/libcxx/diagnostics/chrono.nodiscard_extensions.verify.cpp
@@ -23,6 +23,7 @@
// These types have "private" constructors.
extern std::chrono::time_zone tz;
extern std::chrono::time_zone_link link;
+extern std::chrono::leap_second leap;
void test() {
std::chrono::tzdb_list& list = std::chrono::get_tzdb_list();
@@ -32,9 +33,17 @@ void test() {
list.cbegin(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
list.cend(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ {
+ const std::chrono::tzdb& t = list.front();
+ t.locate_zone("name"); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ t.current_zone(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
+
namespace crno = std::chrono;
crno::get_tzdb_list(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
crno::get_tzdb(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ crno::locate_zone("n"); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ crno::current_zone(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
crno::remote_version(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
{
@@ -51,4 +60,9 @@ void test() {
// expected-warning@+1 {{ignoring return value of function declared with 'nodiscard' attribute}}
operator<=>(link, link);
}
+
+ {
+ leap.date(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ leap.value(); // expected-warning {{ignoring return value of function declared with 'nodiscard' attribute}}
+ }
}
diff --git a/libcxx/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp b/libcxx/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp
index b411ce1..a0bfb7c 100644
--- a/libcxx/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp
+++ b/libcxx/test/libcxx/ranges/range.adaptors/range.lazy.split/no_unique_address.compile.pass.cpp
@@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14, c++17
-// XFAIL: msvc && (clang-16 || clang-17)
+// XFAIL: msvc && clang-17
// class lazy_split_view {
// _LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View();
diff --git a/libcxx/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp b/libcxx/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp
index 0d8bfbc..694cf1fd 100644
--- a/libcxx/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp
+++ b/libcxx/test/libcxx/ranges/range.adaptors/range.split/no_unique_address.compile.pass.cpp
@@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14, c++17
-// XFAIL: msvc && (clang-16 || clang-17)
+// XFAIL: msvc && clang-17
// class split_view {
// _LIBCPP_NO_UNIQUE_ADDRESS _View __base_ = _View();
diff --git a/libcxx/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp b/libcxx/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp
index 8359d26..a77c4e4 100644
--- a/libcxx/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp
+++ b/libcxx/test/libcxx/ranges/range.factories/range.istream.view/no_unique_address.compile.pass.cpp
@@ -8,7 +8,7 @@
// UNSUPPORTED: no-localization
// UNSUPPORTED: c++03, c++11, c++14, c++17
-// XFAIL: msvc && (clang-16 || clang-17)
+// XFAIL: msvc && clang-17
// Test the libc++ extension that the value stored in `std::ranges::istream_view` has been marked
// as _LIBCPP_NO_UNIQUE_ADDRESS
diff --git a/libcxx/test/libcxx/time/time.zone/time.zone.db/leap_seconds.pass.cpp b/libcxx/test/libcxx/time/time.zone/time.zone.db/leap_seconds.pass.cpp
new file mode 100644
index 0000000..282bddc
--- /dev/null
+++ b/libcxx/test/libcxx/time/time.zone/time.zone.db/leap_seconds.pass.cpp
@@ -0,0 +1,119 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// Tests the IANA database leap seconds parsing and operations.
+// This is not part of the public tzdb interface.
+
+#include <cassert>
+#include <chrono>
+#include <fstream>
+#include <string>
+#include <string_view>
+
+#include "assert_macros.h"
+#include "concat_macros.h"
+#include "filesystem_test_helper.h"
+#include "test_tzdb.h"
+
+scoped_test_env env;
+[[maybe_unused]] const std::filesystem::path dir = env.create_dir("zoneinfo");
+const std::filesystem::path tzdata = env.create_file("zoneinfo/tzdata.zi");
+const std::filesystem::path leap_seconds = env.create_file("zoneinfo/leap-seconds.list");
+
+std::string_view std::chrono::__libcpp_tzdb_directory() {
+ static std::string result = dir.string();
+ return result;
+}
+
+void write(std::string_view input) {
+ static int version = 0;
+
+ std::ofstream f{tzdata};
+ f << "# version " << version++ << '\n';
+ std::ofstream{leap_seconds}.write(input.data(), input.size());
+}
+
+static const std::chrono::tzdb& parse(std::string_view input) {
+ write(input);
+ return std::chrono::reload_tzdb();
+}
+
+static void test_exception(std::string_view input, [[maybe_unused]] std::string_view what) {
+ write(input);
+
+ TEST_VALIDATE_EXCEPTION(
+ std::runtime_error,
+ [&]([[maybe_unused]] const std::runtime_error& e) {
+ TEST_LIBCPP_REQUIRE(
+ e.what() == what,
+ TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n'));
+ },
+ TEST_IGNORE_NODISCARD std::chrono::reload_tzdb());
+}
+
+static void test_invalid() {
+ test_exception("0", "corrupt tzdb: expected a non-zero digit");
+
+ test_exception("1", "corrupt tzdb: expected whitespace");
+
+ test_exception("1 ", "corrupt tzdb: expected a non-zero digit");
+
+ test_exception("5764607523034234880 2", "corrupt tzdb: integral too large");
+}
+
+static void test_leap_seconds() {
+ using namespace std::chrono;
+
+ // Test whether loading also sorts the entries in the proper order.
+ const tzdb& result = parse(
+ R"(
+2303683200 12 # 1 Jan 1973
+2287785600 11 # 1 Jul 1972
+2272060800 10 # 1 Jan 1972
+86400 1 # 2 Jan 1900 Dummy entry to test before 1970
+
+# largest accepted value by the parser
+5764607523034234879 2
+)");
+
+ assert(result.leap_seconds.size() == 5);
+
+ assert(result.leap_seconds[0].date() == sys_seconds{sys_days{1900y / January / 2}});
+ assert(result.leap_seconds[0].value() == 1s);
+
+ assert(result.leap_seconds[1].date() == sys_seconds{sys_days{1972y / January / 1}});
+ assert(result.leap_seconds[1].value() == 10s);
+
+ assert(result.leap_seconds[2].date() == sys_seconds{sys_days{1972y / July / 1}});
+ assert(result.leap_seconds[2].value() == 11s);
+
+ assert(result.leap_seconds[3].date() == sys_seconds{sys_days{1973y / January / 1}});
+ assert(result.leap_seconds[3].value() == 12s);
+
+ assert(result.leap_seconds[4].date() ==
+ sys_seconds{5764607523034234879s
+ // The database uses 1900-01-01 as epoch.
+ - std::chrono::duration_cast<std::chrono::seconds>(
+ sys_days{1970y / January / 1} - sys_days{1900y / January / 1})});
+ assert(result.leap_seconds[4].value() == 2s);
+}
+
+int main(int, const char**) {
+ test_invalid();
+ test_leap_seconds();
+
+ return 0;
+}
diff --git a/libcxx/test/libcxx/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp b/libcxx/test/libcxx/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp
new file mode 100644
index 0000000..971f7f0
--- /dev/null
+++ b/libcxx/test/libcxx/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp
@@ -0,0 +1,84 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// struct tzdb
+
+// const time_zone* locate_zone(string_view tz_name) const;
+
+#include <cassert>
+#include <chrono>
+#include <fstream>
+#include <string_view>
+
+#include "test_macros.h"
+#include "assert_macros.h"
+#include "concat_macros.h"
+#include "filesystem_test_helper.h"
+#include "test_tzdb.h"
+
+scoped_test_env env;
+[[maybe_unused]] const std::filesystem::path dir = env.create_dir("zoneinfo");
+const std::filesystem::path file = env.create_file("zoneinfo/tzdata.zi");
+
+std::string_view std::chrono::__libcpp_tzdb_directory() {
+ static std::string result = dir.string();
+ return result;
+}
+
+void write(std::string_view input) {
+ static int version = 0;
+
+ std::ofstream f{file};
+ f << "# version " << version++ << '\n';
+ f.write(input.data(), input.size());
+}
+
+static const std::chrono::tzdb& parse(std::string_view input) {
+ write(input);
+ return std::chrono::reload_tzdb();
+}
+
+int main(int, const char**) {
+ const std::chrono::tzdb& tzdb = parse(
+ R"(
+Z zone 0 r f
+L zone link
+L link link_to_link
+)");
+
+ {
+ const std::chrono::time_zone* tz = tzdb.locate_zone("zone");
+ assert(tz);
+ assert(tz->name() == "zone");
+ }
+ {
+ const std::chrono::time_zone* tz = tzdb.locate_zone("link");
+ assert(tz);
+ assert(tz->name() == "zone");
+ }
+
+ TEST_VALIDATE_EXCEPTION(
+ std::runtime_error,
+ [&]([[maybe_unused]] const std::runtime_error& e) {
+ std::string_view what{"tzdb: requested time zone not found"};
+ TEST_LIBCPP_REQUIRE(
+ e.what() == what,
+ TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n'));
+ },
+ TEST_IGNORE_NODISCARD tzdb.locate_zone("link_to_link"));
+
+ return 0;
+}
diff --git a/libcxx/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp b/libcxx/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp
index d48ee9e..761691c 100644
--- a/libcxx/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp
+++ b/libcxx/test/std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp
@@ -309,6 +309,10 @@ constexpr bool test() {
});
});
+ assert(std::ranges::contains_subrange(
+ std::views::iota(0, 5), std::views::iota(0, 5) | std::views::filter([](int) { return true; })));
+ assert(!std::ranges::contains_subrange(std::views::iota(0ULL, 42ULL), std::views::iota(0ULL, 1ULL << 32)));
+
return true;
}
diff --git a/libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp b/libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp
index 0b09a73..2f84f26 100644
--- a/libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_strong.pass.cpp
@@ -150,12 +150,12 @@ void test_impl() {
test_seq_cst<T, MaybeVolatile>(store, load);
auto store_one_arg = [](MaybeVolatile<std::atomic<T>>& x, T old_val, T new_val) {
- auto r = x.compare_exchange_strong(old_val, new_val, std::memory_order::seq_cst, std::memory_order_relaxed);
+ auto r = x.compare_exchange_strong(old_val, new_val, std::memory_order::seq_cst);
assert(r);
};
auto load_one_arg = [](MaybeVolatile<std::atomic<T>>& x) {
auto val = x.load(std::memory_order::relaxed);
- while (!x.compare_exchange_strong(val, val, std::memory_order::seq_cst, std::memory_order_relaxed)) {
+ while (!x.compare_exchange_strong(val, val, std::memory_order::seq_cst)) {
}
return val;
};
diff --git a/libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp b/libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp
index f8a2f19..5a39ec7 100644
--- a/libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp
+++ b/libcxx/test/std/atomics/atomics.types.generic/atomics.types.float/compare_exchange_weak.pass.cpp
@@ -165,12 +165,12 @@ void test_impl() {
auto store_one_arg = [](MaybeVolatile<std::atomic<T>>& x, T old_val, T new_val) {
// could fail spuriously, so put it in a loop
- while (!x.compare_exchange_weak(old_val, new_val, std::memory_order::seq_cst, std::memory_order_relaxed)) {
+ while (!x.compare_exchange_weak(old_val, new_val, std::memory_order::seq_cst)) {
}
};
auto load_one_arg = [](MaybeVolatile<std::atomic<T>>& x) {
auto val = x.load(std::memory_order::relaxed);
- while (!x.compare_exchange_weak(val, val, std::memory_order::seq_cst, std::memory_order_relaxed)) {
+ while (!x.compare_exchange_weak(val, val, std::memory_order::seq_cst)) {
}
return val;
};
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp
index b5ee0bf..701e6df 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp
index 4d0d673..fd2ad66 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/ccp_size.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp
index 5898094..c5fe349 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp
index e13e20e..7d9c7d6 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.cons/cp_size.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp
index 449114a..f5ef29b 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/rdbuf.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp
index e7c0637..63d3800 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.istrstream.members/str.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp
index 2ab252e..d02f12d 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/depr.verify.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
+
// <strstream>
// check that istrstream is marked deprecated
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp
index be1a9e1..526c4dc 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.istrstream/types.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp
index 8698983..b9db1bf 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/cp_size_mode.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp
index abbf6af..b67f0ab 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.cons/default.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp
index 854e68b..e087c06 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/freeze.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp
index 9830aeb..73f2033 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/pcount.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp
index f9a859d..d8b55d9 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/rdbuf.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp
index 72f665a..2867031 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.ostrstream.members/str.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp
index e0c805f..9ec4650 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/depr.verify.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
+
// <strstream>
// check that ostrstream is marked deprecated
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp
index 6a71c44..e321444 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.ostrstream/types.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp
index a85e132..54e09d3 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/cp_size_mode.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp
index 390162e..1e4c120 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.cons/default.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp
index 3fe277a..99d58cc 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.dest/rdbuf.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp
index 263fdde..6cc26bb 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/freeze.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp
index b053cf1..efe2c32 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/pcount.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp
index 3d251d9..e1bc40c 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.strstream.oper/str.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp
index 0365522..ab88d6d 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/depr.verify.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
+
// <strstream>
// check that strstream is marked deprecated
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp
index fb54384..7609430 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstream/types.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp
index 8f81707..3d7f2ff 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ccp_size.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp
index 25a9617..0c4bf62 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cp_size_cp.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp
index fc3386f..e0928835 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cscp_size.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp
index a74c504..7f5504d 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/cucp_size.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp
index 756427d..0aa7e1a 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/custom_alloc.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp
index 81924c9..803be42 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/default.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp
index b8991a8..35c1512 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/scp_size_scp.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp
index 1d3463f..e71fa031 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.cons/ucp_size_ucp.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp
index 93eec8d..1276187 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/freeze.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp
index 5b973cf..fc79e78 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/overflow.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp
index b64c9dc..b62c339 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/pcount.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp
index d6c8b8e..68be8dd 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.members/str.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp
index 37109c7..6a932dc 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/overflow.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp
index 698953f..484a726 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/pbackfail.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp
index d98e6f7..96900d8 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekoff.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp
index be88f5a..f3193d3 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/seekpos.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp
index ce7612b..44e6704 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/setbuf.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp
index 4fc79b5..be916be 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.strstreambuf.virtuals/underflow.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp
index a598acb..471b287 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/depr.verify.cpp
@@ -6,6 +6,8 @@
//
//===----------------------------------------------------------------------===//
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
+
// <strstream>
// check that strstreambuf is marked deprecated
diff --git a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp
index bc312cb..aee1260 100644
--- a/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp
+++ b/libcxx/test/std/depr/depr.str.strstreams/depr.strstreambuf/types.pass.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
-// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
+// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX26_REMOVED_STRSTREAM
// <strstream>
diff --git a/libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp b/libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp
index 068202c..d4bbde7 100644
--- a/libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp
+++ b/libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/generic_category.pass.cpp
@@ -44,14 +44,19 @@ int main(int, char**)
errno = E2BIG; // something that message will never generate
const std::error_category& e_cat1 = std::generic_category();
const std::string msg = e_cat1.message(-1);
- // Exact message format varies by platform.
-#if defined(_AIX)
- LIBCPP_ASSERT(msg.rfind("Error -1 occurred", 0) == 0);
-#elif defined(_NEWLIB_VERSION)
- LIBCPP_ASSERT(msg.empty());
-#else
- LIBCPP_ASSERT(msg.rfind("Unknown error", 0) == 0);
+ // Exact message format varies by platform. We can't detect
+ // some of these (Musl in particular) using the preprocessor,
+ // so accept a few sensible messages. Newlib unfortunately
+ // responds with an empty message, which we probably want to
+ // treat as a failure code otherwise, but we can detect that
+ // with the preprocessor.
+ LIBCPP_ASSERT(msg.rfind("Error -1 occurred", 0) == 0 // AIX
+ || msg.rfind("No error information", 0) == 0 // Musl
+ || msg.rfind("Unknown error", 0) == 0 // Glibc
+#if defined(_NEWLIB_VERSION)
+ || msg.empty()
#endif
+ );
assert(errno == E2BIG);
}
diff --git a/libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp b/libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp
index 42fdd1c..eefbddd 100644
--- a/libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp
+++ b/libcxx/test/std/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp
@@ -50,14 +50,19 @@ int main(int, char**) {
errno = E2BIG; // something that message will never generate
const std::error_category& e_cat1 = std::system_category();
const std::string msg = e_cat1.message(-1);
- // Exact message format varies by platform.
-#if defined(_AIX)
- LIBCPP_ASSERT(msg.rfind("Error -1 occurred", 0) == 0);
-#elif defined(_NEWLIB_VERSION)
- LIBCPP_ASSERT(msg.empty());
-#else
- LIBCPP_ASSERT(msg.rfind("Unknown error", 0) == 0);
+ // Exact message format varies by platform. We can't detect
+ // some of these (Musl in particular) using the preprocessor,
+ // so accept a few sensible messages. Newlib unfortunately
+ // responds with an empty message, which we probably want to
+ // treat as a failure code otherwise, but we can detect that
+ // with the preprocessor.
+ LIBCPP_ASSERT(msg.rfind("Error -1 occurred", 0) == 0 // AIX
+ || msg.rfind("No error information", 0) == 0 // Musl
+ || msg.rfind("Unknown error", 0) == 0 // Glibc
+#if defined(_NEWLIB_VERSION)
+ || msg.empty()
#endif
+ );
assert(errno == E2BIG);
}
diff --git a/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp
index a1c1564..76439ef 100644
--- a/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp
+++ b/libcxx/test/std/iterators/iterator.primitives/range.iter.ops/range.iter.ops.advance/iterator_count_sentinel.pass.cpp
@@ -21,9 +21,12 @@
#include "../types.h"
template <bool Count, typename It>
-constexpr void check_forward(int* first, int* last, std::iter_difference_t<It> n, int* expected) {
+constexpr void
+check_forward(int* first, int* last, std::iter_difference_t<It> n, int* expected, int expected_equals_count = -1) {
using Difference = std::iter_difference_t<It>;
Difference const M = (expected - first); // expected travel distance
+ // `expected_equals_count` is only relevant when `Count` is true.
+ assert(Count || expected_equals_count == -1);
{
It it(first);
@@ -42,6 +45,7 @@ constexpr void check_forward(int* first, int* last, std::iter_difference_t<It> n
// regardless of the iterator category.
assert(it.stride_count() == M);
assert(it.stride_displacement() == M);
+ assert(it.equals_count() == expected_equals_count);
}
}
@@ -74,9 +78,20 @@ constexpr void check_forward_sized_sentinel(int* first, int* last, std::iter_dif
}
}
-template <typename It>
-constexpr void check_backward(int* first, int* last, std::iter_difference_t<It> n, int* expected) {
- static_assert(std::random_access_iterator<It>, "This test doesn't support non random access iterators");
+struct Expected {
+ int stride_count;
+ int stride_displacement;
+ int equals_count;
+};
+
+template <bool Count, typename It>
+constexpr void
+check_backward(int* first, int* last, std::iter_difference_t<It> n, int* expected, Expected expected_counts) {
+ // Check preconditions for `advance` when called with negative `n`
+ // (see [range.iter.op.advance]). In addition, allow `n == 0`.
+ assert(n <= 0);
+ static_assert(std::bidirectional_iterator<It>);
+
using Difference = std::iter_difference_t<It>;
Difference const M = (expected - last); // expected travel distance (which is negative)
@@ -92,9 +107,14 @@ constexpr void check_backward(int* first, int* last, std::iter_difference_t<It>
{
auto it = stride_counting_iterator(It(last));
auto sent = stride_counting_iterator(It(first));
+ static_assert(std::bidirectional_iterator<stride_counting_iterator<It>>);
+ static_assert(Count == !std::sized_sentinel_for<It, It>);
+
(void)std::ranges::advance(it, n, sent);
- assert(it.stride_count() <= 1);
- assert(it.stride_displacement() <= 1);
+
+ assert(it.stride_count() == expected_counts.stride_count);
+ assert(it.stride_displacement() == expected_counts.stride_displacement);
+ assert(it.equals_count() == expected_counts.equals_count);
}
}
@@ -171,13 +191,17 @@ constexpr bool test() {
{
int* expected = n > size ? range + size : range + n;
+ int equals_count = n > size ? size + 1 : n;
+
+ // clang-format off
check_forward<false, cpp17_input_iterator<int*>>( range, range+size, n, expected);
check_forward<false, cpp20_input_iterator<int*>>( range, range+size, n, expected);
- check_forward<true, forward_iterator<int*>>( range, range+size, n, expected);
- check_forward<true, bidirectional_iterator<int*>>(range, range+size, n, expected);
- check_forward<true, random_access_iterator<int*>>(range, range+size, n, expected);
- check_forward<true, contiguous_iterator<int*>>( range, range+size, n, expected);
- check_forward<true, int*>( range, range+size, n, expected);
+ check_forward<true, forward_iterator<int*>>( range, range+size, n, expected, equals_count);
+ check_forward<true, bidirectional_iterator<int*>>(range, range+size, n, expected, equals_count);
+ check_forward<true, random_access_iterator<int*>>(range, range+size, n, expected, equals_count);
+ check_forward<true, contiguous_iterator<int*>>( range, range+size, n, expected, equals_count);
+ check_forward<true, int*>( range, range+size, n, expected, equals_count);
+ // clang-format on
check_forward_sized_sentinel<cpp17_input_iterator<int*>>( range, range+size, n, expected);
check_forward_sized_sentinel<cpp20_input_iterator<int*>>( range, range+size, n, expected);
@@ -188,14 +212,32 @@ constexpr bool test() {
check_forward_sized_sentinel<int*>( range, range+size, n, expected);
}
+ // Input and forward iterators are not tested as the backwards case does
+ // not apply for them.
{
- // Note that we can only test ranges::advance with a negative n for iterators that
- // are sized sentinels for themselves, because ranges::advance is UB otherwise.
- // In particular, that excludes bidirectional_iterators since those are not sized sentinels.
int* expected = n > size ? range : range + size - n;
- check_backward<random_access_iterator<int*>>(range, range+size, -n, expected);
- check_backward<contiguous_iterator<int*>>( range, range+size, -n, expected);
- check_backward<int*>( range, range+size, -n, expected);
+ {
+ Expected expected_counts = {
+ .stride_count = static_cast<int>(range + size - expected),
+ .stride_displacement = -expected_counts.stride_count,
+ .equals_count = n > size ? size + 1 : n,
+ };
+
+ check_backward<true, bidirectional_iterator<int*>>(range, range + size, -n, expected, expected_counts);
+ }
+ {
+ Expected expected_counts = {
+ // If `n >= size`, the algorithm can just do `it = std::move(sent);`
+ // instead of doing iterator arithmetic.
+ .stride_count = (n >= size) ? 0 : 1,
+ .stride_displacement = (n >= size) ? 0 : 1,
+ .equals_count = 0,
+ };
+
+ check_backward<false, random_access_iterator<int*>>(range, range + size, -n, expected, expected_counts);
+ check_backward<false, contiguous_iterator<int*>>(range, range + size, -n, expected, expected_counts);
+ check_backward<false, int*>(range, range + size, -n, expected, expected_counts);
+ }
}
}
}
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp
index ece13b0..8ccd252 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/algorithm.version.compile.pass.cpp
@@ -15,17 +15,18 @@
// Test the feature test macros defined by <algorithm>
-/* Constant Value
- __cpp_lib_clamp 201603L [C++17]
- __cpp_lib_constexpr_algorithms 201806L [C++20]
- __cpp_lib_freestanding_algorithm 202311L [C++26]
- __cpp_lib_parallel_algorithm 201603L [C++17]
- __cpp_lib_ranges 202207L [C++20]
- __cpp_lib_ranges_contains 202207L [C++23]
- __cpp_lib_ranges_starts_ends_with 202106L [C++23]
- __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14]
- __cpp_lib_sample 201603L [C++17]
- __cpp_lib_shift 201806L [C++20]
+/* Constant Value
+ __cpp_lib_clamp 201603L [C++17]
+ __cpp_lib_constexpr_algorithms 201806L [C++20]
+ __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26]
+ __cpp_lib_freestanding_algorithm 202311L [C++26]
+ __cpp_lib_parallel_algorithm 201603L [C++17]
+ __cpp_lib_ranges 202207L [C++20]
+ __cpp_lib_ranges_contains 202207L [C++23]
+ __cpp_lib_ranges_starts_ends_with 202106L [C++23]
+ __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14]
+ __cpp_lib_sample 201603L [C++17]
+ __cpp_lib_shift 201806L [C++20]
*/
#include <algorithm>
@@ -41,6 +42,10 @@
# error "__cpp_lib_constexpr_algorithms should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_algorithm
# error "__cpp_lib_freestanding_algorithm should not be defined before c++26"
# endif
@@ -83,6 +88,10 @@
# error "__cpp_lib_constexpr_algorithms should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_algorithm
# error "__cpp_lib_freestanding_algorithm should not be defined before c++26"
# endif
@@ -131,6 +140,10 @@
# error "__cpp_lib_constexpr_algorithms should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_algorithm
# error "__cpp_lib_freestanding_algorithm should not be defined before c++26"
# endif
@@ -194,6 +207,10 @@
# error "__cpp_lib_constexpr_algorithms should have the value 201806L in c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_algorithm
# error "__cpp_lib_freestanding_algorithm should not be defined before c++26"
# endif
@@ -263,6 +280,10 @@
# error "__cpp_lib_constexpr_algorithms should have the value 201806L in c++23"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_algorithm
# error "__cpp_lib_freestanding_algorithm should not be defined before c++26"
# endif
@@ -339,6 +360,19 @@
# endif
# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26"
+# endif
+# if __cpp_lib_default_template_type_for_algorithm_values != 202403L
+# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
+# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_freestanding_algorithm
# error "__cpp_lib_freestanding_algorithm should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp
index 86315c2..c907b7d 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/atomic.version.compile.pass.cpp
@@ -20,6 +20,7 @@
__cpp_lib_atomic_float 201711L [C++20]
__cpp_lib_atomic_is_always_lock_free 201603L [C++17]
__cpp_lib_atomic_lock_free_type_aliases 201907L [C++20]
+ __cpp_lib_atomic_min_max 202403L [C++26]
__cpp_lib_atomic_ref 201806L [C++20]
__cpp_lib_atomic_shared_ptr 201711L [C++20]
__cpp_lib_atomic_value_initialization 201911L [C++20]
@@ -48,6 +49,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should not be defined before c++20"
# endif
@@ -86,6 +91,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should not be defined before c++20"
# endif
@@ -127,6 +136,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should not be defined before c++20"
# endif
@@ -183,6 +196,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++20"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should be defined in c++20"
@@ -278,6 +295,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++23"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should be defined in c++23"
@@ -374,6 +395,19 @@
# endif
# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should be defined in c++26"
+# endif
+# if __cpp_lib_atomic_min_max != 202403L
+# error "__cpp_lib_atomic_min_max should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
+# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp
index 4a398e2..720557f 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/deque.version.compile.pass.cpp
@@ -15,11 +15,12 @@
// Test the feature test macros defined by <deque>
-/* Constant Value
- __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
- __cpp_lib_erase_if 202002L [C++20]
- __cpp_lib_nonmember_container_access 201411L [C++17]
- __cpp_lib_ranges_to_container 202202L [C++23]
+/* Constant Value
+ __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
+ __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26]
+ __cpp_lib_erase_if 202002L [C++20]
+ __cpp_lib_nonmember_container_access 201411L [C++17]
+ __cpp_lib_ranges_to_container 202202L [C++23]
*/
#include <deque>
@@ -31,6 +32,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -49,6 +54,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -70,6 +79,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -94,6 +107,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++20"
# endif
@@ -121,6 +138,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++23"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++23"
# endif
@@ -151,6 +172,19 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26"
+# endif
+# if __cpp_lib_default_template_type_for_algorithm_values != 202403L
+# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp
index 3f03e8b..308cc2d 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/filesystem.version.compile.pass.cpp
@@ -17,9 +17,10 @@
// Test the feature test macros defined by <filesystem>
-/* Constant Value
- __cpp_lib_char8_t 201907L [C++20]
- __cpp_lib_filesystem 201703L [C++17]
+/* Constant Value
+ __cpp_lib_char8_t 201907L [C++20]
+ __cpp_lib_filesystem 201703L [C++17]
+ __cpp_lib_format_path 202403L [C++23]
*/
#include <filesystem>
@@ -35,6 +36,10 @@
# error "__cpp_lib_filesystem should not be defined before c++17"
# endif
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined before c++23"
+# endif
+
#elif TEST_STD_VER == 14
# ifdef __cpp_lib_char8_t
@@ -45,6 +50,10 @@
# error "__cpp_lib_filesystem should not be defined before c++17"
# endif
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined before c++23"
+# endif
+
#elif TEST_STD_VER == 17
# ifdef __cpp_lib_char8_t
@@ -64,6 +73,10 @@
# endif
# endif
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined before c++23"
+# endif
+
#elif TEST_STD_VER == 20
# if defined(__cpp_char8_t)
@@ -92,6 +105,10 @@
# endif
# endif
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined before c++23"
+# endif
+
#elif TEST_STD_VER == 23
# if defined(__cpp_char8_t)
@@ -120,6 +137,19 @@
# endif
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_format_path
+# error "__cpp_lib_format_path should be defined in c++23"
+# endif
+# if __cpp_lib_format_path != 202403L
+# error "__cpp_lib_format_path should have the value 202403L in c++23"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
#elif TEST_STD_VER > 23
# if defined(__cpp_char8_t)
@@ -148,5 +178,18 @@
# endif
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_format_path
+# error "__cpp_lib_format_path should be defined in c++26"
+# endif
+# if __cpp_lib_format_path != 202403L
+# error "__cpp_lib_format_path should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
#endif // TEST_STD_VER > 23
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp
index b163943..9305cf0 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/forward_list.version.compile.pass.cpp
@@ -15,13 +15,14 @@
// Test the feature test macros defined by <forward_list>
-/* Constant Value
- __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
- __cpp_lib_erase_if 202002L [C++20]
- __cpp_lib_incomplete_container_elements 201505L [C++17]
- __cpp_lib_list_remove_return_type 201806L [C++20]
- __cpp_lib_nonmember_container_access 201411L [C++17]
- __cpp_lib_ranges_to_container 202202L [C++23]
+/* Constant Value
+ __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
+ __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26]
+ __cpp_lib_erase_if 202002L [C++20]
+ __cpp_lib_incomplete_container_elements 201505L [C++17]
+ __cpp_lib_list_remove_return_type 201806L [C++20]
+ __cpp_lib_nonmember_container_access 201411L [C++17]
+ __cpp_lib_ranges_to_container 202202L [C++23]
*/
#include <forward_list>
@@ -33,6 +34,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -59,6 +64,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -88,6 +97,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -123,6 +136,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++20"
# endif
@@ -164,6 +181,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++23"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++23"
# endif
@@ -208,6 +229,19 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26"
+# endif
+# if __cpp_lib_default_template_type_for_algorithm_values != 202403L
+# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp
index 72c96c6..fa4d9ba 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/functional.version.compile.pass.cpp
@@ -29,6 +29,7 @@
__cpp_lib_move_only_function 202110L [C++23]
__cpp_lib_not_fn 201603L [C++17]
__cpp_lib_ranges 202207L [C++20]
+ __cpp_lib_reference_wrapper 202403L [C++26]
__cpp_lib_result_of_sfinae 201210L [C++14]
__cpp_lib_transparent_operators 201210L [C++14]
201510L [C++17]
@@ -84,6 +85,10 @@
# error "__cpp_lib_ranges should not be defined before c++20"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_result_of_sfinae
# error "__cpp_lib_result_of_sfinae should not be defined before c++14"
# endif
@@ -142,6 +147,10 @@
# error "__cpp_lib_ranges should not be defined before c++20"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_result_of_sfinae
# error "__cpp_lib_result_of_sfinae should be defined in c++14"
# endif
@@ -215,6 +224,10 @@
# error "__cpp_lib_ranges should not be defined before c++20"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_result_of_sfinae
# error "__cpp_lib_result_of_sfinae should be defined in c++17"
# endif
@@ -297,6 +310,10 @@
# error "__cpp_lib_ranges should have the value 202207L in c++20"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_result_of_sfinae
# error "__cpp_lib_result_of_sfinae should be defined in c++20"
# endif
@@ -403,6 +420,10 @@
# error "__cpp_lib_ranges should have the value 202207L in c++23"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_result_of_sfinae
# error "__cpp_lib_result_of_sfinae should be defined in c++23"
# endif
@@ -527,6 +548,19 @@
# error "__cpp_lib_ranges should have the value 202207L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should be defined in c++26"
+# endif
+# if __cpp_lib_reference_wrapper != 202403L
+# error "__cpp_lib_reference_wrapper should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_result_of_sfinae
# error "__cpp_lib_result_of_sfinae should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp
index 48bff77..1222561 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/list.version.compile.pass.cpp
@@ -15,13 +15,14 @@
// Test the feature test macros defined by <list>
-/* Constant Value
- __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
- __cpp_lib_erase_if 202002L [C++20]
- __cpp_lib_incomplete_container_elements 201505L [C++17]
- __cpp_lib_list_remove_return_type 201806L [C++20]
- __cpp_lib_nonmember_container_access 201411L [C++17]
- __cpp_lib_ranges_to_container 202202L [C++23]
+/* Constant Value
+ __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
+ __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26]
+ __cpp_lib_erase_if 202002L [C++20]
+ __cpp_lib_incomplete_container_elements 201505L [C++17]
+ __cpp_lib_list_remove_return_type 201806L [C++20]
+ __cpp_lib_nonmember_container_access 201411L [C++17]
+ __cpp_lib_ranges_to_container 202202L [C++23]
*/
#include <list>
@@ -33,6 +34,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -59,6 +64,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should not be defined before c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -88,6 +97,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++17"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -123,6 +136,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++20"
# endif
@@ -164,6 +181,10 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++23"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++23"
# endif
@@ -208,6 +229,19 @@
# error "__cpp_lib_allocator_traits_is_always_equal should have the value 201411L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26"
+# endif
+# if __cpp_lib_default_template_type_for_algorithm_values != 202403L
+# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp
index 99716d8..15350a9 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp
@@ -16,6 +16,7 @@
// Test the feature test macros defined by <optional>
/* Constant Value
+ __cpp_lib_constrained_equality 202403L [C++26]
__cpp_lib_freestanding_optional 202311L [C++26]
__cpp_lib_optional 201606L [C++17]
202110L [C++23]
@@ -26,6 +27,10 @@
#if TEST_STD_VER < 14
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_optional
# error "__cpp_lib_freestanding_optional should not be defined before c++26"
# endif
@@ -36,6 +41,10 @@
#elif TEST_STD_VER == 14
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_optional
# error "__cpp_lib_freestanding_optional should not be defined before c++26"
# endif
@@ -46,6 +55,10 @@
#elif TEST_STD_VER == 17
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_optional
# error "__cpp_lib_freestanding_optional should not be defined before c++26"
# endif
@@ -59,6 +72,10 @@
#elif TEST_STD_VER == 20
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_optional
# error "__cpp_lib_freestanding_optional should not be defined before c++26"
# endif
@@ -72,6 +89,10 @@
#elif TEST_STD_VER == 23
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_optional
# error "__cpp_lib_freestanding_optional should not be defined before c++26"
# endif
@@ -86,6 +107,19 @@
#elif TEST_STD_VER > 23
# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should be defined in c++26"
+# endif
+# if __cpp_lib_constrained_equality != 202403L
+# error "__cpp_lib_constrained_equality should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
+# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_freestanding_optional
# error "__cpp_lib_freestanding_optional should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/random.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/random.version.compile.pass.cpp
new file mode 100644
index 0000000..1f138d9
--- /dev/null
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/random.version.compile.pass.cpp
@@ -0,0 +1,71 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_feature_test_macro_components.py
+// and should not be edited manually.
+//
+// clang-format off
+
+// <random>
+
+// Test the feature test macros defined by <random>
+
+/* Constant Value
+ __cpp_lib_generate_random 202403L [C++26]
+*/
+
+#include <random>
+#include "test_macros.h"
+
+#if TEST_STD_VER < 14
+
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
+#elif TEST_STD_VER == 14
+
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
+#elif TEST_STD_VER == 17
+
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
+#elif TEST_STD_VER == 20
+
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
+#elif TEST_STD_VER == 23
+
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
+#elif TEST_STD_VER > 23
+
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should be defined in c++26"
+# endif
+# if __cpp_lib_generate_random != 202403L
+# error "__cpp_lib_generate_random should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
+#endif // TEST_STD_VER > 23
+
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp
index aa3a496..30feacd 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/ranges.version.compile.pass.cpp
@@ -15,17 +15,19 @@
// Test the feature test macros defined by <ranges>
-/* Constant Value
- __cpp_lib_ranges 202207L [C++20]
- __cpp_lib_ranges_as_const 202207L [C++23]
- __cpp_lib_ranges_as_rvalue 202207L [C++23]
- __cpp_lib_ranges_chunk 202202L [C++23]
- __cpp_lib_ranges_chunk_by 202202L [C++23]
- __cpp_lib_ranges_join_with 202202L [C++23]
- __cpp_lib_ranges_repeat 202207L [C++23]
- __cpp_lib_ranges_slide 202202L [C++23]
- __cpp_lib_ranges_to_container 202202L [C++23]
- __cpp_lib_ranges_zip 202110L [C++23]
+/* Constant Value
+ __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26]
+ __cpp_lib_ranges 202207L [C++20]
+ __cpp_lib_ranges_as_const 202207L [C++23]
+ __cpp_lib_ranges_as_rvalue 202207L [C++23]
+ __cpp_lib_ranges_chunk 202202L [C++23]
+ __cpp_lib_ranges_chunk_by 202202L [C++23]
+ __cpp_lib_ranges_concat 202403L [C++26]
+ __cpp_lib_ranges_join_with 202202L [C++23]
+ __cpp_lib_ranges_repeat 202207L [C++23]
+ __cpp_lib_ranges_slide 202202L [C++23]
+ __cpp_lib_ranges_to_container 202202L [C++23]
+ __cpp_lib_ranges_zip 202110L [C++23]
*/
#include <ranges>
@@ -33,6 +35,10 @@
#if TEST_STD_VER < 14
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges
# error "__cpp_lib_ranges should not be defined before c++20"
# endif
@@ -53,6 +59,10 @@
# error "__cpp_lib_ranges_chunk_by should not be defined before c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should not be defined before c++23"
# endif
@@ -75,6 +85,10 @@
#elif TEST_STD_VER == 14
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges
# error "__cpp_lib_ranges should not be defined before c++20"
# endif
@@ -95,6 +109,10 @@
# error "__cpp_lib_ranges_chunk_by should not be defined before c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should not be defined before c++23"
# endif
@@ -117,6 +135,10 @@
#elif TEST_STD_VER == 17
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges
# error "__cpp_lib_ranges should not be defined before c++20"
# endif
@@ -137,6 +159,10 @@
# error "__cpp_lib_ranges_chunk_by should not be defined before c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should not be defined before c++23"
# endif
@@ -159,6 +185,10 @@
#elif TEST_STD_VER == 20
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_ranges
# error "__cpp_lib_ranges should be defined in c++20"
# endif
@@ -182,6 +212,10 @@
# error "__cpp_lib_ranges_chunk_by should not be defined before c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should not be defined before c++23"
# endif
@@ -204,6 +238,10 @@
#elif TEST_STD_VER == 23
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_ranges
# error "__cpp_lib_ranges should be defined in c++23"
# endif
@@ -251,6 +289,10 @@
# error "__cpp_lib_ranges_chunk_by should have the value 202202L in c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should be defined in c++23"
@@ -306,6 +348,19 @@
#elif TEST_STD_VER > 23
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26"
+# endif
+# if __cpp_lib_default_template_type_for_algorithm_values != 202403L
+# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_ranges
# error "__cpp_lib_ranges should be defined in c++26"
# endif
@@ -354,6 +409,19 @@
# endif
# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should be defined in c++26"
+# endif
+# if __cpp_lib_ranges_concat != 202403L
+# error "__cpp_lib_ranges_concat should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
+# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_ranges_join_with
# error "__cpp_lib_ranges_join_with should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp
index b5770f8..8d944a1 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/string.version.compile.pass.cpp
@@ -15,20 +15,21 @@
// Test the feature test macros defined by <string>
-/* Constant Value
- __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
- __cpp_lib_char8_t 201907L [C++20]
- __cpp_lib_constexpr_string 201907L [C++20]
- __cpp_lib_erase_if 202002L [C++20]
- __cpp_lib_nonmember_container_access 201411L [C++17]
- __cpp_lib_ranges_to_container 202202L [C++23]
- __cpp_lib_starts_ends_with 201711L [C++20]
- __cpp_lib_string_contains 202011L [C++23]
- __cpp_lib_string_resize_and_overwrite 202110L [C++23]
- __cpp_lib_string_udls 201304L [C++14]
- __cpp_lib_string_view 201606L [C++17]
- 201803L [C++20]
- __cpp_lib_to_string 202306L [C++23]
+/* Constant Value
+ __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
+ __cpp_lib_char8_t 201907L [C++20]
+ __cpp_lib_constexpr_string 201907L [C++20]
+ __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26]
+ __cpp_lib_erase_if 202002L [C++20]
+ __cpp_lib_nonmember_container_access 201411L [C++17]
+ __cpp_lib_ranges_to_container 202202L [C++23]
+ __cpp_lib_starts_ends_with 201711L [C++20]
+ __cpp_lib_string_contains 202011L [C++23]
+ __cpp_lib_string_resize_and_overwrite 202110L [C++23]
+ __cpp_lib_string_udls 201304L [C++14]
+ __cpp_lib_string_view 201606L [C++17]
+ 201803L [C++20]
+ __cpp_lib_to_string 202306L [C++23]
*/
#include <string>
@@ -48,6 +49,10 @@
# error "__cpp_lib_constexpr_string should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -98,6 +103,10 @@
# error "__cpp_lib_constexpr_string should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -154,6 +163,10 @@
# error "__cpp_lib_constexpr_string should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -228,6 +241,10 @@
# error "__cpp_lib_constexpr_string should have the value 201907L in c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++20"
# endif
@@ -308,6 +325,10 @@
# error "__cpp_lib_constexpr_string should have the value 201907L in c++23"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++23"
# endif
@@ -406,6 +427,19 @@
# error "__cpp_lib_constexpr_string should have the value 201907L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26"
+# endif
+# if __cpp_lib_default_template_type_for_algorithm_values != 202403L
+# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp
index ce17aef..6dd2e968 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/tuple.version.compile.pass.cpp
@@ -15,15 +15,16 @@
// Test the feature test macros defined by <tuple>
-/* Constant Value
- __cpp_lib_apply 201603L [C++17]
- __cpp_lib_constexpr_tuple 201811L [C++20]
- __cpp_lib_make_from_tuple 201606L [C++17]
- __cpp_lib_ranges_zip 202110L [C++23]
- __cpp_lib_tuple_element_t 201402L [C++14]
- __cpp_lib_tuple_like 202207L [C++23]
- 202311L [C++26]
- __cpp_lib_tuples_by_type 201304L [C++14]
+/* Constant Value
+ __cpp_lib_apply 201603L [C++17]
+ __cpp_lib_constexpr_tuple 201811L [C++20]
+ __cpp_lib_constrained_equality 202403L [C++26]
+ __cpp_lib_make_from_tuple 201606L [C++17]
+ __cpp_lib_ranges_zip 202110L [C++23]
+ __cpp_lib_tuple_element_t 201402L [C++14]
+ __cpp_lib_tuple_like 202207L [C++23]
+ 202311L [C++26]
+ __cpp_lib_tuples_by_type 201304L [C++14]
*/
#include <tuple>
@@ -39,6 +40,10 @@
# error "__cpp_lib_constexpr_tuple should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_make_from_tuple
# error "__cpp_lib_make_from_tuple should not be defined before c++17"
# endif
@@ -69,6 +74,10 @@
# error "__cpp_lib_constexpr_tuple should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_make_from_tuple
# error "__cpp_lib_make_from_tuple should not be defined before c++17"
# endif
@@ -108,6 +117,10 @@
# error "__cpp_lib_constexpr_tuple should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_make_from_tuple
# error "__cpp_lib_make_from_tuple should be defined in c++17"
# endif
@@ -153,6 +166,10 @@
# error "__cpp_lib_constexpr_tuple should have the value 201811L in c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_make_from_tuple
# error "__cpp_lib_make_from_tuple should be defined in c++20"
# endif
@@ -198,6 +215,10 @@
# error "__cpp_lib_constexpr_tuple should have the value 201811L in c++23"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_make_from_tuple
# error "__cpp_lib_make_from_tuple should be defined in c++23"
# endif
@@ -261,6 +282,19 @@
# error "__cpp_lib_constexpr_tuple should have the value 201811L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should be defined in c++26"
+# endif
+# if __cpp_lib_constrained_equality != 202403L
+# error "__cpp_lib_constrained_equality should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_make_from_tuple
# error "__cpp_lib_make_from_tuple should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp
index dd56f8d..ab0988f 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/utility.version.compile.pass.cpp
@@ -19,6 +19,7 @@
__cpp_lib_as_const 201510L [C++17]
__cpp_lib_constexpr_algorithms 201806L [C++20]
__cpp_lib_constexpr_utility 201811L [C++20]
+ __cpp_lib_constrained_equality 202403L [C++26]
__cpp_lib_exchange_function 201304L [C++14]
__cpp_lib_forward_like 202207L [C++23]
__cpp_lib_integer_comparison_functions 202002L [C++20]
@@ -48,6 +49,10 @@
# error "__cpp_lib_constexpr_utility should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_exchange_function
# error "__cpp_lib_exchange_function should not be defined before c++14"
# endif
@@ -98,6 +103,10 @@
# error "__cpp_lib_constexpr_utility should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_exchange_function
# error "__cpp_lib_exchange_function should be defined in c++14"
# endif
@@ -160,6 +169,10 @@
# error "__cpp_lib_constexpr_utility should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_exchange_function
# error "__cpp_lib_exchange_function should be defined in c++17"
# endif
@@ -228,6 +241,10 @@
# error "__cpp_lib_constexpr_utility should have the value 201811L in c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_exchange_function
# error "__cpp_lib_exchange_function should be defined in c++20"
# endif
@@ -299,6 +316,10 @@
# error "__cpp_lib_constexpr_utility should have the value 201811L in c++23"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_exchange_function
# error "__cpp_lib_exchange_function should be defined in c++23"
# endif
@@ -397,6 +418,19 @@
# error "__cpp_lib_constexpr_utility should have the value 201811L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should be defined in c++26"
+# endif
+# if __cpp_lib_constrained_equality != 202403L
+# error "__cpp_lib_constrained_equality should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_exchange_function
# error "__cpp_lib_exchange_function should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp
index 3e65b14..4dcc477 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/variant.version.compile.pass.cpp
@@ -16,6 +16,7 @@
// Test the feature test macros defined by <variant>
/* Constant Value
+ __cpp_lib_constrained_equality 202403L [C++26]
__cpp_lib_freestanding_variant 202311L [C++26]
__cpp_lib_variant 202102L [C++17]
*/
@@ -25,6 +26,10 @@
#if TEST_STD_VER < 14
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_variant
# error "__cpp_lib_freestanding_variant should not be defined before c++26"
# endif
@@ -35,6 +40,10 @@
#elif TEST_STD_VER == 14
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_variant
# error "__cpp_lib_freestanding_variant should not be defined before c++26"
# endif
@@ -45,6 +54,10 @@
#elif TEST_STD_VER == 17
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_variant
# error "__cpp_lib_freestanding_variant should not be defined before c++26"
# endif
@@ -58,6 +71,10 @@
#elif TEST_STD_VER == 20
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_variant
# error "__cpp_lib_freestanding_variant should not be defined before c++26"
# endif
@@ -71,6 +88,10 @@
#elif TEST_STD_VER == 23
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_freestanding_variant
# error "__cpp_lib_freestanding_variant should not be defined before c++26"
# endif
@@ -85,6 +106,19 @@
#elif TEST_STD_VER > 23
# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should be defined in c++26"
+# endif
+# if __cpp_lib_constrained_equality != 202403L
+# error "__cpp_lib_constrained_equality should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
+# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_freestanding_variant
# error "__cpp_lib_freestanding_variant should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp
index 6eee936..3d0a956 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/vector.version.compile.pass.cpp
@@ -15,13 +15,14 @@
// Test the feature test macros defined by <vector>
-/* Constant Value
- __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
- __cpp_lib_constexpr_vector 201907L [C++20]
- __cpp_lib_erase_if 202002L [C++20]
- __cpp_lib_incomplete_container_elements 201505L [C++17]
- __cpp_lib_nonmember_container_access 201411L [C++17]
- __cpp_lib_ranges_to_container 202202L [C++23]
+/* Constant Value
+ __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
+ __cpp_lib_constexpr_vector 201907L [C++20]
+ __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26]
+ __cpp_lib_erase_if 202002L [C++20]
+ __cpp_lib_incomplete_container_elements 201505L [C++17]
+ __cpp_lib_nonmember_container_access 201411L [C++17]
+ __cpp_lib_ranges_to_container 202202L [C++23]
*/
#include <vector>
@@ -37,6 +38,10 @@
# error "__cpp_lib_constexpr_vector should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -63,6 +68,10 @@
# error "__cpp_lib_constexpr_vector should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -92,6 +101,10 @@
# error "__cpp_lib_constexpr_vector should not be defined before c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should not be defined before c++20"
# endif
@@ -130,6 +143,10 @@
# error "__cpp_lib_constexpr_vector should have the value 201907L in c++20"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++20"
# endif
@@ -171,6 +188,10 @@
# error "__cpp_lib_constexpr_vector should have the value 201907L in c++23"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++23"
# endif
@@ -215,6 +236,19 @@
# error "__cpp_lib_constexpr_vector should have the value 201907L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26"
+# endif
+# if __cpp_lib_default_template_type_for_algorithm_values != 202403L
+# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_erase_if
# error "__cpp_lib_erase_if should be defined in c++26"
# endif
diff --git a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
index 5501587..5055786 100644
--- a/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
+++ b/libcxx/test/std/language.support/support.limits/support.limits.general/version.version.compile.pass.cpp
@@ -15,217 +15,224 @@
// Test the feature test macros defined by <version>
-/* Constant Value
- __cpp_lib_adaptor_iterator_pair_constructor 202106L [C++23]
- __cpp_lib_addressof_constexpr 201603L [C++17]
- __cpp_lib_allocate_at_least 202302L [C++23]
- __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
- __cpp_lib_any 201606L [C++17]
- __cpp_lib_apply 201603L [C++17]
- __cpp_lib_array_constexpr 201603L [C++17]
- 201811L [C++20]
- __cpp_lib_as_const 201510L [C++17]
- __cpp_lib_associative_heterogeneous_erasure 202110L [C++23]
- __cpp_lib_associative_heterogeneous_insertion 202306L [C++26]
- __cpp_lib_assume_aligned 201811L [C++20]
- __cpp_lib_atomic_flag_test 201907L [C++20]
- __cpp_lib_atomic_float 201711L [C++20]
- __cpp_lib_atomic_is_always_lock_free 201603L [C++17]
- __cpp_lib_atomic_lock_free_type_aliases 201907L [C++20]
- __cpp_lib_atomic_ref 201806L [C++20]
- __cpp_lib_atomic_shared_ptr 201711L [C++20]
- __cpp_lib_atomic_value_initialization 201911L [C++20]
- __cpp_lib_atomic_wait 201907L [C++20]
- __cpp_lib_barrier 201907L [C++20]
- __cpp_lib_bind_back 202202L [C++23]
- 202306L [C++26]
- __cpp_lib_bind_front 201907L [C++20]
- 202306L [C++26]
- __cpp_lib_bit_cast 201806L [C++20]
- __cpp_lib_bitops 201907L [C++20]
- __cpp_lib_bitset 202306L [C++26]
- __cpp_lib_bool_constant 201505L [C++17]
- __cpp_lib_bounded_array_traits 201902L [C++20]
- __cpp_lib_boyer_moore_searcher 201603L [C++17]
- __cpp_lib_byte 201603L [C++17]
- __cpp_lib_byteswap 202110L [C++23]
- __cpp_lib_char8_t 201907L [C++20]
- __cpp_lib_chrono 201611L [C++17]
- __cpp_lib_chrono_udls 201304L [C++14]
- __cpp_lib_clamp 201603L [C++17]
- __cpp_lib_complex_udls 201309L [C++14]
- __cpp_lib_concepts 202002L [C++20]
- __cpp_lib_constexpr_algorithms 201806L [C++20]
- __cpp_lib_constexpr_bitset 202207L [C++23]
- __cpp_lib_constexpr_charconv 202207L [C++23]
- __cpp_lib_constexpr_cmath 202202L [C++23]
- __cpp_lib_constexpr_complex 201711L [C++20]
- __cpp_lib_constexpr_dynamic_alloc 201907L [C++20]
- __cpp_lib_constexpr_functional 201907L [C++20]
- __cpp_lib_constexpr_iterator 201811L [C++20]
- __cpp_lib_constexpr_memory 201811L [C++20]
- 202202L [C++23]
- __cpp_lib_constexpr_numeric 201911L [C++20]
- __cpp_lib_constexpr_string 201907L [C++20]
- __cpp_lib_constexpr_string_view 201811L [C++20]
- __cpp_lib_constexpr_tuple 201811L [C++20]
- __cpp_lib_constexpr_typeinfo 202106L [C++23]
- __cpp_lib_constexpr_utility 201811L [C++20]
- __cpp_lib_constexpr_vector 201907L [C++20]
- __cpp_lib_copyable_function 202306L [C++26]
- __cpp_lib_coroutine 201902L [C++20]
- __cpp_lib_debugging 202311L [C++26]
- __cpp_lib_destroying_delete 201806L [C++20]
- __cpp_lib_enable_shared_from_this 201603L [C++17]
- __cpp_lib_endian 201907L [C++20]
- __cpp_lib_erase_if 202002L [C++20]
- __cpp_lib_exchange_function 201304L [C++14]
- __cpp_lib_execution 201603L [C++17]
- 201902L [C++20]
- __cpp_lib_expected 202211L [C++23]
- __cpp_lib_filesystem 201703L [C++17]
- __cpp_lib_format 202106L [C++20]
- __cpp_lib_format_ranges 202207L [C++23]
- __cpp_lib_format_uchar 202311L [C++20]
- __cpp_lib_formatters 202302L [C++23]
- __cpp_lib_forward_like 202207L [C++23]
- __cpp_lib_freestanding_algorithm 202311L [C++26]
- __cpp_lib_freestanding_array 202311L [C++26]
- __cpp_lib_freestanding_cstring 202306L [C++26]
- __cpp_lib_freestanding_expected 202311L [C++26]
- __cpp_lib_freestanding_mdspan 202311L [C++26]
- __cpp_lib_freestanding_optional 202311L [C++26]
- __cpp_lib_freestanding_string_view 202311L [C++26]
- __cpp_lib_freestanding_variant 202311L [C++26]
- __cpp_lib_fstream_native_handle 202306L [C++26]
- __cpp_lib_function_ref 202306L [C++26]
- __cpp_lib_gcd_lcm 201606L [C++17]
- __cpp_lib_generic_associative_lookup 201304L [C++14]
- __cpp_lib_generic_unordered_lookup 201811L [C++20]
- __cpp_lib_hardware_interference_size 201703L [C++17]
- __cpp_lib_has_unique_object_representations 201606L [C++17]
- __cpp_lib_hazard_pointer 202306L [C++26]
- __cpp_lib_hypot 201603L [C++17]
- __cpp_lib_incomplete_container_elements 201505L [C++17]
- __cpp_lib_int_pow2 202002L [C++20]
- __cpp_lib_integer_comparison_functions 202002L [C++20]
- __cpp_lib_integer_sequence 201304L [C++14]
- __cpp_lib_integral_constant_callable 201304L [C++14]
- __cpp_lib_interpolate 201902L [C++20]
- __cpp_lib_invoke 201411L [C++17]
- __cpp_lib_invoke_r 202106L [C++23]
- __cpp_lib_ios_noreplace 202207L [C++23]
- __cpp_lib_is_aggregate 201703L [C++17]
- __cpp_lib_is_constant_evaluated 201811L [C++20]
- __cpp_lib_is_final 201402L [C++14]
- __cpp_lib_is_invocable 201703L [C++17]
- __cpp_lib_is_layout_compatible 201907L [C++20]
- __cpp_lib_is_nothrow_convertible 201806L [C++20]
- __cpp_lib_is_null_pointer 201309L [C++14]
- __cpp_lib_is_pointer_interconvertible 201907L [C++20]
- __cpp_lib_is_scoped_enum 202011L [C++23]
- __cpp_lib_is_swappable 201603L [C++17]
- __cpp_lib_jthread 201911L [C++20]
- __cpp_lib_latch 201907L [C++20]
- __cpp_lib_launder 201606L [C++17]
- __cpp_lib_linalg 202311L [C++26]
- __cpp_lib_list_remove_return_type 201806L [C++20]
- __cpp_lib_logical_traits 201510L [C++17]
- __cpp_lib_make_from_tuple 201606L [C++17]
- __cpp_lib_make_reverse_iterator 201402L [C++14]
- __cpp_lib_make_unique 201304L [C++14]
- __cpp_lib_map_try_emplace 201411L [C++17]
- __cpp_lib_math_constants 201907L [C++20]
- __cpp_lib_math_special_functions 201603L [C++17]
- __cpp_lib_mdspan 202207L [C++23]
- __cpp_lib_memory_resource 201603L [C++17]
- __cpp_lib_move_iterator_concept 202207L [C++20]
- __cpp_lib_move_only_function 202110L [C++23]
- __cpp_lib_node_extract 201606L [C++17]
- __cpp_lib_nonmember_container_access 201411L [C++17]
- __cpp_lib_not_fn 201603L [C++17]
- __cpp_lib_null_iterators 201304L [C++14]
- __cpp_lib_optional 201606L [C++17]
- 202110L [C++23]
- __cpp_lib_out_ptr 202106L [C++23]
- 202311L [C++26]
- __cpp_lib_parallel_algorithm 201603L [C++17]
- __cpp_lib_polymorphic_allocator 201902L [C++20]
- __cpp_lib_print 202207L [C++23]
- __cpp_lib_quoted_string_io 201304L [C++14]
- __cpp_lib_ranges 202207L [C++20]
- __cpp_lib_ranges_as_const 202207L [C++23]
- __cpp_lib_ranges_as_rvalue 202207L [C++23]
- __cpp_lib_ranges_chunk 202202L [C++23]
- __cpp_lib_ranges_chunk_by 202202L [C++23]
- __cpp_lib_ranges_contains 202207L [C++23]
- __cpp_lib_ranges_iota 202202L [C++23]
- __cpp_lib_ranges_join_with 202202L [C++23]
- __cpp_lib_ranges_repeat 202207L [C++23]
- __cpp_lib_ranges_slide 202202L [C++23]
- __cpp_lib_ranges_starts_ends_with 202106L [C++23]
- __cpp_lib_ranges_to_container 202202L [C++23]
- __cpp_lib_ranges_zip 202110L [C++23]
- __cpp_lib_ratio 202306L [C++26]
- __cpp_lib_raw_memory_algorithms 201606L [C++17]
- __cpp_lib_rcu 202306L [C++26]
- __cpp_lib_reference_from_temporary 202202L [C++23]
- __cpp_lib_remove_cvref 201711L [C++20]
- __cpp_lib_result_of_sfinae 201210L [C++14]
- __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14]
- __cpp_lib_sample 201603L [C++17]
- __cpp_lib_saturation_arithmetic 202311L [C++26]
- __cpp_lib_scoped_lock 201703L [C++17]
- __cpp_lib_semaphore 201907L [C++20]
- __cpp_lib_shared_mutex 201505L [C++17]
- __cpp_lib_shared_ptr_arrays 201611L [C++17]
- 201707L [C++20]
- __cpp_lib_shared_ptr_weak_type 201606L [C++17]
- __cpp_lib_shared_timed_mutex 201402L [C++14]
- __cpp_lib_shift 201806L [C++20]
- __cpp_lib_smart_ptr_for_overwrite 202002L [C++20]
- __cpp_lib_smart_ptr_owner_equality 202306L [C++26]
- __cpp_lib_source_location 201907L [C++20]
- __cpp_lib_span 202002L [C++20]
- __cpp_lib_span_at 202311L [C++26]
- __cpp_lib_span_initializer_list 202311L [C++26]
- __cpp_lib_spanstream 202106L [C++23]
- __cpp_lib_ssize 201902L [C++20]
- __cpp_lib_sstream_from_string_view 202306L [C++26]
- __cpp_lib_stacktrace 202011L [C++23]
- __cpp_lib_starts_ends_with 201711L [C++20]
- __cpp_lib_stdatomic_h 202011L [C++23]
- __cpp_lib_string_contains 202011L [C++23]
- __cpp_lib_string_resize_and_overwrite 202110L [C++23]
- __cpp_lib_string_udls 201304L [C++14]
- __cpp_lib_string_view 201606L [C++17]
- 201803L [C++20]
- __cpp_lib_submdspan 202306L [C++26]
- __cpp_lib_syncbuf 201803L [C++20]
- __cpp_lib_text_encoding 202306L [C++26]
- __cpp_lib_three_way_comparison 201907L [C++20]
- __cpp_lib_to_address 201711L [C++20]
- __cpp_lib_to_array 201907L [C++20]
- __cpp_lib_to_chars 201611L [C++17]
- 202306L [C++26]
- __cpp_lib_to_string 202306L [C++23]
- __cpp_lib_to_underlying 202102L [C++23]
- __cpp_lib_transformation_trait_aliases 201304L [C++14]
- __cpp_lib_transparent_operators 201210L [C++14]
- 201510L [C++17]
- __cpp_lib_tuple_element_t 201402L [C++14]
- __cpp_lib_tuple_like 202207L [C++23]
- 202311L [C++26]
- __cpp_lib_tuples_by_type 201304L [C++14]
- __cpp_lib_type_identity 201806L [C++20]
- __cpp_lib_type_trait_variable_templates 201510L [C++17]
- __cpp_lib_uncaught_exceptions 201411L [C++17]
- __cpp_lib_unordered_map_try_emplace 201411L [C++17]
- __cpp_lib_unreachable 202202L [C++23]
- __cpp_lib_unwrap_ref 201811L [C++20]
- __cpp_lib_variant 202102L [C++17]
- __cpp_lib_void_t 201411L [C++17]
- __cpp_lib_within_lifetime 202306L [C++26]
+/* Constant Value
+ __cpp_lib_adaptor_iterator_pair_constructor 202106L [C++23]
+ __cpp_lib_addressof_constexpr 201603L [C++17]
+ __cpp_lib_allocate_at_least 202302L [C++23]
+ __cpp_lib_allocator_traits_is_always_equal 201411L [C++17]
+ __cpp_lib_any 201606L [C++17]
+ __cpp_lib_apply 201603L [C++17]
+ __cpp_lib_array_constexpr 201603L [C++17]
+ 201811L [C++20]
+ __cpp_lib_as_const 201510L [C++17]
+ __cpp_lib_associative_heterogeneous_erasure 202110L [C++23]
+ __cpp_lib_associative_heterogeneous_insertion 202306L [C++26]
+ __cpp_lib_assume_aligned 201811L [C++20]
+ __cpp_lib_atomic_flag_test 201907L [C++20]
+ __cpp_lib_atomic_float 201711L [C++20]
+ __cpp_lib_atomic_is_always_lock_free 201603L [C++17]
+ __cpp_lib_atomic_lock_free_type_aliases 201907L [C++20]
+ __cpp_lib_atomic_min_max 202403L [C++26]
+ __cpp_lib_atomic_ref 201806L [C++20]
+ __cpp_lib_atomic_shared_ptr 201711L [C++20]
+ __cpp_lib_atomic_value_initialization 201911L [C++20]
+ __cpp_lib_atomic_wait 201907L [C++20]
+ __cpp_lib_barrier 201907L [C++20]
+ __cpp_lib_bind_back 202202L [C++23]
+ 202306L [C++26]
+ __cpp_lib_bind_front 201907L [C++20]
+ 202306L [C++26]
+ __cpp_lib_bit_cast 201806L [C++20]
+ __cpp_lib_bitops 201907L [C++20]
+ __cpp_lib_bitset 202306L [C++26]
+ __cpp_lib_bool_constant 201505L [C++17]
+ __cpp_lib_bounded_array_traits 201902L [C++20]
+ __cpp_lib_boyer_moore_searcher 201603L [C++17]
+ __cpp_lib_byte 201603L [C++17]
+ __cpp_lib_byteswap 202110L [C++23]
+ __cpp_lib_char8_t 201907L [C++20]
+ __cpp_lib_chrono 201611L [C++17]
+ __cpp_lib_chrono_udls 201304L [C++14]
+ __cpp_lib_clamp 201603L [C++17]
+ __cpp_lib_complex_udls 201309L [C++14]
+ __cpp_lib_concepts 202002L [C++20]
+ __cpp_lib_constexpr_algorithms 201806L [C++20]
+ __cpp_lib_constexpr_bitset 202207L [C++23]
+ __cpp_lib_constexpr_charconv 202207L [C++23]
+ __cpp_lib_constexpr_cmath 202202L [C++23]
+ __cpp_lib_constexpr_complex 201711L [C++20]
+ __cpp_lib_constexpr_dynamic_alloc 201907L [C++20]
+ __cpp_lib_constexpr_functional 201907L [C++20]
+ __cpp_lib_constexpr_iterator 201811L [C++20]
+ __cpp_lib_constexpr_memory 201811L [C++20]
+ 202202L [C++23]
+ __cpp_lib_constexpr_numeric 201911L [C++20]
+ __cpp_lib_constexpr_string 201907L [C++20]
+ __cpp_lib_constexpr_string_view 201811L [C++20]
+ __cpp_lib_constexpr_tuple 201811L [C++20]
+ __cpp_lib_constexpr_typeinfo 202106L [C++23]
+ __cpp_lib_constexpr_utility 201811L [C++20]
+ __cpp_lib_constexpr_vector 201907L [C++20]
+ __cpp_lib_constrained_equality 202403L [C++26]
+ __cpp_lib_copyable_function 202306L [C++26]
+ __cpp_lib_coroutine 201902L [C++20]
+ __cpp_lib_debugging 202311L [C++26]
+ __cpp_lib_default_template_type_for_algorithm_values 202403L [C++26]
+ __cpp_lib_destroying_delete 201806L [C++20]
+ __cpp_lib_enable_shared_from_this 201603L [C++17]
+ __cpp_lib_endian 201907L [C++20]
+ __cpp_lib_erase_if 202002L [C++20]
+ __cpp_lib_exchange_function 201304L [C++14]
+ __cpp_lib_execution 201603L [C++17]
+ 201902L [C++20]
+ __cpp_lib_expected 202211L [C++23]
+ __cpp_lib_filesystem 201703L [C++17]
+ __cpp_lib_format 202106L [C++20]
+ __cpp_lib_format_path 202403L [C++23]
+ __cpp_lib_format_ranges 202207L [C++23]
+ __cpp_lib_format_uchar 202311L [C++20]
+ __cpp_lib_formatters 202302L [C++23]
+ __cpp_lib_forward_like 202207L [C++23]
+ __cpp_lib_freestanding_algorithm 202311L [C++26]
+ __cpp_lib_freestanding_array 202311L [C++26]
+ __cpp_lib_freestanding_cstring 202306L [C++26]
+ __cpp_lib_freestanding_expected 202311L [C++26]
+ __cpp_lib_freestanding_mdspan 202311L [C++26]
+ __cpp_lib_freestanding_optional 202311L [C++26]
+ __cpp_lib_freestanding_string_view 202311L [C++26]
+ __cpp_lib_freestanding_variant 202311L [C++26]
+ __cpp_lib_fstream_native_handle 202306L [C++26]
+ __cpp_lib_function_ref 202306L [C++26]
+ __cpp_lib_gcd_lcm 201606L [C++17]
+ __cpp_lib_generate_random 202403L [C++26]
+ __cpp_lib_generic_associative_lookup 201304L [C++14]
+ __cpp_lib_generic_unordered_lookup 201811L [C++20]
+ __cpp_lib_hardware_interference_size 201703L [C++17]
+ __cpp_lib_has_unique_object_representations 201606L [C++17]
+ __cpp_lib_hazard_pointer 202306L [C++26]
+ __cpp_lib_hypot 201603L [C++17]
+ __cpp_lib_incomplete_container_elements 201505L [C++17]
+ __cpp_lib_int_pow2 202002L [C++20]
+ __cpp_lib_integer_comparison_functions 202002L [C++20]
+ __cpp_lib_integer_sequence 201304L [C++14]
+ __cpp_lib_integral_constant_callable 201304L [C++14]
+ __cpp_lib_interpolate 201902L [C++20]
+ __cpp_lib_invoke 201411L [C++17]
+ __cpp_lib_invoke_r 202106L [C++23]
+ __cpp_lib_ios_noreplace 202207L [C++23]
+ __cpp_lib_is_aggregate 201703L [C++17]
+ __cpp_lib_is_constant_evaluated 201811L [C++20]
+ __cpp_lib_is_final 201402L [C++14]
+ __cpp_lib_is_invocable 201703L [C++17]
+ __cpp_lib_is_layout_compatible 201907L [C++20]
+ __cpp_lib_is_nothrow_convertible 201806L [C++20]
+ __cpp_lib_is_null_pointer 201309L [C++14]
+ __cpp_lib_is_pointer_interconvertible 201907L [C++20]
+ __cpp_lib_is_scoped_enum 202011L [C++23]
+ __cpp_lib_is_swappable 201603L [C++17]
+ __cpp_lib_jthread 201911L [C++20]
+ __cpp_lib_latch 201907L [C++20]
+ __cpp_lib_launder 201606L [C++17]
+ __cpp_lib_linalg 202311L [C++26]
+ __cpp_lib_list_remove_return_type 201806L [C++20]
+ __cpp_lib_logical_traits 201510L [C++17]
+ __cpp_lib_make_from_tuple 201606L [C++17]
+ __cpp_lib_make_reverse_iterator 201402L [C++14]
+ __cpp_lib_make_unique 201304L [C++14]
+ __cpp_lib_map_try_emplace 201411L [C++17]
+ __cpp_lib_math_constants 201907L [C++20]
+ __cpp_lib_math_special_functions 201603L [C++17]
+ __cpp_lib_mdspan 202207L [C++23]
+ __cpp_lib_memory_resource 201603L [C++17]
+ __cpp_lib_move_iterator_concept 202207L [C++20]
+ __cpp_lib_move_only_function 202110L [C++23]
+ __cpp_lib_node_extract 201606L [C++17]
+ __cpp_lib_nonmember_container_access 201411L [C++17]
+ __cpp_lib_not_fn 201603L [C++17]
+ __cpp_lib_null_iterators 201304L [C++14]
+ __cpp_lib_optional 201606L [C++17]
+ 202110L [C++23]
+ __cpp_lib_out_ptr 202106L [C++23]
+ 202311L [C++26]
+ __cpp_lib_parallel_algorithm 201603L [C++17]
+ __cpp_lib_polymorphic_allocator 201902L [C++20]
+ __cpp_lib_print 202207L [C++23]
+ __cpp_lib_quoted_string_io 201304L [C++14]
+ __cpp_lib_ranges 202207L [C++20]
+ __cpp_lib_ranges_as_const 202207L [C++23]
+ __cpp_lib_ranges_as_rvalue 202207L [C++23]
+ __cpp_lib_ranges_chunk 202202L [C++23]
+ __cpp_lib_ranges_chunk_by 202202L [C++23]
+ __cpp_lib_ranges_concat 202403L [C++26]
+ __cpp_lib_ranges_contains 202207L [C++23]
+ __cpp_lib_ranges_iota 202202L [C++23]
+ __cpp_lib_ranges_join_with 202202L [C++23]
+ __cpp_lib_ranges_repeat 202207L [C++23]
+ __cpp_lib_ranges_slide 202202L [C++23]
+ __cpp_lib_ranges_starts_ends_with 202106L [C++23]
+ __cpp_lib_ranges_to_container 202202L [C++23]
+ __cpp_lib_ranges_zip 202110L [C++23]
+ __cpp_lib_ratio 202306L [C++26]
+ __cpp_lib_raw_memory_algorithms 201606L [C++17]
+ __cpp_lib_rcu 202306L [C++26]
+ __cpp_lib_reference_from_temporary 202202L [C++23]
+ __cpp_lib_reference_wrapper 202403L [C++26]
+ __cpp_lib_remove_cvref 201711L [C++20]
+ __cpp_lib_result_of_sfinae 201210L [C++14]
+ __cpp_lib_robust_nonmodifying_seq_ops 201304L [C++14]
+ __cpp_lib_sample 201603L [C++17]
+ __cpp_lib_saturation_arithmetic 202311L [C++26]
+ __cpp_lib_scoped_lock 201703L [C++17]
+ __cpp_lib_semaphore 201907L [C++20]
+ __cpp_lib_shared_mutex 201505L [C++17]
+ __cpp_lib_shared_ptr_arrays 201611L [C++17]
+ 201707L [C++20]
+ __cpp_lib_shared_ptr_weak_type 201606L [C++17]
+ __cpp_lib_shared_timed_mutex 201402L [C++14]
+ __cpp_lib_shift 201806L [C++20]
+ __cpp_lib_smart_ptr_for_overwrite 202002L [C++20]
+ __cpp_lib_smart_ptr_owner_equality 202306L [C++26]
+ __cpp_lib_source_location 201907L [C++20]
+ __cpp_lib_span 202002L [C++20]
+ __cpp_lib_span_at 202311L [C++26]
+ __cpp_lib_span_initializer_list 202311L [C++26]
+ __cpp_lib_spanstream 202106L [C++23]
+ __cpp_lib_ssize 201902L [C++20]
+ __cpp_lib_sstream_from_string_view 202306L [C++26]
+ __cpp_lib_stacktrace 202011L [C++23]
+ __cpp_lib_starts_ends_with 201711L [C++20]
+ __cpp_lib_stdatomic_h 202011L [C++23]
+ __cpp_lib_string_contains 202011L [C++23]
+ __cpp_lib_string_resize_and_overwrite 202110L [C++23]
+ __cpp_lib_string_udls 201304L [C++14]
+ __cpp_lib_string_view 201606L [C++17]
+ 201803L [C++20]
+ __cpp_lib_submdspan 202306L [C++26]
+ __cpp_lib_syncbuf 201803L [C++20]
+ __cpp_lib_text_encoding 202306L [C++26]
+ __cpp_lib_three_way_comparison 201907L [C++20]
+ __cpp_lib_to_address 201711L [C++20]
+ __cpp_lib_to_array 201907L [C++20]
+ __cpp_lib_to_chars 201611L [C++17]
+ 202306L [C++26]
+ __cpp_lib_to_string 202306L [C++23]
+ __cpp_lib_to_underlying 202102L [C++23]
+ __cpp_lib_transformation_trait_aliases 201304L [C++14]
+ __cpp_lib_transparent_operators 201210L [C++14]
+ 201510L [C++17]
+ __cpp_lib_tuple_element_t 201402L [C++14]
+ __cpp_lib_tuple_like 202207L [C++23]
+ 202311L [C++26]
+ __cpp_lib_tuples_by_type 201304L [C++14]
+ __cpp_lib_type_identity 201806L [C++20]
+ __cpp_lib_type_trait_variable_templates 201510L [C++17]
+ __cpp_lib_uncaught_exceptions 201411L [C++17]
+ __cpp_lib_unordered_map_try_emplace 201411L [C++17]
+ __cpp_lib_unreachable 202202L [C++23]
+ __cpp_lib_unwrap_ref 201811L [C++20]
+ __cpp_lib_variant 202102L [C++17]
+ __cpp_lib_void_t 201411L [C++17]
+ __cpp_lib_within_lifetime 202306L [C++26]
*/
#include <version>
@@ -293,6 +300,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should not be defined before c++20"
# endif
@@ -441,6 +452,10 @@
# error "__cpp_lib_constexpr_vector should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_copyable_function
# error "__cpp_lib_copyable_function should not be defined before c++26"
# endif
@@ -453,6 +468,10 @@
# error "__cpp_lib_debugging should not be defined before c++26"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_destroying_delete
# error "__cpp_lib_destroying_delete should not be defined before c++20"
# endif
@@ -489,6 +508,10 @@
# error "__cpp_lib_format should not be defined before c++20"
# endif
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined before c++23"
+# endif
+
# ifdef __cpp_lib_format_ranges
# error "__cpp_lib_format_ranges should not be defined before c++23"
# endif
@@ -549,6 +572,10 @@
# error "__cpp_lib_gcd_lcm should not be defined before c++17"
# endif
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_generic_associative_lookup
# error "__cpp_lib_generic_associative_lookup should not be defined before c++14"
# endif
@@ -773,6 +800,10 @@
# error "__cpp_lib_ranges_chunk_by should not be defined before c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges_contains
# error "__cpp_lib_ranges_contains should not be defined before c++23"
# endif
@@ -821,6 +852,10 @@
# error "__cpp_lib_reference_from_temporary should not be defined before c++23"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_remove_cvref
# error "__cpp_lib_remove_cvref should not be defined before c++20"
# endif
@@ -1087,6 +1122,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should not be defined before c++20"
# endif
@@ -1241,6 +1280,10 @@
# error "__cpp_lib_constexpr_vector should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_copyable_function
# error "__cpp_lib_copyable_function should not be defined before c++26"
# endif
@@ -1253,6 +1296,10 @@
# error "__cpp_lib_debugging should not be defined before c++26"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_destroying_delete
# error "__cpp_lib_destroying_delete should not be defined before c++20"
# endif
@@ -1292,6 +1339,10 @@
# error "__cpp_lib_format should not be defined before c++20"
# endif
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined before c++23"
+# endif
+
# ifdef __cpp_lib_format_ranges
# error "__cpp_lib_format_ranges should not be defined before c++23"
# endif
@@ -1352,6 +1403,10 @@
# error "__cpp_lib_gcd_lcm should not be defined before c++17"
# endif
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_generic_associative_lookup
# error "__cpp_lib_generic_associative_lookup should be defined in c++14"
# endif
@@ -1609,6 +1664,10 @@
# error "__cpp_lib_ranges_chunk_by should not be defined before c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges_contains
# error "__cpp_lib_ranges_contains should not be defined before c++23"
# endif
@@ -1657,6 +1716,10 @@
# error "__cpp_lib_reference_from_temporary should not be defined before c++23"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_remove_cvref
# error "__cpp_lib_remove_cvref should not be defined before c++20"
# endif
@@ -1974,6 +2037,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should not be defined before c++20"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should not be defined before c++20"
# endif
@@ -2143,6 +2210,10 @@
# error "__cpp_lib_constexpr_vector should not be defined before c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_copyable_function
# error "__cpp_lib_copyable_function should not be defined before c++26"
# endif
@@ -2155,6 +2226,10 @@
# error "__cpp_lib_debugging should not be defined before c++26"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_destroying_delete
# error "__cpp_lib_destroying_delete should not be defined before c++20"
# endif
@@ -2215,6 +2290,10 @@
# error "__cpp_lib_format should not be defined before c++20"
# endif
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined before c++23"
+# endif
+
# ifdef __cpp_lib_format_ranges
# error "__cpp_lib_format_ranges should not be defined before c++23"
# endif
@@ -2278,6 +2357,10 @@
# error "__cpp_lib_gcd_lcm should have the value 201606L in c++17"
# endif
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_generic_associative_lookup
# error "__cpp_lib_generic_associative_lookup should be defined in c++17"
# endif
@@ -2616,6 +2699,10 @@
# error "__cpp_lib_ranges_chunk_by should not be defined before c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges_contains
# error "__cpp_lib_ranges_contains should not be defined before c++23"
# endif
@@ -2667,6 +2754,10 @@
# error "__cpp_lib_reference_from_temporary should not be defined before c++23"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_remove_cvref
# error "__cpp_lib_remove_cvref should not be defined before c++20"
# endif
@@ -3056,6 +3147,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++20"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should be defined in c++20"
@@ -3324,6 +3419,10 @@
# error "__cpp_lib_constexpr_vector should have the value 201907L in c++20"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_copyable_function
# error "__cpp_lib_copyable_function should not be defined before c++26"
# endif
@@ -3339,6 +3438,10 @@
# error "__cpp_lib_debugging should not be defined before c++26"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L
# ifndef __cpp_lib_destroying_delete
# error "__cpp_lib_destroying_delete should be defined in c++20"
@@ -3423,6 +3526,10 @@
# endif
# endif
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined before c++23"
+# endif
+
# ifdef __cpp_lib_format_ranges
# error "__cpp_lib_format_ranges should not be defined before c++23"
# endif
@@ -3489,6 +3596,10 @@
# error "__cpp_lib_gcd_lcm should have the value 201606L in c++20"
# endif
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_generic_associative_lookup
# error "__cpp_lib_generic_associative_lookup should be defined in c++20"
# endif
@@ -3902,6 +4013,10 @@
# error "__cpp_lib_ranges_chunk_by should not be defined before c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_ranges_contains
# error "__cpp_lib_ranges_contains should not be defined before c++23"
# endif
@@ -3953,6 +4068,10 @@
# error "__cpp_lib_reference_from_temporary should not be defined before c++23"
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_remove_cvref
# error "__cpp_lib_remove_cvref should be defined in c++20"
# endif
@@ -4423,6 +4542,10 @@
# error "__cpp_lib_atomic_lock_free_type_aliases should have the value 201907L in c++23"
# endif
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined before c++26"
+# endif
+
# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should be defined in c++23"
@@ -4721,6 +4844,10 @@
# error "__cpp_lib_constexpr_vector should have the value 201907L in c++23"
# endif
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined before c++26"
+# endif
+
# ifdef __cpp_lib_copyable_function
# error "__cpp_lib_copyable_function should not be defined before c++26"
# endif
@@ -4736,6 +4863,10 @@
# error "__cpp_lib_debugging should not be defined before c++26"
# endif
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined before c++26"
+# endif
+
# if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L
# ifndef __cpp_lib_destroying_delete
# error "__cpp_lib_destroying_delete should be defined in c++23"
@@ -4823,6 +4954,19 @@
# endif
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_format_path
+# error "__cpp_lib_format_path should be defined in c++23"
+# endif
+# if __cpp_lib_format_path != 202403L
+# error "__cpp_lib_format_path should have the value 202403L in c++23"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_format_ranges
# error "__cpp_lib_format_ranges should be defined in c++23"
# endif
@@ -4904,6 +5048,10 @@
# error "__cpp_lib_gcd_lcm should have the value 201606L in c++23"
# endif
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_generic_associative_lookup
# error "__cpp_lib_generic_associative_lookup should be defined in c++23"
# endif
@@ -5374,6 +5522,10 @@
# error "__cpp_lib_ranges_chunk_by should have the value 202202L in c++23"
# endif
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_ranges_contains
# error "__cpp_lib_ranges_contains should be defined in c++23"
# endif
@@ -5482,6 +5634,10 @@
# endif
# endif
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined before c++26"
+# endif
+
# ifndef __cpp_lib_remove_cvref
# error "__cpp_lib_remove_cvref should be defined in c++23"
# endif
@@ -6013,6 +6169,19 @@
# endif
# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should be defined in c++26"
+# endif
+# if __cpp_lib_atomic_min_max != 202403L
+# error "__cpp_lib_atomic_min_max should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_atomic_min_max
+# error "__cpp_lib_atomic_min_max should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
+# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_atomic_ref
# error "__cpp_lib_atomic_ref should be defined in c++26"
# endif
@@ -6314,6 +6483,19 @@
# endif
# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should be defined in c++26"
+# endif
+# if __cpp_lib_constrained_equality != 202403L
+# error "__cpp_lib_constrained_equality should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_constrained_equality
+# error "__cpp_lib_constrained_equality should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
+# if !defined(_LIBCPP_VERSION)
# ifndef __cpp_lib_copyable_function
# error "__cpp_lib_copyable_function should be defined in c++26"
# endif
@@ -6346,6 +6528,19 @@
# endif
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should be defined in c++26"
+# endif
+# if __cpp_lib_default_template_type_for_algorithm_values != 202403L
+# error "__cpp_lib_default_template_type_for_algorithm_values should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_default_template_type_for_algorithm_values
+# error "__cpp_lib_default_template_type_for_algorithm_values should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# if TEST_STD_VER > 17 && defined(__cpp_impl_destroying_delete) && __cpp_impl_destroying_delete >= 201806L
# ifndef __cpp_lib_destroying_delete
# error "__cpp_lib_destroying_delete should be defined in c++26"
@@ -6433,6 +6628,19 @@
# endif
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_format_path
+# error "__cpp_lib_format_path should be defined in c++26"
+# endif
+# if __cpp_lib_format_path != 202403L
+# error "__cpp_lib_format_path should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_format_path
+# error "__cpp_lib_format_path should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_format_ranges
# error "__cpp_lib_format_ranges should be defined in c++26"
# endif
@@ -6604,6 +6812,19 @@
# error "__cpp_lib_gcd_lcm should have the value 201606L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should be defined in c++26"
+# endif
+# if __cpp_lib_generate_random != 202403L
+# error "__cpp_lib_generate_random should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_generate_random
+# error "__cpp_lib_generate_random should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_generic_associative_lookup
# error "__cpp_lib_generic_associative_lookup should be defined in c++26"
# endif
@@ -7092,6 +7313,19 @@
# error "__cpp_lib_ranges_chunk_by should have the value 202202L in c++26"
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should be defined in c++26"
+# endif
+# if __cpp_lib_ranges_concat != 202403L
+# error "__cpp_lib_ranges_concat should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_ranges_concat
+# error "__cpp_lib_ranges_concat should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_ranges_contains
# error "__cpp_lib_ranges_contains should be defined in c++26"
# endif
@@ -7212,6 +7446,19 @@
# endif
# endif
+# if !defined(_LIBCPP_VERSION)
+# ifndef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should be defined in c++26"
+# endif
+# if __cpp_lib_reference_wrapper != 202403L
+# error "__cpp_lib_reference_wrapper should have the value 202403L in c++26"
+# endif
+# else // _LIBCPP_VERSION
+# ifdef __cpp_lib_reference_wrapper
+# error "__cpp_lib_reference_wrapper should not be defined because it is unimplemented in libc++!"
+# endif
+# endif
+
# ifndef __cpp_lib_remove_cvref
# error "__cpp_lib_remove_cvref should be defined in c++26"
# endif
diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp
index 8637a93..16e4ea7 100644
--- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp
+++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.nm.put/facet.num.put.members/put_long_double.pass.cpp
@@ -13,15 +13,11 @@
// iter_type put(iter_type s, ios_base& iob, char_type fill, long double v) const;
// XFAIL: win32-broken-printf-g-precision
-// XFAIL: LIBCXX-PICOLIBC-FIXME
-
-// Needs more investigation, but this is probably failing on Android M (API 23)
-// and up because the printf formatting of NAN changed.
-// XFAIL: LIBCXX-ANDROID-FIXME && !android-device-api={{21|22}}
#include <locale>
#include <ios>
#include <cassert>
+#include <cstdio>
#include <streambuf>
#include <cmath>
#include "test_macros.h"
@@ -8934,11 +8930,10 @@ void test4()
char str[200];
std::locale lc = std::locale::classic();
std::locale lg(lc, new my_numpunct);
-#ifdef _AIX
- std::string inf = "INF";
-#else
- std::string inf = "inf";
-#endif
+
+ // This should match the underlying C library
+ std::snprintf(str, sizeof(str), "%f", INFINITY);
+ std::string inf = str;
const my_facet f(1);
{
@@ -10727,24 +10722,24 @@ void test5()
std::locale lc = std::locale::classic();
std::locale lg(lc, new my_numpunct);
const my_facet f(1);
-#if defined(_AIX)
- std::string nan= "NaNQ";
- std::string NaN = "NaNQ";
- std::string nan_padding25 = "*********************";
- std::string pnan_sign = "+";
- std::string pnan_padding25 = "********************";
-#else
- std::string nan= "nan";
- std::string NaN = "NAN";
- std::string nan_padding25 = "**********************";
-#if defined(TEST_HAS_GLIBC) || defined(_WIN32)
- std::string pnan_sign = "+";
- std::string pnan_padding25 = "*********************";
-#else
- std::string pnan_sign = "";
- std::string pnan_padding25 = "**********************";
-#endif
-#endif
+
+ // The output here depends on the underlying C library, so work out what
+ // that does.
+ std::snprintf(str, sizeof(str), "%f", std::nan(""));
+ std::string nan = str;
+
+ std::snprintf(str, sizeof(str), "%F", std::nan(""));
+ std::string NaN = str;
+
+ std::snprintf(str, sizeof(str), "%+f", std::nan(""));
+ std::string pnan_sign;
+ if (str[0] == '+') {
+ pnan_sign = "+";
+ }
+
+ std::string nan_padding25 = std::string(25 - nan.length(), '*');
+ std::string pnan_padding25 = std::string(25 - nan.length() - pnan_sign.length(), '*');
+
{
long double v = std::nan("");
std::ios ios(0);
diff --git a/libcxx/test/std/numerics/rand/rand.util/rand.util.seedseq/generate.mandates.verify.cpp b/libcxx/test/std/numerics/rand/rand.util/rand.util.seedseq/generate.mandates.verify.cpp
new file mode 100644
index 0000000..a8ea31b
--- /dev/null
+++ b/libcxx/test/std/numerics/rand/rand.util/rand.util.seedseq/generate.mandates.verify.cpp
@@ -0,0 +1,58 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// <random>
+
+// class seed_seq;
+
+// template<class RandomAccessIterator>
+// void generate(RandomAccessIterator begin, RandomAccessIterator end);
+
+// Check the following requirement: https://eel.is/c++draft/rand.util.seedseq#7
+//
+// Mandates: iterator_traits<RandomAccessIterator>::value_type is an unsigned integer
+// type capable of accommodating 32-bit quantities.
+
+// UNSUPPORTED: c++03
+// REQUIRES: stdlib=libc++
+
+#include <random>
+#include <climits>
+
+#include "test_macros.h"
+
+void f() {
+ std::seed_seq seq;
+
+ // Not an integral type
+ {
+ double* p = nullptr;
+ seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}}
+ // expected-error@*:* 0+ {{invalid operands to}}
+ }
+
+ // Not an unsigned type
+ {
+ long long* p = nullptr;
+ seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}}
+ }
+
+ // Not a 32-bit type
+ {
+#if UCHAR_MAX < UINT32_MAX
+ unsigned char* p = nullptr;
+ seq.generate(p, p); // expected-error-re@*:* {{static assertion failed{{.+}}: [rand.util.seedseq]/7 requires{{.+}}}}
+#endif
+ }
+
+ // Everything satisfied
+ {
+ unsigned long* p = nullptr;
+ seq.generate(p, p); // no diagnostic
+ }
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.db/leap_seconds.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.db/leap_seconds.pass.cpp
new file mode 100644
index 0000000..4fcdf6f
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.db/leap_seconds.pass.cpp
@@ -0,0 +1,75 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// Tests the loaded leap seconds match
+// https://eel.is/c++draft/time.zone.leap.overview#2
+//
+// At the moment of writing that list is the actual list.
+// If in the future more leap seconds are added, the returned list may have more
+
+#include <algorithm>
+#include <array>
+#include <cassert>
+#include <chrono>
+#include <ranges>
+
+using namespace std::literals::chrono_literals;
+
+// The list of leap seconds matching
+// https://eel.is/c++draft/time.zone.leap.overview#2
+// At the moment of writing that list is the actual list in the IANA database.
+// If in the future more leap seconds can be added.
+static const std::array leap_seconds = {
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1972y / std::chrono::January / 1}}, 10s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1972y / std::chrono::July / 1}}, 11s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1973y / std::chrono::January / 1}}, 12s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1974y / std::chrono::January / 1}}, 13s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1975y / std::chrono::January / 1}}, 14s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1976y / std::chrono::January / 1}}, 15s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1977y / std::chrono::January / 1}}, 16s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1978y / std::chrono::January / 1}}, 17s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1979y / std::chrono::January / 1}}, 18s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1980y / std::chrono::January / 1}}, 19s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1981y / std::chrono::July / 1}}, 20s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1982y / std::chrono::July / 1}}, 21s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1983y / std::chrono::July / 1}}, 22s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1985y / std::chrono::July / 1}}, 23s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1988y / std::chrono::January / 1}}, 24s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1990y / std::chrono::January / 1}}, 25s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1991y / std::chrono::January / 1}}, 26s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1992y / std::chrono::July / 1}}, 27s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1993y / std::chrono::July / 1}}, 28s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1994y / std::chrono::July / 1}}, 29s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1996y / std::chrono::January / 1}}, 30s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1997y / std::chrono::July / 1}}, 31s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{1999y / std::chrono::January / 1}}, 32s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2006y / std::chrono::January / 1}}, 33s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2009y / std::chrono::January / 1}}, 34s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2012y / std::chrono::July / 1}}, 35s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2015y / std::chrono::July / 1}}, 36s),
+ std::make_pair(std::chrono::sys_seconds{std::chrono::sys_days{2017y / std::chrono::January / 1}}, 37s)};
+
+int main(int, const char**) {
+ const std::chrono::tzdb& tzdb = std::chrono::get_tzdb();
+
+ assert(tzdb.leap_seconds.size() >= leap_seconds.size());
+ assert((std::ranges::equal(
+ leap_seconds,
+ tzdb.leap_seconds | std::ranges::views::take(leap_seconds.size()),
+ [](const auto& lhs, const auto& rhs) { return lhs.first == rhs.date() && lhs.second == rhs.value(); })));
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp
new file mode 100644
index 0000000..d85c8ba
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/current_zone.pass.cpp
@@ -0,0 +1,77 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// const time_zone* current_zone();
+
+#include <cassert>
+#include <chrono>
+#include <string_view>
+#include <stdlib.h>
+
+#include "test_macros.h"
+#include "assert_macros.h"
+#include "concat_macros.h"
+
+#ifdef _WIN32
+static void set_tz(std::string zone) {
+ // Note Windows does not have setenv, only putenv
+ // https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/putenv-s-wputenv-s?view=msvc-170
+ // Unlike POSIX it does not mention the string of putenv becomes part
+ // of the environment.
+
+ int status = _putenv_s("TZ", zone.c_str(), 1);
+ assert(status == 0);
+}
+
+#else
+static void set_tz(const std::string& zone) {
+ int status = setenv("TZ", zone.c_str(), 1);
+ assert(status == 0);
+}
+#endif
+
+static void test_zone(const std::string& zone) {
+ set_tz(zone);
+ const std::chrono::time_zone* tz = std::chrono::current_zone();
+ assert(tz);
+ assert(tz->name() == zone);
+}
+
+static void test_link(const std::string& link, std::string_view zone) {
+ set_tz(link);
+ const std::chrono::time_zone* tz = std::chrono::current_zone();
+ assert(tz);
+ assert(tz->name() == zone);
+}
+
+int main(int, const char**) {
+ const std::chrono::time_zone* tz = std::chrono::current_zone();
+ // Returns a valid time zone, the value depends on the OS settings.
+ assert(tz);
+ // setting the environment to an invalid value returns the value of
+ // the OS setting.
+ set_tz("This is not a time zone");
+ assert(tz == std::chrono::current_zone());
+
+ const std::chrono::tzdb& db = std::chrono::get_tzdb();
+ for (const auto& zone : db.zones)
+ test_zone(std::string{zone.name()});
+
+ for (const auto& link : db.links)
+ test_link(std::string{link.name()}, link.target());
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp
index b6204c6..470a722 100644
--- a/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp
+++ b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/get_tzdb.pass.cpp
@@ -35,5 +35,8 @@ int main(int, const char**) {
assert(std::ranges::is_sorted(db.links));
assert(std::ranges::adjacent_find(db.links) == db.links.end()); // is unique?
+ assert(!db.leap_seconds.empty());
+ assert(std::ranges::is_sorted(db.leap_seconds));
+
return 0;
}
diff --git a/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/locate_zone.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/locate_zone.pass.cpp
new file mode 100644
index 0000000..c3142a8
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.access/locate_zone.pass.cpp
@@ -0,0 +1,62 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// const time_zone* locate_zone(string_view tz_name);
+
+#include <cassert>
+#include <chrono>
+#include <string_view>
+
+#include "test_macros.h"
+#include "assert_macros.h"
+#include "concat_macros.h"
+
+static void test_zone(std::string_view zone) {
+ const std::chrono::time_zone* tz = std::chrono::locate_zone(zone);
+ assert(tz);
+ assert(tz->name() == zone);
+}
+
+static void test_link(std::string_view link, std::string_view zone) {
+ const std::chrono::time_zone* tz = std::chrono::locate_zone(link);
+ assert(tz);
+ assert(tz->name() == zone);
+}
+
+static void test_exception([[maybe_unused]] std::string_view zone) {
+ TEST_VALIDATE_EXCEPTION(
+ std::runtime_error,
+ [&]([[maybe_unused]] const std::runtime_error& e) {
+ std::string_view what{"tzdb: requested time zone not found"};
+ TEST_LIBCPP_REQUIRE(
+ e.what() == what,
+ TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n'));
+ },
+ TEST_IGNORE_NODISCARD std::chrono::locate_zone(zone));
+}
+
+int main(int, const char**) {
+ const std::chrono::tzdb& db = std::chrono::get_tzdb();
+ for (const auto& zone : db.zones)
+ test_zone(zone.name());
+
+ for (const auto& link : db.links)
+ test_link(link.name(), link.target());
+
+ test_exception("This is not a time zone");
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp
new file mode 100644
index 0000000..7b4218c
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/current_zone.pass.cpp
@@ -0,0 +1,79 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// struct tzdb
+
+// const time_zone* current_zone() const;
+
+#include <cassert>
+#include <chrono>
+#include <string_view>
+#include <stdlib.h>
+
+#include "test_macros.h"
+#include "assert_macros.h"
+#include "concat_macros.h"
+
+#ifdef _WIN32
+static void set_tz(std::string zone) {
+ // Note Windows does not have setenv, only putenv
+ // https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/putenv-s-wputenv-s?view=msvc-170
+ // Unlike POSIX it does not mention the string of putenv becomes part
+ // of the environment.
+
+ int status = _putenv_s("TZ", zone.c_str(), 1);
+ assert(status == 0);
+}
+
+#else
+static void set_tz(const std::string& zone) {
+ int status = setenv("TZ", zone.c_str(), 1);
+ assert(status == 0);
+}
+#endif
+
+static void test_zone(const std::string& zone) {
+ set_tz(zone);
+ const std::chrono::time_zone* tz = std::chrono::get_tzdb().current_zone();
+ assert(tz);
+ assert(tz->name() == zone);
+}
+
+static void test_link(const std::string& link, std::string_view zone) {
+ set_tz(link);
+ const std::chrono::time_zone* tz = std::chrono::get_tzdb().current_zone();
+ assert(tz);
+ assert(tz->name() == zone);
+}
+
+int main(int, const char**) {
+ const std::chrono::time_zone* tz = std::chrono::get_tzdb().current_zone();
+ // Returns a valid time zone, the value depends on the OS settings.
+ assert(tz);
+ // setting the environment to an invalid value returns the value of
+ // the OS setting.
+ set_tz("This is not a time zone");
+ assert(tz == std::chrono::get_tzdb().current_zone());
+
+ const std::chrono::tzdb& db = std::chrono::get_tzdb();
+ for (const auto& zone : db.zones)
+ test_zone(std::string{zone.name()});
+
+ for (const auto& link : db.links)
+ test_link(std::string{link.name()}, link.target());
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp
new file mode 100644
index 0000000..12987f6
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/locate_zone.pass.cpp
@@ -0,0 +1,64 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// struct tzdb
+
+// const time_zone* locate_zone(string_view tz_name) const;
+
+#include <cassert>
+#include <chrono>
+#include <string_view>
+
+#include "test_macros.h"
+#include "assert_macros.h"
+#include "concat_macros.h"
+
+static void test_zone(std::string_view zone) {
+ const std::chrono::time_zone* tz = std::chrono::get_tzdb().locate_zone(zone);
+ assert(tz);
+ assert(tz->name() == zone);
+}
+
+static void test_link(std::string_view link, std::string_view zone) {
+ const std::chrono::time_zone* tz = std::chrono::get_tzdb().locate_zone(link);
+ assert(tz);
+ assert(tz->name() == zone);
+}
+
+static void test_exception([[maybe_unused]] std::string_view zone) {
+ TEST_VALIDATE_EXCEPTION(
+ std::runtime_error,
+ [&]([[maybe_unused]] const std::runtime_error& e) {
+ std::string_view what{"tzdb: requested time zone not found"};
+ TEST_LIBCPP_REQUIRE(
+ e.what() == what,
+ TEST_WRITE_CONCATENATED("\nExpected exception ", what, "\nActual exception ", e.what(), '\n'));
+ },
+ TEST_IGNORE_NODISCARD std::chrono::get_tzdb().locate_zone(zone));
+}
+
+int main(int, const char**) {
+ const std::chrono::tzdb& db = std::chrono::get_tzdb();
+ for (const auto& zone : db.zones)
+ test_zone(zone.name());
+
+ for (const auto& link : db.links)
+ test_link(link.name(), link.target());
+
+ test_exception("This is not a time zone");
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp
index 51c6d36..af95274 100644
--- a/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp
+++ b/libcxx/test/std/time/time.zone/time.zone.db/time.zone.db.tzdb/tzdb.members.pass.cpp
@@ -37,11 +37,9 @@ int main(int, const char**) {
tzdb.version = "version";
assert(tzdb.version == "version");
- [[maybe_unused]] std::vector<std::chrono::time_zone>& zones = tzdb.zones;
-
+ [[maybe_unused]] std::vector<std::chrono::time_zone>& zones = tzdb.zones;
[[maybe_unused]] std::vector<std::chrono::time_zone_link>& links = tzdb.links;
-
- // TODO TZDB add the leap data member
+ [[maybe_unused]] std::vector<std::chrono::leap_second>& leap_seconds = tzdb.leap_seconds;
return 0;
}
diff --git a/libcxx/test/std/time/time.zone/time.zone.leap/assign.copy.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.leap/assign.copy.pass.cpp
new file mode 100644
index 0000000..4d91e73
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.leap/assign.copy.pass.cpp
@@ -0,0 +1,71 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// class leap_second
+// {
+// leap_second& operator=(const leap_second&) = default;
+//
+// ...
+// };
+
+#include <chrono>
+#include <concepts>
+#include <memory>
+#include <type_traits>
+#include <cassert>
+
+// Add the include path required by test_chrono_leap_second.h when using libc++.
+// ADDITIONAL_COMPILE_FLAGS(stdlib=libc++): -I %{libcxx-dir}/src/include
+#include "test_chrono_leap_second.h"
+
+constexpr bool test() {
+ std::chrono::leap_second a =
+ test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1});
+ std::chrono::leap_second b =
+ test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{10}}, std::chrono::seconds{15});
+
+ // operator== only compares the date member.
+ assert(a.date() != b.date());
+ assert(a.value() != b.value());
+
+ {
+ std::same_as<std::chrono::leap_second&> decltype(auto) result(b = a);
+ assert(std::addressof(result) == std::addressof(b));
+
+ assert(a.date() == b.date());
+ assert(a.value() == b.value());
+ }
+
+ {
+ // Tests an rvalue uses the copy assignment.
+ std::same_as<std::chrono::leap_second&> decltype(auto) result(b = std::move(a));
+ assert(std::addressof(result) == std::addressof(b));
+
+ assert(a.date() == b.date());
+ assert(a.value() == b.value());
+ }
+
+ return true;
+}
+
+int main(int, const char**) {
+ static_assert(std::is_copy_assignable_v<std::chrono::leap_second>);
+
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.leap/cons.copy.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.leap/cons.copy.pass.cpp
new file mode 100644
index 0000000..e2419b7
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.leap/cons.copy.pass.cpp
@@ -0,0 +1,69 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// class leap_second
+// {
+// leap_second(const leap_second&) = default;
+//
+// ...
+// };
+
+#include <chrono>
+#include <concepts>
+#include <cassert>
+
+// Add the include path required by test_chrono_leap_second.h when using libc++.
+// ADDITIONAL_COMPILE_FLAGS(stdlib=libc++): -I %{libcxx-dir}/src/include
+#include "test_chrono_leap_second.h"
+
+constexpr bool test() {
+ std::chrono::leap_second a =
+ test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1});
+
+ {
+ std::chrono::leap_second b = a;
+
+ // operator== only compares the date member.
+ assert(a.date() == b.date());
+ assert(a.value() == b.value());
+ }
+
+#ifdef _LIBCPP_VERSION
+ {
+ // Tests an rvalue uses the copy constructor.
+ // Since implementations are allowed to add additional constructors this is
+ // a libc++ specific test.
+ std::chrono::leap_second b = std::move(a);
+
+ // operator== only compares the date member.
+ assert(a.date() == b.date());
+ assert(a.value() == b.value());
+ }
+ // libc++ does not provide a default constructor.
+ static_assert(!std::is_default_constructible_v<std::chrono::leap_second>);
+#endif // _LIBCPP_VERSION
+
+ return true;
+}
+
+int main(int, const char**) {
+ static_assert(std::copy_constructible<std::chrono::leap_second>);
+
+ test();
+ static_assert(test());
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.leap/members/date.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.leap/members/date.pass.cpp
new file mode 100644
index 0000000..23f95ec
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.leap/members/date.pass.cpp
@@ -0,0 +1,53 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// class leap_second;
+
+// constexpr sys_seconds date() const noexcept;
+
+#include <cassert>
+#include <chrono>
+
+#include "test_macros.h"
+
+// Add the include path required by test_chrono_leap_second.h when using libc++.
+// ADDITIONAL_COMPILE_FLAGS(stdlib=libc++): -I %{libcxx-dir}/src/include
+#include "test_chrono_leap_second.h"
+
+constexpr void test(const std::chrono::leap_second leap_second, std::chrono::sys_seconds expected) {
+ std::same_as<std::chrono::sys_seconds> auto date = leap_second.date();
+ assert(date == expected);
+ static_assert(noexcept(leap_second.date()));
+}
+
+constexpr bool test() {
+ test(test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}),
+ std::chrono::sys_seconds{std::chrono::seconds{0}});
+
+ return true;
+}
+
+int main(int, const char**) {
+ test();
+ static_assert(test());
+
+ // test with the real tzdb
+ const std::chrono::tzdb& tzdb = std::chrono::get_tzdb();
+ assert(!tzdb.leap_seconds.empty());
+ test(tzdb.leap_seconds[0], tzdb.leap_seconds[0].date());
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.leap/members/value.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.leap/members/value.pass.cpp
new file mode 100644
index 0000000..844c74d
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.leap/members/value.pass.cpp
@@ -0,0 +1,53 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// class leap_second;
+
+// constexpr seconds value() const noexcept;
+
+#include <cassert>
+#include <chrono>
+
+#include "test_macros.h"
+
+// Add the include path required by test_chrono_leap_second.h when using libc++.
+// ADDITIONAL_COMPILE_FLAGS(stdlib=libc++): -I %{libcxx-dir}/src/include
+#include "test_chrono_leap_second.h"
+
+constexpr void test(const std::chrono::leap_second leap_second, std::chrono::seconds expected) {
+ std::same_as<std::chrono::seconds> auto value = leap_second.value();
+ assert(value == expected);
+ static_assert(noexcept(leap_second.value()));
+}
+
+constexpr bool test() {
+ test(test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}),
+ std::chrono::seconds{1});
+
+ return true;
+}
+
+int main(int, const char**) {
+ test();
+ static_assert(test());
+
+ // test with the real tzdb
+ const std::chrono::tzdb& tzdb = std::chrono::get_tzdb();
+ assert(!tzdb.leap_seconds.empty());
+ test(tzdb.leap_seconds[0], tzdb.leap_seconds[0].value());
+
+ return 0;
+}
diff --git a/libcxx/test/std/time/time.zone/time.zone.leap/nonmembers/comparison.pass.cpp b/libcxx/test/std/time/time.zone/time.zone.leap/nonmembers/comparison.pass.cpp
new file mode 100644
index 0000000..ac8b780
--- /dev/null
+++ b/libcxx/test/std/time/time.zone/time.zone.leap/nonmembers/comparison.pass.cpp
@@ -0,0 +1,85 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
+
+// TODO TZDB test whether this can be enabled with gcc 14.
+// UNSUPPORTED: gcc-13
+
+// XFAIL: libcpp-has-no-incomplete-tzdb
+// XFAIL: availability-tzdb-missing
+
+// <chrono>
+
+// class leap_second;
+
+//constexpr bool operator==(const leap_second& x, const leap_second& y); // C++20
+//constexpr strong_ordering operator<=>(const leap_second& x, const leap_second& y);
+//
+//template<class Duration>
+// constexpr bool operator==(const leap_second& x, const sys_time<Duration>& y);
+//template<class Duration>
+// constexpr bool operator< (const leap_second& x, const sys_time<Duration>& y);
+//template<class Duration>
+// constexpr bool operator< (const sys_time<Duration>& x, const leap_second& y);
+//template<class Duration>
+// constexpr bool operator> (const leap_second& x, const sys_time<Duration>& y);
+//template<class Duration>
+// constexpr bool operator> (const sys_time<Duration>& x, const leap_second& y);
+//template<class Duration>
+// constexpr bool operator<=(const leap_second& x, const sys_time<Duration>& y);
+//template<class Duration>
+// constexpr bool operator<=(const sys_time<Duration>& x, const leap_second& y);
+//template<class Duration>
+// constexpr bool operator>=(const leap_second& x, const sys_time<Duration>& y);
+//template<class Duration>
+// constexpr bool operator>=(const sys_time<Duration>& x, const leap_second& y);
+//template<class Duration>
+// requires three_way_comparable_with<sys_seconds, sys_time<Duration>>
+// constexpr auto operator<=>(const leap_second& x, const sys_time<Duration>& y);
+
+#include <cassert>
+#include <chrono>
+
+#include "test_macros.h"
+#include "test_comparisons.h"
+
+// Add the include path required by test_chrono_leap_second.h when using libc++.
+// ADDITIONAL_COMPILE_FLAGS(stdlib=libc++): -I %{libcxx-dir}/src/include
+#include "test_chrono_leap_second.h"
+
+constexpr void test_comparison(const std::chrono::leap_second lhs, const std::chrono::leap_second rhs) {
+ AssertOrderReturn<std::strong_ordering, std::chrono::leap_second>();
+ assert(testOrder(lhs, rhs, std::strong_ordering::less));
+
+ AssertOrderReturn<std::strong_ordering, std::chrono::leap_second, std::chrono::sys_seconds>();
+ assert(testOrder(lhs, rhs.date(), std::strong_ordering::less));
+
+ AssertOrderReturn<std::strong_ordering, std::chrono::sys_seconds, std::chrono::leap_second>();
+ assert(testOrder(lhs.date(), rhs, std::strong_ordering::less));
+}
+
+constexpr bool test() {
+ test_comparison(test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}),
+ test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{1}}, std::chrono::seconds{2}));
+
+ return true;
+}
+
+int main(int, const char**) {
+ test();
+ static_assert(test());
+
+ // test with the real tzdb
+ const std::chrono::tzdb& tzdb = std::chrono::get_tzdb();
+ assert(tzdb.leap_seconds.size() > 2);
+ test_comparison(tzdb.leap_seconds[0], tzdb.leap_seconds[1]);
+
+ return 0;
+}
diff --git a/libcxx/test/support/test_chrono_leap_second.h b/libcxx/test/support/test_chrono_leap_second.h
new file mode 100644
index 0000000..485f68d91
--- /dev/null
+++ b/libcxx/test/support/test_chrono_leap_second.h
@@ -0,0 +1,52 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef SUPPORT_TEST_CHRONO_LEAP_SECOND_HPP
+#define SUPPORT_TEST_CHRONO_LEAP_SECOND_HPP
+
+// Contains helper functions to create a std::chrono::leap_second.
+//
+// Since the standard doesn't specify how a @ref std::chrono::leap_second is
+// constructed this is implementation defined. To make the public API tests of
+// the class generic this header defines helper functions to create the
+// required object.
+//
+// Note This requires every standard library implementation to write their own
+// helper function. Vendors are encouraged to create a pull request at
+// https://github.com/llvm/llvm-project so their specific implementation can be
+// part of this file.
+
+#include "test_macros.h"
+
+#if TEST_STD_VER < 20
+# error "The format header requires at least C++20"
+#endif
+
+#include <chrono>
+
+#ifdef _LIBCPP_VERSION
+
+// In order to find this include the calling test needs to provide this path in
+// the search path. Typically this looks like:
+// ADDITIONAL_COMPILE_FLAGS(stdlib=libc++): -I %{libcxx-dir}/src/include
+// where the number of `../` sequences depends on the subdirectory level of the
+// test.
+# include "tzdb/leap_second_private.h" // Header in the dylib
+
+inline constexpr std::chrono::leap_second
+test_leap_second_create(const std::chrono::sys_seconds& date, const std::chrono::seconds& value) {
+ return std::chrono::leap_second{std::chrono::leap_second::__constructor_tag{}, date, value};
+}
+
+#else // _LIBCPP_VERSION
+# error \
+ "Please create a vendor specific version of the test typedef and file a PR at https://github.com/llvm/llvm-project"
+#endif // _LIBCPP_VERSION
+
+#endif // SUPPORT_TEST_CHRONO_LEAP_SECOND_HPP
diff --git a/libcxx/test/support/test_iterators.h b/libcxx/test/support/test_iterators.h
index c92ce37..7ffb749 100644
--- a/libcxx/test/support/test_iterators.h
+++ b/libcxx/test/support/test_iterators.h
@@ -725,11 +725,14 @@ struct common_input_iterator {
# endif // TEST_STD_VER >= 20
// Iterator adaptor that counts the number of times the iterator has had a successor/predecessor
-// operation called. Has two recorders:
+// operation or an equality comparison operation called. Has three recorders:
// * `stride_count`, which records the total number of calls to an op++, op--, op+=, or op-=.
// * `stride_displacement`, which records the displacement of the calls. This means that both
// op++/op+= will increase the displacement counter by 1, and op--/op-= will decrease the
// displacement counter by 1.
+// * `equals_count`, which records the total number of calls to an op== or op!=. If compared
+// against a sentinel object, that sentinel object must call the `record_equality_comparison`
+// function so that the comparison is counted correctly.
template <class It>
class stride_counting_iterator {
public:
@@ -754,6 +757,8 @@ public:
constexpr difference_type stride_displacement() const { return stride_displacement_; }
+ constexpr difference_type equals_count() const { return equals_count_; }
+
constexpr decltype(auto) operator*() const { return *It(base_); }
constexpr decltype(auto) operator[](difference_type n) const { return It(base_)[n]; }
@@ -838,10 +843,13 @@ public:
return base(x) - base(y);
}
+ constexpr void record_equality_comparison() const { ++equals_count_; }
+
constexpr bool operator==(stride_counting_iterator const& other) const
requires std::sentinel_for<It, It>
{
- return It(base_) == It(other.base_);
+ record_equality_comparison();
+ return It(base_) == It(other.base_);
}
friend constexpr bool operator<(stride_counting_iterator const& x, stride_counting_iterator const& y)
@@ -875,6 +883,7 @@ private:
decltype(base(std::declval<It>())) base_;
difference_type stride_count_ = 0;
difference_type stride_displacement_ = 0;
+ mutable difference_type equals_count_ = 0;
};
template <class It>
stride_counting_iterator(It) -> stride_counting_iterator<It>;
@@ -887,7 +896,14 @@ class sentinel_wrapper {
public:
explicit sentinel_wrapper() = default;
constexpr explicit sentinel_wrapper(const It& it) : base_(base(it)) {}
- constexpr bool operator==(const It& other) const { return base_ == base(other); }
+ constexpr bool operator==(const It& other) const {
+ // If supported, record statistics about the equality operator call
+ // inside `other`.
+ if constexpr (requires { other.record_equality_comparison(); }) {
+ other.record_equality_comparison();
+ }
+ return base_ == base(other);
+ }
friend constexpr It base(const sentinel_wrapper& s) { return It(s.base_); }
private:
decltype(base(std::declval<It>())) base_;