https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109849

--- Comment #35 from Jonathan Wakely <redi at gcc dot gnu.org> ---
(In reply to Jonathan Wakely from comment #31)
> Bisection points to r14-5831-gaae723d360ca26cd9fd0b039fb0a616bd0eae363 for
> that remaining FAIL as well (and it isn't fixed by the new patch).
> 
> It introduced a new warning which wasn't present before:
> 
> /tmp/build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_algobase.h:437:
> warning: 'void* __builtin_memcpy(void*, const void*, long unsigned int)'
> writing between 2 and 9223372036854775806 bytes into a region of size 0
> overflows the destination [-Wstringop-overflow=]

I don't know why we only get a warning for C++98 and not other modes, but this
seems to fix it:

--- a/libstdc++-v3/include/bits/vector.tcc
+++ b/libstdc++-v3/include/bits/vector.tcc
@@ -933,6 +933,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER

                const size_type __len =
                  _M_check_len(__n, "vector::_M_range_insert");
+               if (__len < (__n + (__old_finish - __old_start)))
+                 __builtin_unreachable();
+
                pointer __new_start(this->_M_allocate(__len));
                pointer __new_finish(__new_start);
                __try

So it looks like the compiler can't tell that _M_check_len(n) doesn't undergo
unsigned wraparound.

Reply via email to