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.