aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorTomasz Kamiński <tkaminsk@redhat.com>2025-03-18 17:32:40 +0100
committerTomasz Kamiński <tkaminsk@redhat.com>2025-03-19 11:17:00 +0100
commit3b32473d3e40d816e4ba280f8a58f44957219681 (patch)
tree90c7c9aa17384930692cecfeb966f12ed1ea67f5 /libstdc++-v3
parentd46be332818361d7a31065c6d46df7181505ab30 (diff)
downloadgcc-3b32473d3e40d816e4ba280f8a58f44957219681.zip
gcc-3b32473d3e40d816e4ba280f8a58f44957219681.tar.gz
gcc-3b32473d3e40d816e4ba280f8a58f44957219681.tar.bz2
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.
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/include/bits/unordered_map.h2
-rw-r--r--libstdc++-v3/include/bits/unordered_set.h2
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/from_range.cc12
-rw-r--r--libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/from_range.cc11
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 5c93048..4a0527c 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 21ffdaf..cfa8ee2 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 9273ef0..381302b 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 fb38876..cb522b0 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();
}