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.
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);
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);
#include <algorithm>
#include <unordered_map>
+#include <ranges>
#include <span>
#include <testsuite_allocator.h>
#include <testsuite_hooks.h>
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();
}
#include <algorithm>
#include <unordered_set>
+#include <ranges>
#include <span>
#include <testsuite_allocator.h>
#include <testsuite_hooks.h>
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();
}