Hi,
I am working on how to improve "restrict". I noticed 
that my changes lead to failure of pr38212. After looking
at its code, I think the test may not be valid according
to c99 standard.

C99 standard 6.7.3.1: 

EXAMPLE 4 The rule limiting assignments between restricted pointers does not 
distinguish between a
function call and an equivalent nested block. With one exception, only 
''outer-to-inner'' assignments
between restricted pointers declared in nested blocks have defined behavior.
{
  int * restrict p1;
  int * restrict q1;
  p1 = q1; // undefined behavior
  {
    int * restrict p2 = p1; // valid
    int * restrict q2 = q1; // valid
    p1 = q2; // undefined behavior
    p2 = q2; // undefined behavior
  }
}

pr38212.c
int __attribute__((noinline))
foo (int *__restrict p, int i)
{
  int *__restrict q;
  int *__restrict r;
  int v, w;
  q = p + 1;
  r = q - i;
  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;
}

Isn't that "r = q - i" undefined?  "q = p + 1" may be also undefined,
depending whether we regard parameter p from outer or inner block. 

Cheers,
Bingfeng

Reply via email to