Hi,
On Thu, 13 Oct 2011, Jakub Jelinek wrote:
> On Thu, Oct 13, 2011 at 02:57:56PM +0200, Michael Matz wrote:
> > struct S {int * restrict p;};
> > void foo (struct S *s, struct S *t) {
> > s->p[0] = 0;
> > t->p[0] = 1; // undefined if s->p == t->p; the caller was responsible
> > // to not do that
>
> This is undefined only if s->p == t->p && &s->p != &t->p. If both
> s->p and t->p designate the same restricted pointer object,
> it is fine.
Yeah. But I continue to think that this reading is against the intent (or
should be). All the examples in the standard and rationale never say
anything about pointers to restricted objects and the problematic cases
one can construct with them, i.e. that one restricted pointer object might
have different names. That leads me to think that this aspect simply was
overlooked or thought to be irrelevant.
I'm leaning towards (for C) to ignore restrict qualifications on all
indirectly accessed or address-taken objects. Or better not to ignore the
restrict but make them conflict with all other pointers, restrict or
non-restrict (normally non-restrict and restrict don't conflict in
theory, although for GCC they do).
Ciao,
Michael.