From fd61fd2616a6447fe672582da7ba7dbf67e337b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Michal?= Date: Fri, 5 Dec 2025 20:00:39 +0100 Subject: [PATCH 1/2] Protect against evil operator comma overloads in test code. --- .../flat.multiset/flat.multiset.iterators/iterator.pass.cpp | 2 +- .../flat.set/flat.set.iterators/iterator.pass.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libcxx/test/std/containers/container.adaptors/flat.multiset/flat.multiset.iterators/iterator.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.multiset/flat.multiset.iterators/iterator.pass.cpp index 878b2b2094f71..ed63897a2082d 100644 --- a/libcxx/test/std/containers/container.adaptors/flat.multiset/flat.multiset.iterators/iterator.pass.cpp +++ b/libcxx/test/std/containers/container.adaptors/flat.multiset/flat.multiset.iterators/iterator.pass.cpp @@ -57,7 +57,7 @@ constexpr void test_one() { i = m.begin(); // move-assignment typename M::const_iterator k = i; // converting constructor assert(i == k); // comparison - for (int j = 0; j < 9; ++j, ++i) { // pre-increment + for (int j = 0; j < 9; ++j, (void)++i) { // pre-increment assert(*i == expected[j]); // operator* } assert(i == m.end()); diff --git a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.iterators/iterator.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.iterators/iterator.pass.cpp index 8aafa97818bc7..d79a1db289777 100644 --- a/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.iterators/iterator.pass.cpp +++ b/libcxx/test/std/containers/container.adaptors/flat.set/flat.set.iterators/iterator.pass.cpp @@ -56,7 +56,7 @@ constexpr void test_one() { i = m.begin(); // move-assignment typename M::const_iterator k = i; // converting constructor assert(i == k); // comparison - for (int j = 1; j <= 4; ++j, ++i) { // pre-increment + for (int j = 1; j <= 4; ++j, (void)++i) { // pre-increment assert(*i == j); // operator* } assert(i == m.end()); From 16e837ecaf4bced948792f805203cdf040f23ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojt=C4=9Bch=20Michal?= Date: Fri, 5 Dec 2025 20:04:26 +0100 Subject: [PATCH 2/2] Prevent narrowing conversions in libcxx test code (mostly replace char and short with int). --- .../flat.map.cons/copy_assign.pass.cpp | 18 +++---- .../flat.map/flat.map.cons/deduct.pass.cpp | 54 +++++++++---------- .../flat.map.cons/deduct_pmr.pass.cpp | 28 +++++----- .../flat.map.cons/initializer_list.pass.cpp | 14 ++--- .../flat.map/flat.map.cons/iter_iter.pass.cpp | 26 ++++----- .../flat.map.cons/move_assign.pass.cpp | 8 +-- .../flat.map/flat.map.cons/pmr.pass.cpp | 12 ++--- .../flat.map/flat.map.cons/range.pass.cpp | 26 ++++----- .../flat.map.cons/sorted_container.pass.cpp | 12 ++--- .../sorted_initializer_list.pass.cpp | 16 +++--- .../flat.map.cons/sorted_iter_iter.pass.cpp | 20 +++---- .../flat.map.modifiers/erase_key.pass.cpp | 12 ++--- .../flat.map/flat.map.observers/comp.pass.cpp | 2 +- .../flat.multimap.cons/copy_assign.pass.cpp | 18 +++---- .../flat.multimap.cons/deduct.pass.cpp | 54 +++++++++---------- .../flat.multimap.cons/deduct_pmr.pass.cpp | 28 +++++----- .../initializer_list.pass.cpp | 14 ++--- .../flat.multimap.cons/iter_iter.pass.cpp | 26 ++++----- .../flat.multimap.cons/move_assign.pass.cpp | 8 +-- .../flat.multimap.cons/pmr.pass.cpp | 12 ++--- .../flat.multimap.cons/range.pass.cpp | 26 ++++----- .../sorted_container.pass.cpp | 28 +++++----- .../sorted_initializer_list.pass.cpp | 22 ++++---- .../sorted_iter_iter.pass.cpp | 20 +++---- .../erase_key.pass.cpp | 12 ++--- .../flat.multimap.observers/comp.pass.cpp | 2 +- .../flat.multiset.cons/move.pass.cpp | 2 +- .../flat.multiset.cons/move_assign.pass.cpp | 9 ++-- .../sorted_iter_iter.pass.cpp | 4 +- .../flat.set/flat.set.cons/move.pass.cpp | 2 +- .../flat.set.cons/move_assign.pass.cpp | 9 ++-- .../flat.set.cons/sorted_iter_iter.pass.cpp | 4 +- 32 files changed, 275 insertions(+), 273 deletions(-) diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/copy_assign.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/copy_assign.pass.cpp index c98803f6cce9d..56231b8ee05bf 100644 --- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/copy_assign.pass.cpp +++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/copy_assign.pass.cpp @@ -29,8 +29,8 @@ constexpr void test() { // test_allocator is not propagated using C = test_less; KeyContainer> ks({1, 3, 5}, test_allocator(6)); - ValueContainer> vs({2, 2, 1}, test_allocator(7)); - using M = std::flat_map; + ValueContainer> vs({2, 2, 1}, test_allocator(7)); + using M = std::flat_map; auto mo = M(ks, vs, C(5)); auto m = M({{3, 3}, {4, 4}, {5, 5}}, C(3), test_allocator(2)); m = mo; @@ -39,23 +39,23 @@ constexpr void test() { assert(m.keys() == ks); assert(m.values() == vs); assert(m.keys().get_allocator() == test_allocator(2)); - assert(m.values().get_allocator() == test_allocator(2)); + assert(m.values().get_allocator() == test_allocator(2)); // mo is unchanged assert(mo.key_comp() == C(5)); assert(mo.keys() == ks); assert(mo.values() == vs); assert(mo.keys().get_allocator() == test_allocator(6)); - assert(mo.values().get_allocator() == test_allocator(7)); + assert(mo.values().get_allocator() == test_allocator(7)); } { // other_allocator is propagated using C = test_less; using Ks = KeyContainer>; - using Vs = ValueContainer>; + using Vs = ValueContainer>; auto ks = Ks({1, 3, 5}, other_allocator(6)); - auto vs = Vs({2, 2, 1}, other_allocator(7)); - using M = std::flat_map; + auto vs = Vs({2, 2, 1}, other_allocator(7)); + using M = std::flat_map; auto mo = M(Ks(ks, other_allocator(6)), Vs(vs, other_allocator(7)), C(5)); auto m = M({{3, 3}, {4, 4}, {5, 5}}, C(3), other_allocator(2)); m = mo; @@ -64,14 +64,14 @@ constexpr void test() { assert(m.keys() == ks); assert(m.values() == vs); assert(m.keys().get_allocator() == other_allocator(6)); - assert(m.values().get_allocator() == other_allocator(7)); + assert(m.values().get_allocator() == other_allocator(7)); // mo is unchanged assert(mo.key_comp() == C(5)); assert(mo.keys() == ks); assert(mo.values() == vs); assert(mo.keys().get_allocator() == other_allocator(6)); - assert(mo.values().get_allocator() == other_allocator(7)); + assert(mo.values().get_allocator() == other_allocator(7)); } if (!TEST_IS_CONSTANT_EVALUATED) { // comparator is copied and invariant is preserved diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/deduct.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/deduct.pass.cpp index 21166361b014b..7998bef2e87d8 100644 --- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/deduct.pass.cpp +++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/deduct.pass.cpp @@ -33,19 +33,19 @@ using PC = std::pair; void test_copy() { { - std::flat_map source = {{1, 2}, {2, 3}}; + std::flat_map source = {{1, 2}, {2, 3}}; std::flat_map s(source); ASSERT_SAME_TYPE(decltype(s), decltype(source)); assert(s == source); } { - std::flat_map> source = {{1, 2}, {2, 3}}; + std::flat_map> source = {{1, 2}, {2, 3}}; std::flat_map s{source}; // braces instead of parens ASSERT_SAME_TYPE(decltype(s), decltype(source)); assert(s == source); } { - std::flat_map> source = {{1, 2}, {2, 3}}; + std::flat_map> source = {{1, 2}, {2, 3}}; std::flat_map s(source, std::allocator()); ASSERT_SAME_TYPE(decltype(s), decltype(source)); assert(s == source); @@ -54,14 +54,14 @@ void test_copy() { void test_containers() { std::deque> ks({1, 2, 1, INT_MAX, 3}, test_allocator(0, 42)); - std::deque> vs({1, 2, 1, 4, 5}, test_allocator(0, 43)); + std::deque> vs({1, 2, 1, 4, 5}, test_allocator(0, 43)); std::deque> sorted_ks({1, 2, 3, INT_MAX}, test_allocator(0, 42)); - std::deque> sorted_vs({1, 2, 5, 4}, test_allocator(0, 43)); - const std::pair expected[] = {{1, 1}, {2, 2}, {3, 5}, {INT_MAX, 4}}; + std::deque> sorted_vs({1, 2, 5, 4}, test_allocator(0, 43)); + const std::pair expected[] = {{1, 1}, {2, 2}, {3, 5}, {INT_MAX, 4}}; { std::flat_map s(ks, vs); - ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 42); assert(s.values().get_allocator().get_id() == 43); @@ -69,7 +69,7 @@ void test_containers() { { std::flat_map s(std::sorted_unique, sorted_ks, sorted_vs); - ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 42); assert(s.values().get_allocator().get_id() == 43); @@ -77,7 +77,7 @@ void test_containers() { { std::flat_map s(ks, vs, test_allocator(0, 44)); - ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 44); assert(s.values().get_allocator().get_id() == 44); @@ -85,7 +85,7 @@ void test_containers() { { std::flat_map s(std::sorted_unique, sorted_ks, sorted_vs, test_allocator(0, 44)); - ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 44); assert(s.values().get_allocator().get_id() == 44); @@ -94,14 +94,14 @@ void test_containers() { void test_containers_compare() { std::deque> ks({1, 2, 1, INT_MAX, 3}, test_allocator(0, 42)); - std::deque> vs({1, 2, 1, 4, 5}, test_allocator(0, 43)); + std::deque> vs({1, 2, 1, 4, 5}, test_allocator(0, 43)); std::deque> sorted_ks({INT_MAX, 3, 2, 1}, test_allocator(0, 42)); - std::deque> sorted_vs({4, 5, 2, 1}, test_allocator(0, 43)); - const std::pair expected[] = {{INT_MAX, 4}, {3, 5}, {2, 2}, {1, 1}}; + std::deque> sorted_vs({4, 5, 2, 1}, test_allocator(0, 43)); + const std::pair expected[] = {{INT_MAX, 4}, {3, 5}, {2, 2}, {1, 1}}; { std::flat_map s(ks, vs, std::greater()); - ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 42); assert(s.values().get_allocator().get_id() == 43); @@ -109,7 +109,7 @@ void test_containers_compare() { { std::flat_map s(std::sorted_unique, sorted_ks, sorted_vs, std::greater()); - ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 42); assert(s.values().get_allocator().get_id() == 43); @@ -117,7 +117,7 @@ void test_containers_compare() { { std::flat_map s(ks, vs, std::greater(), test_allocator(0, 44)); - ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 44); assert(s.values().get_allocator().get_id() == 44); @@ -125,7 +125,7 @@ void test_containers_compare() { { std::flat_map s(std::sorted_unique, sorted_ks, sorted_vs, std::greater(), test_allocator(0, 44)); - ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map, decltype(ks), decltype(vs)>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 44); assert(s.values().get_allocator().get_id() == 44); @@ -280,11 +280,11 @@ void test_initializer_list_compare() { } void test_from_range() { - std::list> r = {{1, 1}, {2, 2}, {1, 1}, {INT_MAX, 4}, {3, 5}}; - const std::pair expected[] = {{1, 1}, {2, 2}, {3, 5}, {INT_MAX, 4}}; + std::list> r = {{1, 1}, {2, 2}, {1, 1}, {INT_MAX, 4}, {3, 5}}; + const std::pair expected[] = {{1, 1}, {2, 2}, {3, 5}, {INT_MAX, 4}}; { std::flat_map s(std::from_range, r); - ASSERT_SAME_TYPE(decltype(s), std::flat_map>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map>); assert(std::ranges::equal(s, expected)); } { @@ -292,10 +292,10 @@ void test_from_range() { ASSERT_SAME_TYPE( decltype(s), std::flat_map, std::vector>, - std::vector>>); + std::vector>>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 42); assert(s.values().get_allocator().get_id() == 42); @@ -303,11 +303,11 @@ void test_from_range() { } void test_from_range_compare() { - std::list> r = {{1, 1}, {2, 2}, {1, 1}, {INT_MAX, 4}, {3, 5}}; - const std::pair expected[] = {{INT_MAX, 4}, {3, 5}, {2, 2}, {1, 1}}; + std::list> r = {{1, 1}, {2, 2}, {1, 1}, {INT_MAX, 4}, {3, 5}}; + const std::pair expected[] = {{INT_MAX, 4}, {3, 5}, {2, 2}, {1, 1}}; { std::flat_map s(std::from_range, r, std::greater()); - ASSERT_SAME_TYPE(decltype(s), std::flat_map>); + ASSERT_SAME_TYPE(decltype(s), std::flat_map>); assert(std::ranges::equal(s, expected)); } { @@ -315,10 +315,10 @@ void test_from_range_compare() { ASSERT_SAME_TYPE( decltype(s), std::flat_map, std::vector>, - std::vector>>); + std::vector>>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().get_id() == 42); assert(s.values().get_allocator().get_id() == 42); diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/deduct_pmr.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/deduct_pmr.pass.cpp index 11c18ac13c76a..97eeec44bae3b 100644 --- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/deduct_pmr.pass.cpp +++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/deduct_pmr.pass.cpp @@ -32,19 +32,19 @@ using PC = std::pair; void test_containers() { std::deque> ks({1, 2, 1, INT_MAX, 3}, test_allocator(0, 42)); - std::deque> vs({1, 2, 1, 4, 5}, test_allocator(0, 43)); + std::deque> vs({1, 2, 1, 4, 5}, test_allocator(0, 43)); std::deque> sorted_ks({1, 2, 3, INT_MAX}, test_allocator(0, 42)); - std::deque> sorted_vs({1, 2, 5, 4}, test_allocator(0, 43)); - const std::pair expected[] = {{1, 1}, {2, 2}, {3, 5}, {INT_MAX, 4}}; + std::deque> sorted_vs({1, 2, 5, 4}, test_allocator(0, 43)); + const std::pair expected[] = {{1, 1}, {2, 2}, {3, 5}, {INT_MAX, 4}}; { std::pmr::monotonic_buffer_resource mr; std::pmr::monotonic_buffer_resource mr2; std::pmr::deque pks(ks.begin(), ks.end(), &mr); - std::pmr::deque pvs(vs.begin(), vs.end(), &mr); + std::pmr::deque pvs(vs.begin(), vs.end(), &mr); std::flat_map s(std::move(pks), std::move(pvs), &mr2); ASSERT_SAME_TYPE( - decltype(s), std::flat_map, std::pmr::deque, std::pmr::deque>); + decltype(s), std::flat_map, std::pmr::deque, std::pmr::deque>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().resource() == &mr2); assert(s.values().get_allocator().resource() == &mr2); @@ -53,11 +53,11 @@ void test_containers() { std::pmr::monotonic_buffer_resource mr; std::pmr::monotonic_buffer_resource mr2; std::pmr::deque pks(sorted_ks.begin(), sorted_ks.end(), &mr); - std::pmr::deque pvs(sorted_vs.begin(), sorted_vs.end(), &mr); + std::pmr::deque pvs(sorted_vs.begin(), sorted_vs.end(), &mr); std::flat_map s(std::sorted_unique, std::move(pks), std::move(pvs), &mr2); ASSERT_SAME_TYPE( - decltype(s), std::flat_map, std::pmr::deque, std::pmr::deque>); + decltype(s), std::flat_map, std::pmr::deque, std::pmr::deque>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().resource() == &mr2); assert(s.values().get_allocator().resource() == &mr2); @@ -66,19 +66,19 @@ void test_containers() { void test_containers_compare() { std::deque> ks({1, 2, 1, INT_MAX, 3}, test_allocator(0, 42)); - std::deque> vs({1, 2, 1, 4, 5}, test_allocator(0, 43)); + std::deque> vs({1, 2, 1, 4, 5}, test_allocator(0, 43)); std::deque> sorted_ks({INT_MAX, 3, 2, 1}, test_allocator(0, 42)); - std::deque> sorted_vs({4, 5, 2, 1}, test_allocator(0, 43)); - const std::pair expected[] = {{INT_MAX, 4}, {3, 5}, {2, 2}, {1, 1}}; + std::deque> sorted_vs({4, 5, 2, 1}, test_allocator(0, 43)); + const std::pair expected[] = {{INT_MAX, 4}, {3, 5}, {2, 2}, {1, 1}}; { std::pmr::monotonic_buffer_resource mr; std::pmr::monotonic_buffer_resource mr2; std::pmr::deque pks(ks.begin(), ks.end(), &mr); - std::pmr::deque pvs(vs.begin(), vs.end(), &mr); + std::pmr::deque pvs(vs.begin(), vs.end(), &mr); std::flat_map s(std::move(pks), std::move(pvs), std::greater(), &mr2); ASSERT_SAME_TYPE( - decltype(s), std::flat_map, std::pmr::deque, std::pmr::deque>); + decltype(s), std::flat_map, std::pmr::deque, std::pmr::deque>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().resource() == &mr2); assert(s.values().get_allocator().resource() == &mr2); @@ -87,11 +87,11 @@ void test_containers_compare() { std::pmr::monotonic_buffer_resource mr; std::pmr::monotonic_buffer_resource mr2; std::pmr::deque pks(sorted_ks.begin(), sorted_ks.end(), &mr); - std::pmr::deque pvs(sorted_vs.begin(), sorted_vs.end(), &mr); + std::pmr::deque pvs(sorted_vs.begin(), sorted_vs.end(), &mr); std::flat_map s(std::sorted_unique, std::move(pks), std::move(pvs), std::greater(), &mr2); ASSERT_SAME_TYPE( - decltype(s), std::flat_map, std::pmr::deque, std::pmr::deque>); + decltype(s), std::flat_map, std::pmr::deque, std::pmr::deque>); assert(std::ranges::equal(s, expected)); assert(s.keys().get_allocator().resource() == &mr2); assert(s.values().get_allocator().resource() == &mr2); diff --git a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/initializer_list.pass.cpp b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/initializer_list.pass.cpp index aea2002ba8d9c..ef49a6ee9f986 100644 --- a/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/initializer_list.pass.cpp +++ b/libcxx/test/std/containers/container.adaptors/flat.map/flat.map.cons/initializer_list.pass.cpp @@ -37,24 +37,24 @@ struct DefaultCtableComp { template