https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62171
--- Comment #9 from rguenther at suse dot de <rguenther at suse dot de> --- On Tue, 22 Sep 2015, vries at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62171 > > --- Comment #8 from vries at gcc dot gnu.org --- > (In reply to Richard Biener from comment #7) > > I was thinking about sth like > > > > struct X { int i; int * __restrict__ q; }; > > > > int foo (X& __restrict__ x, X *p) > > { > > *x.q = 1; > > p->i = 0; > > return *x.q; > > } > > > > int main() > > { > > X x; > > x.q = &x.i; > > return foo (x, &x); > > } > > > > I think this example's an invalid use of restrict. > > By using restrict in the 'X& __restrict__ x' parameter of foo, we promise that > if the object x points to is modified during foo execution (and it is, by both > assignments) we only access the object using pointers based on x during foo > execution. > > p is pointing to the same object, and we access the object via p. But p is not > based on x. Sorry, I modified it bogously, just move int i; out of the struct and somewhere else. My concerns boil down to X being passed twice, once as reference and once as pointer. The PTA machinery will then use restrict for X.q for the reference case but not for the pointer case. I believe C doesn't specify what happens for these "indirect" cases (nor for what happens for global restricts). To behave "correctly" PTA would need to correlate q from both parameters.