From 1e5e8484eac3ebf9057ebd59ac42c73d1937cd22 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 9 Jan 2026 08:51:44 -0800 Subject: [PATCH 01/13] Update llvm-project. --- llvm-project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm-project b/llvm-project index 27651133e21..5d501d1a8d2 160000 --- a/llvm-project +++ b/llvm-project @@ -1 +1 @@ -Subproject commit 27651133e213a6a1eb4d0e47837625cee3613111 +Subproject commit 5d501d1a8d287b9c410aa46ffb5534859e518a8a From 9e69a382f426f3927a8fd4cc6492d48eb51a712d Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 9 Jan 2026 09:16:36 -0800 Subject: [PATCH 02/13] LLVM-99420 implemented P2404R3. --- tests/libcxx/expected_results.txt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index 2eb83e0cf0a..30445fbf163 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -111,16 +111,6 @@ std/ranges/range.access/end.pass.cpp FAIL std/ranges/range.access/rbegin.pass.cpp FAIL std/ranges/range.access/rend.pass.cpp FAIL -# libc++ has not implemented P2404R3: "Move-Only Types For Comparison Concepts" -std/algorithms/alg.sorting/alg.sort/partial.sort.copy/ranges_partial_sort_copy.pass.cpp FAIL -std/language.support/support.limits/support.limits.general/concepts.version.compile.pass.cpp FAIL -std/utilities/function.objects/range.cmp/equal_to.pass.cpp FAIL -std/utilities/function.objects/range.cmp/greater.pass.cpp FAIL -std/utilities/function.objects/range.cmp/greater_equal.pass.cpp FAIL -std/utilities/function.objects/range.cmp/less.pass.cpp FAIL -std/utilities/function.objects/range.cmp/less_equal.pass.cpp FAIL -std/utilities/function.objects/range.cmp/not_equal_to.pass.cpp FAIL - # libc++ has not implemented P2407R5: "Freestanding Library: Partial Classes" std/language.support/support.limits/support.limits.general/array.version.compile.pass.cpp FAIL std/language.support/support.limits/support.limits.general/optional.version.compile.pass.cpp FAIL From cc71b8621294c6ca26f7880d0cf8118efe7efc46 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 9 Jan 2026 09:18:48 -0800 Subject: [PATCH 03/13] Mark new flat_meow tests as FAIL in main. --- tests/libcxx/expected_results.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index 30445fbf163..448e62159ef 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -299,12 +299,14 @@ std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_iter_iter.p std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_iter_rv.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_or_assign_transparent.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_or_assign.pass.cpp FAIL +std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_range_sorted_unique.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_range.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_rv.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_sorted_initializer_list.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_sorted_iter_iter.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/insert_transparent.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/replace.pass.cpp FAIL +std/containers/container.adaptors/flat.map/flat.map.modifiers/swap_exception.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/swap_free.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/swap_member.pass.cpp FAIL std/containers/container.adaptors/flat.map/flat.map.modifiers/try_emplace_transparent.pass.cpp FAIL @@ -325,6 +327,7 @@ std/containers/container.adaptors/flat.map/flat.map.operations/upper_bound_trans std/containers/container.adaptors/flat.map/flat.map.operations/upper_bound.pass.cpp FAIL std/containers/container.adaptors/flat.map/incomplete_type.pass.cpp FAIL std/containers/container.adaptors/flat.map/op_compare.pass.cpp FAIL +std/containers/container.adaptors/flat.map/robust_against_nonbool.compile.pass.cpp FAIL std/containers/container.adaptors/flat.map/types.compile.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.capacity/empty.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.capacity/max_size.pass.cpp FAIL @@ -377,12 +380,14 @@ std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_i std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_iter_cv.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_iter_iter.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_iter_rv.pass.cpp FAIL +std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_range_sorted_equivalent.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_range.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_rv.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_sorted_initializer_list.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_sorted_iter_iter.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/insert_transparent.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/replace.pass.cpp FAIL +std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/swap_exception.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/swap_free.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.modifiers/swap_member.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/flat.multimap.observers/comp.pass.cpp FAIL @@ -401,6 +406,7 @@ std/containers/container.adaptors/flat.multimap/flat.multimap.operations/upper_b std/containers/container.adaptors/flat.multimap/flat.multimap.operations/upper_bound.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/incomplete_type.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/op_compare.pass.cpp FAIL +std/containers/container.adaptors/flat.multimap/robust_against_nonbool.compile.pass.cpp FAIL std/containers/container.adaptors/flat.multimap/types.compile.pass.cpp FAIL std/language.support/support.limits/support.limits.general/flat_map.version.compile.pass.cpp FAIL std/utilities/format/format.formattable/concept.formattable.compile.pass.cpp FAIL @@ -470,11 +476,13 @@ std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_i std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_iter_cv.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_iter_iter.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_iter_rv.pass.cpp FAIL +std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_range_sorted_equivalent.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_range.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_rv.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_sorted_initializer_list.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/insert_sorted_iter_iter.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/replace.pass.cpp FAIL +std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/swap_exception.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/swap_free.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.modifiers/swap_member.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/flat.multiset.observers/comp.pass.cpp FAIL @@ -492,6 +500,7 @@ std/containers/container.adaptors/flat.multiset/flat.multiset.operations/upper_b std/containers/container.adaptors/flat.multiset/flat.multiset.operations/upper_bound.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/incomplete_type.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/op_compare.pass.cpp FAIL +std/containers/container.adaptors/flat.multiset/robust_against_nonbool.compile.pass.cpp FAIL std/containers/container.adaptors/flat.multiset/types.compile.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.capacity/empty.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.capacity/max_size.pass.cpp FAIL @@ -538,12 +547,14 @@ std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_initializer std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_iter_cv.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_iter_iter.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_iter_rv.pass.cpp FAIL +std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_range_sorted_unique.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_range.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_rv.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_sorted_initializer_list.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_sorted_iter_iter.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/insert_transparent.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/replace.pass.cpp FAIL +std/containers/container.adaptors/flat.set/flat.set.modifiers/swap_exception.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/swap_free.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.modifiers/swap_member.pass.cpp FAIL std/containers/container.adaptors/flat.set/flat.set.observers/comp.pass.cpp FAIL @@ -561,6 +572,7 @@ std/containers/container.adaptors/flat.set/flat.set.operations/upper_bound_trans std/containers/container.adaptors/flat.set/flat.set.operations/upper_bound.pass.cpp FAIL std/containers/container.adaptors/flat.set/incomplete_type.pass.cpp FAIL std/containers/container.adaptors/flat.set/op_compare.pass.cpp FAIL +std/containers/container.adaptors/flat.set/robust_against_nonbool.compile.pass.cpp FAIL std/containers/container.adaptors/flat.set/types.compile.pass.cpp FAIL std/language.support/support.limits/support.limits.general/flat_set.version.compile.pass.cpp FAIL From 854629196c7d2d3985afa04b41e2c81433c0e534 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 9 Jan 2026 09:27:53 -0800 Subject: [PATCH 04/13] More "unevaluable pointer value" constexpr errors. --- tests/libcxx/expected_results.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index 448e62159ef..28688459e43 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -727,6 +727,10 @@ std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.ctor/pointer_delet std/utilities/smartptr/unique.ptr/unique.ptr.class/unique.ptr.ctor/pointer_deleter.pass.cpp:1 FAIL # VSO-2574473 constexpr error in ranges::join_with_view: failure was caused by unevaluable pointer value +std/ranges/range.adaptors/range.adjacent.transform/general.pass.cpp:0 FAIL +std/ranges/range.adaptors/range.adjacent.transform/general.pass.cpp:1 FAIL +std/ranges/range.adaptors/range.adjacent/general.pass.cpp:0 FAIL +std/ranges/range.adaptors/range.adjacent/general.pass.cpp:1 FAIL std/ranges/range.adaptors/range.join.with/range.join.with.iterator/ctor.not_const.pass.cpp:0 FAIL std/ranges/range.adaptors/range.join.with/range.join.with.iterator/ctor.not_const.pass.cpp:1 FAIL From 8bc9cb1aebdb5b17c4a3cb4936b6961d4d1ef07e Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 9 Jan 2026 09:29:10 -0800 Subject: [PATCH 05/13] More `-Wself-move` warnings. --- tests/libcxx/expected_results.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index 28688459e43..d30216139cd 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -985,6 +985,8 @@ std/re/re.regex/re.regex.swap/swap.pass.cpp FAIL # Test emits a Clang -Wself-move warning, so it should avoid the self-move or suppress the warning. std/containers/sequences/vector/addressof.compile.pass.cpp:2 FAIL +std/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_assign.pass.cpp:2 FAIL +std/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_assign.pass.cpp:2 FAIL # throwing_allocator appears to be totally non-Standard. std/containers/sequences/vector.bool/ctor_exceptions.pass.cpp FAIL From 6329c0bcf587c43f15e7318207c54c2d18eb72fc Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 9 Jan 2026 09:30:46 -0800 Subject: [PATCH 06/13] Mark static_asserts as FAIL, not yet analyzed. --- tests/libcxx/expected_results.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index d30216139cd..90e20015c65 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -1525,6 +1525,16 @@ std/algorithms/alg.modifying.operations/alg.copy/copy.pass.cpp:1 FAIL std/input.output/file.streams/fstreams/filebuf.virtuals/xsputn.pass.cpp:0 FAIL std/input.output/file.streams/fstreams/filebuf.virtuals/xsputn.pass.cpp:1 FAIL +# Not analyzed. MSVC emits error C2338: static assertion failed: 'SentinelHasMinus' +std/ranges/range.adaptors/range.adjacent.transform/sentinel/minus.pass.cpp:0 FAIL +std/ranges/range.adaptors/range.adjacent.transform/sentinel/minus.pass.cpp:1 FAIL + +# Not analyzed. Clang emits error: static assertion failed due to requirement 'check_equality_comparable_with()' +std/concepts/concepts.compare/concept.equalitycomparable/equality_comparable_with.compile.pass.cpp:2 FAIL + +# Not analyzed. Clang emits error: static assertion failed due to requirement 'check_three_way_comparable_with()' +std/language.support/cmp/cmp.concept/three_way_comparable_with.compile.pass.cpp:2 FAIL + # *** XFAILS WHICH PASS *** # These tests contain `// XFAIL: msvc` comments, which accurately describe runtime failures for x86 and x64. From b70efc3c0553be452cdc05531bee17435440044b Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Fri, 9 Jan 2026 09:51:27 -0800 Subject: [PATCH 07/13] constexpr step limits. --- tests/libcxx/expected_results.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index 90e20015c65..e98c8b593cf 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -1227,6 +1227,7 @@ std/algorithms/alg.modifying.operations/alg.swap/ranges.swap_ranges.pass.cpp FAI std/algorithms/alg.nonmodifying/alg.contains/ranges.contains_subrange.pass.cpp:2 FAIL std/algorithms/alg.nonmodifying/alg.count/count.pass.cpp FAIL std/algorithms/alg.nonmodifying/alg.count/ranges.count.pass.cpp FAIL +std/algorithms/alg.sorting/alg.sort/partial.sort.copy/ranges_partial_sort_copy.pass.cpp:2 FAIL std/containers/sequences/vector.bool/append_range.pass.cpp FAIL std/containers/sequences/vector.bool/assign_range.pass.cpp FAIL std/containers/sequences/vector.bool/flip.pass.cpp FAIL From f13839e504c7a907423b22e90790a336f50d0b18 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 11 Jan 2026 14:18:53 -0800 Subject: [PATCH 08/13] Properly categorize failures related to LLVM-171438. --- tests/libcxx/expected_results.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index e98c8b593cf..73ac41361f2 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -61,6 +61,12 @@ std/language.support/support.exception/except.nested/ctor_default.pass.cpp:2 SKI # SKIPPED because this is ARM64EC-specific. std/language.support/support.coroutines/coroutine.handle/coroutine.handle.noop/noop_coroutine.pass.cpp:2 SKIPPED +# LLVM-171438: [Clang] __builtin_common_type is overly permissive +# These tests are improperly working around this Clang bug by detecting Clang and asserting buggy results, +# but only libc++ with Clang is affected; MSVC's STL with Clang is unaffected. +std/concepts/concepts.compare/concept.equalitycomparable/equality_comparable_with.compile.pass.cpp:2 FAIL +std/language.support/cmp/cmp.concept/three_way_comparable_with.compile.pass.cpp:2 FAIL + # Non-Standard regex behavior. # "It seems likely that the test is still non-conforming due to how libc++ handles the 'w' character class." std/re/re.traits/lookup_classname.pass.cpp FAIL @@ -1530,12 +1536,6 @@ std/input.output/file.streams/fstreams/filebuf.virtuals/xsputn.pass.cpp:1 FAIL std/ranges/range.adaptors/range.adjacent.transform/sentinel/minus.pass.cpp:0 FAIL std/ranges/range.adaptors/range.adjacent.transform/sentinel/minus.pass.cpp:1 FAIL -# Not analyzed. Clang emits error: static assertion failed due to requirement 'check_equality_comparable_with()' -std/concepts/concepts.compare/concept.equalitycomparable/equality_comparable_with.compile.pass.cpp:2 FAIL - -# Not analyzed. Clang emits error: static assertion failed due to requirement 'check_three_way_comparable_with()' -std/language.support/cmp/cmp.concept/three_way_comparable_with.compile.pass.cpp:2 FAIL - # *** XFAILS WHICH PASS *** # These tests contain `// XFAIL: msvc` comments, which accurately describe runtime failures for x86 and x64. From efc3b05c7416975fe548010565439125b843ce35 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 12 Jan 2026 08:15:16 -0800 Subject: [PATCH 09/13] Perma-workaround DevCom-11026685 by extracting an alias template. --- stl/inc/ranges | 17 +++++++++-------- tests/libcxx/expected_results.txt | 4 ---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/stl/inc/ranges b/stl/inc/ranges index 81e7faf436d..491e0a7a90c 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -8600,10 +8600,13 @@ namespace ranges { return _It._Inner == _Inner; } + template + using _Inner_view_diff = range_difference_t<_Maybe_const<_OtherConst, _Inner_view>>; + template requires sized_sentinel_for<_Inner_sentinel<_Const>, _Inner_iterator<_OtherConst>> - _NODISCARD constexpr range_difference_t<_Maybe_const<_OtherConst, _Inner_view>> _Distance_from( - const _Iterator<_OtherConst>& _It) const noexcept(noexcept(_Inner - _It._Inner)) { + _NODISCARD constexpr _Inner_view_diff<_OtherConst> _Distance_from(const _Iterator<_OtherConst>& _It) const + noexcept(noexcept(_Inner - _It._Inner)) { return _Inner - _It._Inner; } @@ -8623,17 +8626,15 @@ namespace ranges { template requires sized_sentinel_for<_Inner_sentinel<_Const>, _Inner_iterator<_OtherConst>> - _NODISCARD friend constexpr range_difference_t<_Maybe_const<_OtherConst, _Inner_view>> operator-( - const _Iterator<_OtherConst>& _It, const _Sentinel& _Se) noexcept( // - noexcept(_Se._Distance_from(_It))) /* strengthened */ { + _NODISCARD friend constexpr _Inner_view_diff<_OtherConst> operator-(const _Iterator<_OtherConst>& _It, + const _Sentinel& _Se) noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { return -_Se._Distance_from(_It); } template requires sized_sentinel_for<_Inner_sentinel<_Const>, _Inner_iterator<_OtherConst>> - _NODISCARD friend constexpr range_difference_t<_Maybe_const<_OtherConst, _Inner_view>> operator-( - const _Sentinel& _Se, const _Iterator<_OtherConst>& _It) noexcept( // - noexcept(_Se._Distance_from(_It))) /* strengthened */ { + _NODISCARD friend constexpr _Inner_view_diff<_OtherConst> operator-(const _Sentinel& _Se, + const _Iterator<_OtherConst>& _It) noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { return _Se._Distance_from(_It); } }; diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index 73ac41361f2..a4fa8ff69ca 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -1532,10 +1532,6 @@ std/algorithms/alg.modifying.operations/alg.copy/copy.pass.cpp:1 FAIL std/input.output/file.streams/fstreams/filebuf.virtuals/xsputn.pass.cpp:0 FAIL std/input.output/file.streams/fstreams/filebuf.virtuals/xsputn.pass.cpp:1 FAIL -# Not analyzed. MSVC emits error C2338: static assertion failed: 'SentinelHasMinus' -std/ranges/range.adaptors/range.adjacent.transform/sentinel/minus.pass.cpp:0 FAIL -std/ranges/range.adaptors/range.adjacent.transform/sentinel/minus.pass.cpp:1 FAIL - # *** XFAILS WHICH PASS *** # These tests contain `// XFAIL: msvc` comments, which accurately describe runtime failures for x86 and x64. From 65e625098ced21984c3f7dd49b8f1758975f091c Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 12 Jan 2026 14:44:31 -0800 Subject: [PATCH 10/13] Simplification 1: Move up aliases in cartesian_product_view::_Iterator, no other changes. --- stl/inc/ranges | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/stl/inc/ranges b/stl/inc/ranges index 491e0a7a90c..4b2c838feba 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -8827,6 +8827,21 @@ namespace ranges { template class _Iterator { + public: + using iterator_category = input_iterator_tag; + + using iterator_concept = conditional_t<_Cartesian_product_is_random_access<_Const, _First, _Rest...>, + random_access_iterator_tag, + conditional_t<_Cartesian_product_is_bidirectional<_Const, _First, _Rest...>, bidirectional_iterator_tag, + conditional_t>, forward_iterator_tag, + input_iterator_tag>>>; + + using value_type = + tuple>, range_value_t<_Maybe_const<_Const, _Rest>>...>; + using reference = tuple>, + range_reference_t<_Maybe_const<_Const, _Rest>>...>; + using difference_type = _Difference_type<_Const>; + private: friend cartesian_product_view; using _Parent_t = _Maybe_const<_Const, cartesian_product_view>; @@ -8962,20 +8977,6 @@ namespace ranges { : _Parent(_STD addressof(_Parent_)), _Current(_STD move(_Current_)) {} public: - using iterator_category = input_iterator_tag; - - using iterator_concept = conditional_t<_Cartesian_product_is_random_access<_Const, _First, _Rest...>, - random_access_iterator_tag, - conditional_t<_Cartesian_product_is_bidirectional<_Const, _First, _Rest...>, bidirectional_iterator_tag, - conditional_t>, forward_iterator_tag, - input_iterator_tag>>>; - - using value_type = - tuple>, range_value_t<_Maybe_const<_Const, _Rest>>...>; - using reference = tuple>, - range_reference_t<_Maybe_const<_Const, _Rest>>...>; - using difference_type = _Difference_type<_Const>; - _Iterator() = default; constexpr _Iterator(_Iterator _It) From b762d00a56d5c2f5ac6d2a663d355ea92e36343b Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 12 Jan 2026 14:47:45 -0800 Subject: [PATCH 11/13] Simplification 2: Use cartesian_product_view::_Iterator::difference_type. --- stl/inc/ranges | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/stl/inc/ranges b/stl/inc/ranges index 4b2c838feba..2620bd902a2 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -8882,7 +8882,7 @@ namespace ranges { } template - constexpr void _Advance(const _Difference_type<_Const> _Off) { + constexpr void _Advance(const difference_type _Off) { if (_Off == 0) { return; } @@ -8890,14 +8890,13 @@ namespace ranges { auto& _Range = _STD get<_Index>(_Parent->_Bases); auto& _It = _STD get<_Index>(_Current); using _Iter = remove_reference_t; - using _Diff = _Difference_type<_Const>; if constexpr (_Index > 0) { - const auto _Size = static_cast<_Diff>(_RANGES ssize(_Range)); + const auto _Size = static_cast(_RANGES ssize(_Range)); const auto _Begin = _RANGES begin(_Range); - const auto _It_off = static_cast<_Diff>(_It - _Begin); - const auto _It_new_off = static_cast<_Diff>((_It_off + _Off) % _Size); - const auto _Next_off = static_cast<_Diff>((_It_off + _Off) / _Size); + const auto _It_off = static_cast(_It - _Begin); + const auto _It_new_off = static_cast((_It_off + _Off) % _Size); + const auto _Next_off = static_cast((_It_off + _Off) / _Size); if (_It_new_off < 0) { _It = _Begin + static_cast>(_It_new_off + _Size); _Advance<_Index - 1>(_Next_off - 1); @@ -8907,11 +8906,11 @@ namespace ranges { } } else { #if _ITERATOR_DEBUG_LEVEL != 0 - const auto _It_off = static_cast<_Diff>(_It - _RANGES begin(_Range)); + const auto _It_off = static_cast(_It - _RANGES begin(_Range)); _STL_VERIFY(_It_off + _Off >= 0, "Cannot advance cartesian_product_view iterator before begin " "(N4950 [range.cartesian.iterator]/19)."); if constexpr (sized_range) { - const auto _Size = static_cast<_Diff>(_RANGES ssize(_Range)); + const auto _Size = static_cast(_RANGES ssize(_Range)); _STL_VERIFY(_It_off + _Off < _Size || (_It_off + _Off == _Size && _Entire_tail_at_begin(make_index_sequence{})), @@ -8936,13 +8935,11 @@ namespace ranges { } template - _NODISCARD constexpr _Difference_type<_Const> _Distance_from(const _Tuple& _Tpl) const { - const auto _Diff = - static_cast<_Difference_type<_Const>>(_STD get<_Index>(_Current) - _STD get<_Index>(_Tpl)); + _NODISCARD constexpr difference_type _Distance_from(const _Tuple& _Tpl) const { + const auto _Diff = static_cast(_STD get<_Index>(_Current) - _STD get<_Index>(_Tpl)); if constexpr (_Index > 0) { - _Difference_type<_Const> _Result{1}; - const auto _Size = - static_cast<_Difference_type<_Const>>(_RANGES size(_STD get<_Index>(_Parent->_Bases))); + difference_type _Result{1}; + const auto _Size = static_cast(_RANGES size(_STD get<_Index>(_Parent->_Bases))); [[maybe_unused]] const bool _Overflow = _Mul_overflow(_Size, _Distance_from<_Index - 1>(_Tpl), _Result) || _Add_overflow(_Result, _Diff, _Result); From a0c53608890e52cc625d86a01ea288935add3c5b Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Mon, 12 Jan 2026 15:09:57 -0800 Subject: [PATCH 12/13] Simplification 3: Use _Iterator::difference_type consistently. --- stl/inc/ranges | 89 ++++++++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/stl/inc/ranges b/stl/inc/ranges index 2620bd902a2..b8bd6e0493f 100644 --- a/stl/inc/ranges +++ b/stl/inc/ranges @@ -5014,17 +5014,19 @@ namespace ranges { return _Get_current(_Left) == _Right._Last; } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for, _Maybe_const_iter<_OtherConst>> - _NODISCARD friend constexpr range_difference_t<_Maybe_const<_OtherConst, _Vw>> operator-( + _NODISCARD friend constexpr typename _Iterator<_OtherConst>::difference_type operator-( const _Iterator<_OtherConst>& _Left, const _Sentinel& _Right) noexcept(noexcept(_Get_current(_Left) - _Right._Last)) /* strengthened */ { return _Get_current(_Left) - _Right._Last; } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for, _Maybe_const_iter<_OtherConst>> - _NODISCARD friend constexpr range_difference_t<_Maybe_const<_OtherConst, _Vw>> operator-( + _NODISCARD friend constexpr typename _Iterator<_OtherConst>::difference_type operator-( const _Sentinel& _Left, const _Iterator<_OtherConst>& _Right) noexcept(noexcept(_Left._Last - _Get_current(_Right))) /* strengthened */ { return _Left._Last - _Get_current(_Right); @@ -5327,7 +5329,7 @@ namespace ranges { template requires sized_sentinel_for<_Base_sentinel, iterator_t<_Maybe_const<_OtherConst, _Vw>>> - _NODISCARD constexpr range_difference_t<_Maybe_const<_OtherConst, _Vw>> _Distance_from( + _NODISCARD constexpr _Iterator<_OtherConst>::difference_type _Distance_from( const _Iterator<_OtherConst>& _It) const noexcept(noexcept(_End - _It._Current)) { return _End - _It._Current; } @@ -5352,19 +5354,20 @@ namespace ranges { return _Se._Equal(_It); } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for<_Base_sentinel, iterator_t<_Maybe_const<_OtherConst, _Vw>>> - _NODISCARD friend constexpr range_difference_t<_Maybe_const<_OtherConst, _Vw>> operator-( - const _Iterator<_OtherConst>& _It, const _Sentinel& _Se) // + _NODISCARD friend constexpr typename _Iterator<_OtherConst>::difference_type operator-( + const _Iterator<_OtherConst>& _It, const _Sentinel& _Se) noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { return -_Se._Distance_from(_It); } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for<_Base_sentinel, iterator_t<_Maybe_const<_OtherConst, _Vw>>> - _NODISCARD friend constexpr range_difference_t<_Maybe_const<_OtherConst, _Vw>> operator-( - const _Sentinel& _Se, const _Iterator<_OtherConst>& _It) // - noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { + _NODISCARD friend constexpr typename _Iterator<_OtherConst>::difference_type operator-(const _Sentinel& _Se, + const _Iterator<_OtherConst>& _It) noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { return _Se._Distance_from(_It); } }; @@ -7397,6 +7400,9 @@ namespace ranges { private: friend zip_view; + template + using _Difference_type = _Iterator<_IteratorConst>::difference_type; + using _My_tuple = tuple>...>; /* [[no_unique_address]] */ _My_tuple _End; @@ -7435,22 +7441,20 @@ namespace ranges { requires (sized_sentinel_for>, iterator_t<_Maybe_const<_IteratorConst, _ViewTypes>>> && ...) - _NODISCARD friend constexpr common_type_t>...> - operator-(const _Iterator<_IteratorConst>& _Lhs, const _Sentinel& _Rhs) - noexcept(noexcept(_Zip_get_smallest_distance< - common_type_t>...>>( - _Get_iterator_tuple(_Lhs), _Rhs._End))) /* strengthened */ { - using _Difference_type = common_type_t>...>; - return _Zip_get_smallest_distance<_Difference_type>(_Get_iterator_tuple(_Lhs), _Rhs._End); + _NODISCARD friend constexpr _Difference_type<_IteratorConst> operator-( + const _Iterator<_IteratorConst>& _Lhs, const _Sentinel& _Rhs) + noexcept(noexcept(_Zip_get_smallest_distance<_Difference_type<_IteratorConst>>( + _Get_iterator_tuple(_Lhs), _Rhs._End))) /* strengthened */ { + return _Zip_get_smallest_distance<_Difference_type<_IteratorConst>>( + _Get_iterator_tuple(_Lhs), _Rhs._End); } template requires (sized_sentinel_for>, iterator_t<_Maybe_const<_IteratorConst, _ViewTypes>>> && ...) - _NODISCARD friend constexpr common_type_t>...> - operator-(const _Sentinel& _Lhs, const _Iterator<_IteratorConst>& _Rhs) - noexcept(noexcept(-(_Rhs - _Lhs))) /* strengthened */ { + _NODISCARD friend constexpr _Difference_type<_IteratorConst> operator-(const _Sentinel& _Lhs, + const _Iterator<_IteratorConst>& _Rhs) noexcept(noexcept(-(_Rhs - _Lhs))) /* strengthened */ { return -(_Rhs - _Lhs); } }; @@ -7781,10 +7785,6 @@ namespace ranges { private: friend zip_transform_view; - // TRANSITION, DevCom-10253131 - template - using _Iter_sent_difference_type = range_difference_t<_Maybe_const<_IteratorConst, _Inner_view>>; - /* [[no_unique_address]] */ _Zentinel<_IsConst> _Inner; constexpr explicit _Sentinel(_Zentinel<_IsConst> _Inner_) @@ -7812,19 +7812,21 @@ namespace ranges { return _Get_iterator_inner(_Lhs) == _Rhs._Inner; } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for<_Zentinel<_IsConst>, _Ziperator<_IteratorConst>> - _NODISCARD friend constexpr _Iter_sent_difference_type<_IteratorConst> // TRANSITION, DevCom-10253131 - operator-(const _Iterator<_IteratorConst>& _Lhs, const _Sentinel& _Rhs) - noexcept(noexcept(_Get_iterator_inner(_Lhs) - _Rhs._Inner)) /* strengthened */ { + _NODISCARD friend constexpr typename _Iterator<_IteratorConst>::difference_type operator-( + const _Iterator<_IteratorConst>& _Lhs, const _Sentinel& _Rhs) + noexcept(noexcept(_Get_iterator_inner(_Lhs) - _Rhs._Inner)) /* strengthened */ { return _Get_iterator_inner(_Lhs) - _Rhs._Inner; } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for<_Zentinel<_IsConst>, _Ziperator<_IteratorConst>> - _NODISCARD friend constexpr _Iter_sent_difference_type<_IteratorConst> // TRANSITION, DevCom-10253131 - operator-(const _Sentinel& _Lhs, const _Iterator<_IteratorConst>& _Rhs) - noexcept(noexcept(_Lhs._Inner - _Get_iterator_inner(_Rhs))) /* strengthened */ { + _NODISCARD friend constexpr typename _Iterator<_IteratorConst>::difference_type operator-( + const _Sentinel& _Lhs, const _Iterator<_IteratorConst>& _Rhs) + noexcept(noexcept(_Lhs._Inner - _Get_iterator_inner(_Rhs))) /* strengthened */ { return _Lhs._Inner - _Get_iterator_inner(_Rhs); } }; @@ -8238,7 +8240,7 @@ namespace ranges { template requires sized_sentinel_for<_Base_sentinel, iterator_t<_Maybe_const<_OtherConst, _Vw>>> - _NODISCARD constexpr range_difference_t<_Maybe_const<_OtherConst, _Vw>> _Distance_from( + _NODISCARD constexpr _Iterator<_OtherConst>::difference_type _Distance_from( const _Iterator<_OtherConst>& _It) const noexcept(noexcept(_End - _It._Current.back())) { return _End - _It._Current.back(); } @@ -8258,19 +8260,20 @@ namespace ranges { return _Se._Equal(_It); } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for<_Base_sentinel, iterator_t<_Maybe_const<_OtherConst, _Vw>>> - _NODISCARD friend constexpr range_difference_t<_Maybe_const<_OtherConst, _Vw>> operator-( - const _Iterator<_OtherConst>& _It, const _Sentinel& _Se) noexcept( // - noexcept(_Se._Distance_from(_It))) /* strengthened */ { + _NODISCARD friend constexpr typename _Iterator<_OtherConst>::difference_type operator-( + const _Iterator<_OtherConst>& _It, const _Sentinel& _Se) + noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { return -_Se._Distance_from(_It); } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for<_Base_sentinel, iterator_t<_Maybe_const<_OtherConst, _Vw>>> - _NODISCARD friend constexpr range_difference_t<_Maybe_const<_OtherConst, _Vw>> operator-( - const _Sentinel& _Se, const _Iterator<_OtherConst>& _It) noexcept( // - noexcept(_Se._Distance_from(_It))) /* strengthened */ { + _NODISCARD friend constexpr typename _Iterator<_OtherConst>::difference_type operator-(const _Sentinel& _Se, + const _Iterator<_OtherConst>& _It) noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { return _Se._Distance_from(_It); } }; @@ -8600,13 +8603,10 @@ namespace ranges { return _It._Inner == _Inner; } - template - using _Inner_view_diff = range_difference_t<_Maybe_const<_OtherConst, _Inner_view>>; - template requires sized_sentinel_for<_Inner_sentinel<_Const>, _Inner_iterator<_OtherConst>> - _NODISCARD constexpr _Inner_view_diff<_OtherConst> _Distance_from(const _Iterator<_OtherConst>& _It) const - noexcept(noexcept(_Inner - _It._Inner)) { + _NODISCARD constexpr _Iterator<_OtherConst>::difference_type _Distance_from( + const _Iterator<_OtherConst>& _It) const noexcept(noexcept(_Inner - _It._Inner)) { return _Inner - _It._Inner; } @@ -8624,16 +8624,19 @@ namespace ranges { return _Se._Equal(_It); } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for<_Inner_sentinel<_Const>, _Inner_iterator<_OtherConst>> - _NODISCARD friend constexpr _Inner_view_diff<_OtherConst> operator-(const _Iterator<_OtherConst>& _It, - const _Sentinel& _Se) noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { + _NODISCARD friend constexpr typename _Iterator<_OtherConst>::difference_type operator-( + const _Iterator<_OtherConst>& _It, const _Sentinel& _Se) + noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { return -_Se._Distance_from(_It); } + // typename is a workaround for VSO-2680018 (EDG) template requires sized_sentinel_for<_Inner_sentinel<_Const>, _Inner_iterator<_OtherConst>> - _NODISCARD friend constexpr _Inner_view_diff<_OtherConst> operator-(const _Sentinel& _Se, + _NODISCARD friend constexpr typename _Iterator<_OtherConst>::difference_type operator-(const _Sentinel& _Se, const _Iterator<_OtherConst>& _It) noexcept(noexcept(_Se._Distance_from(_It))) /* strengthened */ { return _Se._Distance_from(_It); } From 9ad270aefdc49cc4ba0b19cbaadeb169f0493632 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Wed, 14 Jan 2026 22:39:14 -0800 Subject: [PATCH 13/13] Mark C++26 tests as FAIL for the internal harness. --- tests/libcxx/expected_results.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/libcxx/expected_results.txt b/tests/libcxx/expected_results.txt index a4fa8ff69ca..97576c05f9c 100644 --- a/tests/libcxx/expected_results.txt +++ b/tests/libcxx/expected_results.txt @@ -582,6 +582,11 @@ std/containers/container.adaptors/flat.set/robust_against_nonbool.compile.pass.c std/containers/container.adaptors/flat.set/types.compile.pass.cpp FAIL std/language.support/support.limits/support.limits.general/flat_set.version.compile.pass.cpp FAIL +# P1789R3 Library Support For Expansion Statements +# Add 'std-at-least-c++26' to tests/utils/stl/test/tests.py when beginning work on C++26. +std/utilities/intseq/intseq.binding/structured_binding.pass.cpp FAIL +std/utilities/intseq/intseq.binding/tuple_interface.compile.pass.cpp FAIL + # P2255R2 "Type Traits To Detect References Binding To Temporaries" # (type_traits.version.compile.pass.cpp still fails for Clang due to LLVM-48860) std/language.support/support.limits/support.limits.general/type_traits.version.compile.pass.cpp FAIL @@ -590,6 +595,10 @@ std/utilities/meta/meta.unary/meta.unary.prop/reference_constructs_from_temporar std/utilities/meta/meta.unary/meta.unary.prop/reference_converts_from_temporary.pass.cpp:0 FAIL std/utilities/meta/meta.unary/meta.unary.prop/reference_converts_from_temporary.pass.cpp:1 FAIL +# P2592R3 Hashing Support For chrono Value Classes +# Add 'std-at-least-c++26' to tests/utils/stl/test/tests.py when beginning work on C++26. +std/time/time.hash/time.hash_enabled.pass.cpp FAIL + # P2835R7 atomic_ref::address() # Add 'std-at-least-c++26' to tests/utils/stl/test/tests.py when beginning work on C++26. std/atomics/atomics.ref/address.pass.cpp FAIL