[Bug libstdc++/121789] std:uninitialized_move_n() and friends don't optimize to memcpy

"redi at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121789

--- Comment #13 from Jonathan Wakely <redi at gcc dot gnu.org> ---
When committed to trunk this caused a regression:
  | FAIL: g++.dg/torture/pr118521.C -O1  (test for excess errors)
See https://gcc.gnu.org/pipermail/gcc-regression/2026-May/083775.html for
discussion.

However, I don't see that on trunk now.

That test does still fail when backported to gcc-16 though:

Executing on host: /tmp/build16/gcc/testsuite/g++1/../../xg++
-B/tmp/build16/gcc/testsuite/g++1/../../ 
/home/test/src/gcc-16/gcc/testsuite/g++.dg/torture/pr118521.C   
-fdiagnostics-plain-output  -nostdinc++
-I/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu
-I/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include
-I/home/test/src/gcc-16/libstdc++-v3/libsupc++
-I/home/test/src/gcc-16/libstdc++-v3/include/backward
-I/home/test/src/gcc-16/libstdc++-v3/testsuite/util -fmessage-length=0   -O1 
-Wall  -S -o pr118521.s    (timeout = 300)
spawn -ignore SIGHUP /tmp/build16/gcc/testsuite/g++1/../../xg++
-B/tmp/build16/gcc/testsuite/g++1/../../
/home/test/src/gcc-16/gcc/testsuite/g++.dg/torture/pr118521.C
-fdiagnostics-plain-output -nostdinc++
-I/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/x86_64-pc-linux-gnu
-I/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include
-I/home/test/src/gcc-16/libstdc++-v3/libsupc++
-I/home/test/src/gcc-16/libstdc++-v3/include/backward
-I/home/test/src/gcc-16/libstdc++-v3/testsuite/util -fmessage-length=0 -O1
-Wall -S -o pr118521.s
In file included from
/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/vector:67,
                 from
/home/test/src/gcc-16/gcc/testsuite/g++.dg/torture/pr118521.C:5: 
In function '_ForwardIterator std::uninitialized_fill_n(_ForwardIterator,
_Size, const _Tp&) [with _ForwardIterator = char*; _Size = long unsigned int;
_Tp = char]',
    inlined from 'constexpr _ForwardIterator
std::__uninitialized_fill_n_a(_ForwardIterator, _Size, const _Tp&,
allocator<_Tp>&) [with _ForwardIterator = char*; _Size = long unsigned int; _Tp
= char; _Tp2 = char]' at
/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_uninitialized.h:778:39,
    inlined from 'constexpr void std::vector<_Tp,
_Alloc>::_M_fill_append(size_type, const value_type&) [with _Tp = char; _Alloc
= std::allocator<char>]' at
/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/vector.tcc:776:36,
    inlined from 'constexpr void std::vector<_Tp,
_Alloc>::_M_fill_insert(iterator, size_type, const value_type&) [with _Tp =
char; _Alloc = std::allocator<char>]' at
/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/vector.tcc:668:20,
    inlined from 'constexpr std::vector<_Tp, _Alloc>::iterator std::vector<_Tp,
_Alloc>::insert(const_iterator, size_type, const value_type&) [with _Tp = char;
_Alloc = std::allocator<char>]' at
/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_vector.h:1565:16, 
    inlined from 'void foo()' at
/home/test/src/gcc-16/gcc/testsuite/g++.dg/torture/pr118521.C:12:11:
/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_uninitialized.h:577:39:
warning: 'void* __builtin_memset(void*, int, long unsigned int)' offset [2, 3]
is out of the bounds [0, 2] [-Warray-bounds=]
PASS: g++.dg/torture/pr118521.C   -O1   at line 5 (test for bogus messages,
line )
FAIL: g++.dg/torture/pr118521.C   -O1  (test for excess errors)
Excess errors:
/tmp/build16/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_uninitialized.h:577:39:
warning: 'void* __builtin_memset(void*, int, long unsigned int)' offset [2, 3]
is out of the bounds [0, 2] [-Warray-bounds=]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.