https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86196
Bug ID: 86196 Summary: Bogus -Wrestrict on memcpy Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: sbergman at redhat dot com Target Milestone: --- With recent trunk (on Linux x86_64), and doesn't seem to be covered by existing bugs referenced from meta bug 84774: > $ gcc --version > gcc (GCC) 9.0.0 20180618 (experimental) > Copyright (C) 2018 Free Software Foundation, Inc. > This is free software; see the source for copying conditions. There is NO > warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. > $ cat test.c > #include <string.h> > struct S { > int n; > void * p; > }; > void f(struct S * a, size_t n) { > size_t i = 0, j = 0; > for (; i != n; ++i) { > if (a[i].n == 0) { > if (i != j) { > memcpy(&a[j], &a[i], sizeof (struct S)); > } > ++j; > } > } > } > $ gcc -Wall -c test.c > test.c: In function ‘f’: > test.c:11:17: warning: ‘memcpy’ accessing 16 bytes at offsets [0, 8] and [0, > 8] overlaps between 8 and 16 bytes at offset [0, 8] [-Wrestrict] > memcpy(&a[j], &a[i], sizeof (struct S)); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Also, I do not understand what that "offset [0, 8]" notation is supposed to mean.