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.