The program below aborts at runtime when compiled by gcc 4.3.0 with option "-O2 -std=c99" (it runs correctly without optimization or when compiled with "icc -std=c99 -restrict"). I believe it should have defined behavior according to the standard (see e.g. PR14192), for p[0] and q[0] are not restricted pointers, and p[0][0] is based on p[0] but not p. Intuitively, p and q should behave like two different arrays of pointers, and we may well want to store aliasing pointers into them.
This is apparently due to the simplistic find_base_decl() in 4.3.0, which is quite different the standard's definition of "based on". If I understand correctly, for two pointers p and q, only when p is provably based on some restricted pointer p0 (along all control paths), and q is provably not based on it, can we be sure that a modification to *q can never change *p. >From a casual glance of the 4.3.0 source, it seems that "restrict" is not well supported by the tree passes, but the alias sets in the generated RTL make some use of it. Proper support, either at RTL or tree level, may mean a lot of work, but in the meantime we had better agree on the meaning of the standard and avoid generating wrong code :) ============================================== #include <stdlib.h> /* fail by gcc-4.3.0 */ void f(int **restrict p, int **restrict q) { p[0][0] = 1; q[0][0] = 2; if (p[0][0] != 2) abort(); } int main(void) { int a; int *p1 = &a, *p2 = &a; f(&p1, &p2); return 0; } -- Summary: Wrong code involving restricted pointers to non- restricted pointers Product: gcc Version: 4.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: rainy6144 at gmail dot com GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36013