https://gcc.gnu.org/g:3b32473d3e40d816e4ba280f8a58f44957219681
commit r15-8291-g3b32473d3e40d816e4ba280f8a58f44957219681 Author: Tomasz KamiĆski <tkami...@redhat.com> Date: Tue Mar 18 17:32:40 2025 +0100 libstdc++: Cast difference_type for insert_range unordered non-unique containers [PR119358] ranges::distance may produce an integer-like class type (ranges::__detail::__max_diff_type) that is only explicitly convertible to other integer types, so the result needs to be casted to containers size_type. PR libstdc++/119358 libstdc++-v3/ChangeLog: * include/bits/unordered_map.h (unordered_multimap::insert_range): Cast ranges::distance to size_type before passing to _M_rehash_insert. * include/bits/unordered_set.h (unordered_multiset::insert_range): Same as unordered_multimap::insert_range. * testsuite/23_containers/unordered_multimap/cons/from_range.cc: New tests. * testsuite/23_containers/unordered_multiset/cons/from_range.cc: New tests. Diff: --- libstdc++-v3/include/bits/unordered_map.h | 2 +- libstdc++-v3/include/bits/unordered_set.h | 2 +- .../23_containers/unordered_multimap/cons/from_range.cc | 12 ++++++++++++ .../23_containers/unordered_multiset/cons/from_range.cc | 11 +++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/bits/unordered_map.h b/libstdc++-v3/include/bits/unordered_map.h index 5c9304871907..4a0527c6025e 100644 --- a/libstdc++-v3/include/bits/unordered_map.h +++ b/libstdc++-v3/include/bits/unordered_map.h @@ -1805,7 +1805,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER return; if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>) - _M_h._M_rehash_insert(ranges::distance(__rg)); + _M_h._M_rehash_insert(size_type(ranges::distance(__rg))); else _M_h._M_rehash_insert(1); diff --git a/libstdc++-v3/include/bits/unordered_set.h b/libstdc++-v3/include/bits/unordered_set.h index 21ffdaf50a02..cfa8ee297f4e 100644 --- a/libstdc++-v3/include/bits/unordered_set.h +++ b/libstdc++-v3/include/bits/unordered_set.h @@ -1485,7 +1485,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER return; if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>) - _M_h._M_rehash_insert(ranges::distance(__rg)); + _M_h._M_rehash_insert(size_type(ranges::distance(__rg))); else _M_h._M_rehash_insert(1); diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/from_range.cc b/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/from_range.cc index 9273ef0d57a3..381302bf7fd4 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/from_range.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/from_range.cc @@ -2,6 +2,7 @@ #include <algorithm> #include <unordered_map> +#include <ranges> #include <span> #include <testsuite_allocator.h> #include <testsuite_hooks.h> @@ -232,7 +233,18 @@ test_ranges() return true; } +void test_PR119358() { +#ifdef __SIZEOF_INT128__ + auto r = std::views::iota(__int128(0)) + | std::views::take(5); + auto z = std::views::zip(r, r); + std::unordered_multimap<__int128, __int128> m(std::from_range, z); + VERIFY( std::ranges::is_permutation(m, z) ); +#endif +} + int main() { test_ranges(); + test_PR119358(); } diff --git a/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/from_range.cc b/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/from_range.cc index fb3887644233..cb522b012aae 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/from_range.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/from_range.cc @@ -2,6 +2,7 @@ #include <algorithm> #include <unordered_set> +#include <ranges> #include <span> #include <testsuite_allocator.h> #include <testsuite_hooks.h> @@ -195,7 +196,17 @@ test_ranges() return true; } +void test_PR119358() { +#ifdef __SIZEOF_INT128__ + auto r = std::views::iota(__int128(0)) + | std::views::take(5); + std::unordered_multiset<__int128> s(std::from_range, r); + VERIFY( std::ranges::is_permutation(s, r) ); +#endif +} + int main() { test_ranges(); + test_PR119358(); }