From 1f6c19f307c8de9830130a0ba071c24e3835beb3 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 28 Mar 2025 15:41:41 +0000 Subject: [PATCH] libstdc++: Fix -Wstringop-overread warning in std::vector [PR114758] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As in r13-4393-gcca06f0d6d76b0 and a few other commits, we can avoid bogus warnings in std::vector by hoisting some loads to before the allocation that calls operator new. This means that the compiler has enough info to remove the dead branches that trigger bogus warnings. On trunk this is only needed with -fno-assume-sane-operators-new-delete but it will help on the branches where that option doesn't exist. libstdc++-v3/ChangeLog: PR libstdc++/114758 * include/bits/vector.tcc (vector::_M_fill_insert): Hoist loads of begin() and end() before allocation. * testsuite/23_containers/vector/bool/capacity/114758.cc: New test. Reviewed-by: Tomasz KamiƄski --- libstdc++-v3/include/bits/vector.tcc | 5 +++-- .../23_containers/vector/bool/capacity/114758.cc | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 libstdc++-v3/testsuite/23_containers/vector/bool/capacity/114758.cc diff --git a/libstdc++-v3/include/bits/vector.tcc b/libstdc++-v3/include/bits/vector.tcc index f197278d52e..29aa63e4742 100644 --- a/libstdc++-v3/include/bits/vector.tcc +++ b/libstdc++-v3/include/bits/vector.tcc @@ -1134,11 +1134,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER { const size_type __len = _M_check_len(__n, "vector::_M_fill_insert"); + iterator __begin = begin(), __end = end(); _Bit_pointer __q = this->_M_allocate(__len); iterator __start(std::__addressof(*__q), 0); - iterator __i = _M_copy_aligned(begin(), __position, __start); + iterator __i = _M_copy_aligned(__begin, __position, __start); std::fill(__i, __i + difference_type(__n), __x); - iterator __finish = std::copy(__position, end(), + iterator __finish = std::copy(__position, __end, __i + difference_type(__n)); this->_M_deallocate(); this->_M_impl._M_end_of_storage = __q + _S_nword(__len); diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/114758.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/114758.cc new file mode 100644 index 00000000000..c56d50afddb --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/114758.cc @@ -0,0 +1,12 @@ +// { dg-options "-O3 -Werror=stringop-overread -fno-assume-sane-operators-new-delete" } +// { dg-do compile } + +// Bug libstdc++/114758 The layout of a std::vector reports a warning + +#include + +void pr114758(std::vector& v) +{ + v.resize(3); + v = std::vector(3, false); +}