On Fri, Mar 28, 2025 at 9:53 PM Jonathan Wakely <jwak...@redhat.com> wrote:
> As in r13-4393-gcca06f0d6d76b0 and a few other commits, we can avoid > bogus warnings in std::vector<bool> 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<bool, A>::_M_fill_insert): > Hoist loads of begin() and end() before allocation. > * testsuite/23_containers/vector/bool/capacity/114758.cc: New > test. > --- > > Tested x86_64-linux. > LGTM > > libstdc++-v3/include/bits/vector.tcc | 5 +++-- > .../23_containers/vector/bool/capacity/114758.cc | 10 ++++++++++ > 2 files changed, 13 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<bool>::_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..d069db86bc6 > --- /dev/null > +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/capacity/114758.cc > @@ -0,0 +1,10 @@ > +// { dg-options "-O3 -Werror=stringop-overread > -fno-assume-sane-operators-new-delete" } > +// { dg-do compile } > + > +#include <vector> > + > +void pr114758(std::vector<bool>& v) > +{ > + v.resize(3); > + v = std::vector<bool>(3, false); > +} > -- > 2.49.0 > >