Richard Guenther <[EMAIL PROTECTED]> writes: > int foo (int *__restrict p) > { > int *__restrict q; > int v; > q = p + 1; > q = q - 1; > v = *q; > *p = 1; > return v + *q; > } > extern void abort (void); > int main() > { > int i = 0; > if (foo (&i) != 1) > abort (); > return 0; > }
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. 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. Your program clearly violates that guideline. Ian