https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117046
Bug ID: 117046
Summary: -Wclass-memaccess provides misleading diagnostics on
std::memcpy
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: carlosgalvezp at gmail dot com
Target Milestone: ---
Consider this example:
#include <array>
#include <cstring>
struct Foo
{
int a{123};
};
void f()
{
Foo dst{};
std::array<unsigned char, 4> bytes{};
std::memcpy(&dst, &bytes, sizeof(dst)); // NOK
std::memcpy(&dst, bytes.data(), sizeof(dst)); // OK
}
https://godbolt.org/z/6hEfa9cd5
Here, GCC complains with following diagnostic:
copying an object of non-trivial type 'struct Foo' ...
It sounds therefore like the problem is that "Foo" is non-trivial. But that's
not actually the problem; std::memcpy accepts non-trivial types, as long as
they are trivially copyable. This is clear from the line below.
The problem was in passing &bytes instead of bytes.data().
Would it be possible to improve the diagnostic?
Thanks!