]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Cast difference_type for insert_range unordered non-unique containers...
authorTomasz Kamiński <tkaminsk@redhat.com>
Tue, 18 Mar 2025 16:32:40 +0000 (17:32 +0100)
committerTomasz Kamiński <tkaminsk@redhat.com>
Wed, 19 Mar 2025 10:17:00 +0000 (11:17 +0100)
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.

libstdc++-v3/include/bits/unordered_map.h
libstdc++-v3/include/bits/unordered_set.h
libstdc++-v3/testsuite/23_containers/unordered_multimap/cons/from_range.cc
libstdc++-v3/testsuite/23_containers/unordered_multiset/cons/from_range.cc

index 5c9304871907b51c6cefad68999d1e78d5cd774d..4a0527c6025e4180f8ac162358e0794360d0c927 100644 (file)
@@ -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);
 
index 21ffdaf50a02d519b04b2aebfbc164574783be8e..cfa8ee297f4ebca377ae5b3240ef0474cb515d87 100644 (file)
@@ -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);
 
index 9273ef0d57a38afa138765ee190d2a06a6b63f0e..381302bf7fd49560f696b91488094251b20293e8 100644 (file)
@@ -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();
 }
index fb3887644233cba8cbacb93fb1789c0ed43f7a6c..cb522b012aaef07bd428cf5f7cc34e7a547030e7 100644 (file)
@@ -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();
 }