On 2/17/20 4:53 AM, Bruno Haible wrote: > Paul Eggert wrote: >> if GCC generated warnings for that sort of thing, the warnings would be false >> alarms. > > Yes, and this in turn means that the ability to produce useful warnings via > 'restrict' is limited. In this example: > =================================================================== > #include > extern void memmcpy (void *restrict, const void *restrict, size_t); > > void shuffle (char array[10]) > { > memmcpy (array + 2, array, 8); > memcpy (array + 2, array, 8); > } > =================================================================== > gcc gives no warning about 'memmcpy' - because it does not know > how many elements the function will access. gcc does give a warning > about 'memcpy' - apparently due to custom logic in the compiler. The following gives you a warning, with -O2 / -O3 and -Wall: =================================================================== #include void memmcpy (void *restrict d, void *restrict s, size_t n) { memcpy(d, s, n); } void shuffle () { char array[] = "abcdefg", *array2 = array + 2; memmcpy (array, array2 - 2, 8); } =================================================================== $ gcc-8 -O2 -Wall x.c In function ‘memmcpy’, inlined from ‘shuffle’ at x.c:11:3: x.c:4:3: warning: ‘memcpy’ accessing 8 bytes at offsets 0 and 0 overlaps 8 bytes at offset 0 [-Wrestrict] memcpy(d, s, n); ^~~~~~~~~~~~~~~ Regards, Tim