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
>
>

Reply via email to