1/* { dg-do run } */
2/* { dg-skip-if "" { *-*-* } { "*" } { "-O2" } } */
3/* { dg-options "-fsanitize=object-size -fno-sanitize-recover=object-size" } */
4
5/* Test valid uses.  */
6
7#define N 20
8
9__attribute__((noinline, noclone)) void
10f1 (int i)
11{
12  volatile int j;
13  char *p, *orig;
14  orig = p = (char *) __builtin_calloc (N, 1);
15  j = *(p + i);
16  j = p[i];
17  p++;
18  j = p[i - 1];
19  j = *(p + i - 1);
20  __builtin_free (orig);
21}
22
23__attribute__((noinline, noclone)) void
24f2 (int i)
25{
26  volatile int j;
27  char a[N];
28  __builtin_memset (a, 0, N);
29  j = *(a + i);
30  char *p = a;
31  j = *(p + i);
32  j = p[i];
33  p += 10;
34  j = *(p + i - 10);
35  j = p[i - 10];
36}
37
38__attribute__((noinline, noclone)) void
39f3 (int i)
40{
41  volatile int j;
42  int *p = (int *) __builtin_calloc (N, sizeof (*p));
43  int *o = &p[i];
44  j = *o;
45  j = o[0];
46  __builtin_free (p);
47}
48
49int
50main ()
51{
52  f1 (N - 1);
53  f2 (N - 1);
54  f3 (N - 1);
55  return 0;
56}
57