https://gcc.gnu.org/g:ee797739606ce9b8cf6ebb0236977861e49aa0d1

commit r15-7309-gee797739606ce9b8cf6ebb0236977861e49aa0d1
Author: Patrick Palka <ppa...@redhat.com>
Date:   Fri Jan 31 15:53:10 2025 -0500

    libstdc++: Fix return value of vector::insert_range
    
    In some cases we're wrongly returning an iterator to (one past) the last
    element inserted instead of to the first element inserted.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/stl_bvector.h (vector<bool>::insert_range):
            Consistently return an iterator pointing to the first element
            inserted.
            * include/bits/vector.tcc (vector::insert_range): Likewise.
            * 
testsuite/23_containers/vector/bool/modifiers/insert/insert_range.cc:
            Verify insert_range return values.
            * testsuite/23_containers/vector/modifiers/insert/insert_range.cc:
            Likewise.
    
    Reviewed-by: Jonathan Wakely <jwak...@redhat.com>

Diff:
---
 libstdc++-v3/include/bits/stl_bvector.h                |  8 ++++----
 libstdc++-v3/include/bits/vector.tcc                   |  3 ++-
 .../vector/bool/modifiers/insert/insert_range.cc       | 18 ++++++++++++------
 .../vector/modifiers/insert/insert_range.cc            | 18 ++++++++++++------
 4 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/libstdc++-v3/include/bits/stl_bvector.h 
b/libstdc++-v3/include/bits/stl_bvector.h
index 961e4a252996..2292eec54ad7 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -1341,9 +1341,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
                      std::copy_backward(__pos._M_const_cast(), end(),
                                         this->_M_impl._M_finish
                                           + difference_type(__n));
-                     auto __i = ranges::copy(__rg, __pos._M_const_cast()).out;
+                     ranges::copy(__rg, __pos._M_const_cast());
                      this->_M_impl._M_finish += difference_type(__n);
-                     return __i;
+                     return __pos._M_const_cast();
                    }
                  else
                    {
@@ -1355,9 +1355,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
                      iterator __i = _M_copy_aligned(__begin,
                                                     __pos._M_const_cast(),
                                                     __start);
-                     __i = ranges::copy(__rg, __i).out;
+                     iterator __j = ranges::copy(__rg, __i).out;
                      iterator __finish = std::copy(__pos._M_const_cast(),
-                                                   __end, __i);
+                                                   __end, __j);
                      this->_M_deallocate();
                      this->_M_impl._M_end_of_storage = __q + _S_nword(__len);
                      this->_M_impl._M_start = __start;
diff --git a/libstdc++-v3/include/bits/vector.tcc 
b/libstdc++-v3/include/bits/vector.tcc
index 4f4c366080be..acb2f5fca1e7 100644
--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -984,8 +984,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       {
        if (__pos == cend())
          {
+           const auto __ins_idx = size();
            append_range(std::forward<_Rg>(__rg));
-           return end();
+           return begin() + __ins_idx;
          }
 
        if constexpr (ranges::forward_range<_Rg>)
diff --git 
a/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/insert_range.cc
 
b/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/insert_range.cc
index 4f4835746ea4..5c65610667d5 100644
--- 
a/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/insert_range.cc
+++ 
b/libstdc++-v3/testsuite/23_containers/vector/bool/modifiers/insert/insert_range.cc
@@ -35,16 +35,22 @@ do_test()
   VERIFY( eq(v, a) );
   v.clear();
   v.shrink_to_fit();
-  v.insert_range(v.begin(), Range(a, a+3));
-  v.insert_range(v.end(), Range(a+6, a+9));
-  v.insert_range(v.begin()+3, Range(a+3, a+6));
+  auto it = v.insert_range(v.begin(), Range(a, a+3));
+  VERIFY( it == v.begin() );
+  it = v.insert_range(v.end(), Range(a+6, a+9));
+  VERIFY( it == v.begin()+3 );
+  it = v.insert_range(v.begin()+3, Range(a+3, a+6));
+  VERIFY( it == v.begin()+3 );
   VERIFY( eq(v, a) );
   v.resize(3);
-  v.insert_range(v.begin()+1, Range(a+4, a+9));
-  v.insert_range(v.begin()+1, Range(a+1, a+4));
+  it = v.insert_range(v.begin()+1, Range(a+4, a+9));
+  VERIFY( it == v.begin()+1 );
+  it = v.insert_range(v.begin()+1, Range(a+1, a+4));
+  VERIFY( it == v.begin()+1 );
   v.resize(9);
   VERIFY( eq(v, a) );
-  v.insert_range(v.begin(), Range(a, a));
+  it = v.insert_range(v.begin(), Range(a, a));
+  VERIFY( it == v.begin() );
   VERIFY( eq(v, a) );
 }
 
diff --git 
a/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/insert_range.cc 
b/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/insert_range.cc
index 68218e94f28b..590714351267 100644
--- 
a/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/insert_range.cc
+++ 
b/libstdc++-v3/testsuite/23_containers/vector/modifiers/insert/insert_range.cc
@@ -39,16 +39,22 @@ do_test()
   VERIFY( eq(v, a) );
   v.clear();
   v.shrink_to_fit();
-  v.insert_range(v.begin(), Range(a, a+3));
-  v.insert_range(v.end(), Range(a+6, a+9));
-  v.insert_range(v.begin()+3, Range(a+3, a+6));
+  auto it = v.insert_range(v.begin(), Range(a, a+3));
+  VERIFY( it == v.begin() );
+  it = v.insert_range(v.end(), Range(a+6, a+9));
+  VERIFY( it == v.begin()+3 );
+  it = v.insert_range(v.begin()+3, Range(a+3, a+6));
+  VERIFY( it == v.begin()+3 );
   VERIFY( eq(v, a) );
   v.resize(3);
-  v.insert_range(v.begin()+1, Range(a+4, a+9));
-  v.insert_range(v.begin()+1, Range(a+1, a+4));
+  it = v.insert_range(v.begin()+1, Range(a+4, a+9));
+  VERIFY( it == v.begin()+1 );
+  it = v.insert_range(v.begin()+1, Range(a+1, a+4));
+  VERIFY( it == v.begin()+1 );
   v.resize(9);
   VERIFY( eq(v, a) );
-  v.insert_range(v.begin() + 6, Range(a, a));
+  it = v.insert_range(v.begin() + 6, Range(a, a));
+  VERIFY( it == v.begin() + 6 );
   VERIFY( eq(v, a) );
 }

Reply via email to