Hi,

> This program appears to me to be invalid according to C99 6.7.3.1,
> which is the only definition of restrict that we have.
> 
>     If P is assigned the value of a pointer expression E that is based
>     on another restricted pointer object P2, associated with block B2,
>     then either the execution of B2 shall begin before the execution
>     of B, or the execution of B2 shall end prior to the assignment.
>     If these requirements are not met, then the behavior is undefined.
> 
> In your program, P is q and P2 is p.  Block B and B2 are the same
> block: the only block in foo.  It is obviously not the case that the
> block executes before itself.  So I believe the assignment "q = p + 1"
> is undefined behaviour.

But the testcases in the PR can easily be transformed to fulfill this 
requirement.  E.g.:

int __attribute__((noinline))
foo (int *__restrict p, int i)
{
  if (1)
    {
      int *__restrict q = p + 1;
      if (1)
        {
          int *__restrict r = q - i;
          int v, w;
          v = *r;
          *p = 1;
          w = *r;
          return v + w;
        }
    }
}
extern void abort (void);
int main()
{
  int i = 0;
  if (foo (&i, 1) != 1)
    abort ();
  return 0;
}

This (and the other testcases similarly changed) still break.

> More generally, as I understand the restrict qualifier, it means that
> if two pointers both have the restrict qualifier, and you use one of
> the pointers to modify an object, you may not use the other pointer to
> access that object.

Can you deduce this from the standard?


Ciao,
Michael.

Reply via email to