https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62171
--- Comment #11 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 #10 from vries at gcc dot gnu.org --- > (In reply to rguent...@suse.de from comment #9) > > 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. > > I don't understand. My reasoning above has nothing to do with 'int i'. > > > My concerns boil down to X being passed twice, > > once as reference and once as pointer. > > That's exactly the thing I was trying to point out as illegal use of restrict. > Let me try again, with variables renamed for clarity: > > struct X { int i; int * __restrict__ q; }; > > int foo (X& __restrict__ foox, X *foop) > { > *foox.q = 1; > foop->i = 0; > return *foox.q; > } > > int main() > { > X mainx; > mainx.q = &mainx.i; > return foo (mainx, &mainx); > } > > By: > - using restrict for the foox parameter of foo, and > - modifing object mainx during foo execution > we promise that we only access the object mainx using pointers based on foox > during foo execution. > > However, we access mainx via foop in foo, and foop is not based on foox. Hmm, indeed. I guess we're fine then and could lift the restriction even more via Index: gcc/tree-ssa-structalias.c =================================================================== --- gcc/tree-ssa-structalias.c (revision 228010) +++ gcc/tree-ssa-structalias.c (working copy) @@ -5857,9 +5953,8 @@ intra_create_variable_infos (struct func /* For restrict qualified pointers to objects passed by reference build a real representative for the pointed-to object. Treat restrict qualified references the same. */ - if (TYPE_RESTRICT (TREE_TYPE (t)) - && ((DECL_BY_REFERENCE (t) && POINTER_TYPE_P (TREE_TYPE (t))) - || TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE) + if (POINTER_TYPE_P (TREE_TYPE (t)) + && TYPE_RESTRICT (TREE_TYPE (t)) && !type_contains_placeholder_p (TREE_TYPE (TREE_TYPE (t)))) { struct constraint_expr lhsc, rhsc;