https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116841
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |needs-bisection Known to fail| |14.2.1 Known to work| |15.0 Summary|[14/15 Regression] spurious |[14 Regression] spurious |-Warray-bounds=1 warning |-Warray-bounds=1 warning |when resizing + memcpy-ing |when resizing + memcpy-ing |into vector |into vector --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Trunk no longer warns (bisect?) for the small testcase. The larger testcase also warns with GCC 13 and -O3, but not -O2. Full testcase for reference: #include <array> #include <cstdio> #include <cstdint> #include <cstring> #include <vector> struct StreamWriter { private: std::vector<uint8_t> _buf; public: void putBytes(void const* buf, size_t n) { size_t const pos = _buf.size(); _buf.resize(pos+n); memcpy(_buf.data()+pos, buf, n); } void putByte(uint8_t v) { _buf.push_back(v); } void putVarint(uint32_t v) { if (v <= 0x7f) { putByte(v); } else { putByte((v >> 8) | 0x80); putByte(v & 0xff); } } std::vector<uint8_t> done() { return std::move(_buf); } }; struct Packet { uint32_t packetNumber = 0; std::array<uint8_t, 160> destinationConnectionId = {}; std::array<uint8_t, 160> sourceConnectionId = {}; }; std::vector<uint8_t> encode(Packet const& packet) { StreamWriter output; output.putVarint(packet.packetNumber); output.putBytes(packet.destinationConnectionId.data(), packet.destinationConnectionId.size()); output.putBytes(packet.sourceConnectionId.data(), packet.sourceConnectionId.size()); return output.done(); } int main(int, char const**) { encode(Packet()); }