On Tue, 18 Mar 2025 at 17:27, Tomasz Kamiński <tkami...@redhat.com> wrote:
>
> 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.
> ---
>  Corrected check to use is_permuation instead of is_equal.

OK for trunk.

>
>  libstdc++-v3/include/bits/unordered_map.h            |  2 +-
>  libstdc++-v3/include/bits/unordered_set.h            |  2 +-
>  .../unordered_multimap/cons/from_range.cc            | 12 ++++++++++++
>  .../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 5c930487190..4a0527c6025 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 21ffdaf50a0..cfa8ee297f4 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 9273ef0d57a..381302bf7fd 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 fb388764423..cb522b012aa 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();
>  }
> --
> 2.48.1
>

Reply via email to