1void f (int *p, int **q)
2{
3  int i;
4  for (i = 0; i < 40; i++)
5    {
6      *q++ = &p[i];
7    }
8}
9
10int main ()
11{
12  void *p;
13  int *q[40];
14  __SIZE_TYPE__ start;
15
16  /* Find the signed middle of the address space.  */
17  if (sizeof(start) == sizeof(int))
18    start = (__SIZE_TYPE__) __INT_MAX__;
19  else if (sizeof(start) == sizeof(long))
20    start = (__SIZE_TYPE__) __LONG_MAX__;
21  else if (sizeof(start) == sizeof(long long))
22    start = (__SIZE_TYPE__) __LONG_LONG_MAX__;
23  else
24    return 0;
25
26  /* Arbitrarily align the pointer.  */
27  start &= -32;
28
29  /* Pretend that's good enough to start address arithmetic.  */
30  p = (void *)start;
31
32  /* Verify that GIV replacement computes the correct results.  */
33  q[39] = 0;
34  f (p, q);
35  if (q[39] != (int *)p + 39)
36    abort ();
37
38  return 0;
39}
40