1183840Sraj/* { dg-do run } */
2183840Sraj/* { dg-skip-if "" { *-*-* } { "*" } { "-O2" } } */
3183840Sraj/* { dg-options "-fsanitize=object-size -fno-sanitize-recover=object-size" } */
4183840Sraj
5183840Sraj/* Test valid uses.  */
6183840Sraj
7183840Sraj#define N 20
8183840Sraj
9183840Sraj__attribute__((noinline, noclone)) void
10183840Srajf1 (int i)
11183840Sraj{
12183840Sraj  volatile int j;
13183840Sraj  char *p, *orig;
14183840Sraj  orig = p = (char *) __builtin_calloc (N, 1);
15183840Sraj  j = *(p + i);
16183840Sraj  j = p[i];
17183840Sraj  p++;
18183840Sraj  j = p[i - 1];
19183840Sraj  j = *(p + i - 1);
20183840Sraj  __builtin_free (orig);
21183840Sraj}
22183840Sraj
23183840Sraj__attribute__((noinline, noclone)) void
24183840Srajf2 (int i)
25183840Sraj{
26183840Sraj  volatile int j;
27183840Sraj  char a[N];
28183840Sraj  __builtin_memset (a, 0, N);
29183840Sraj  j = *(a + i);
30183840Sraj  char *p = a;
31183840Sraj  j = *(p + i);
32183840Sraj  j = p[i];
33183840Sraj  p += 10;
34183840Sraj  j = *(p + i - 10);
35183840Sraj  j = p[i - 10];
36183840Sraj}
37183840Sraj
38183840Sraj__attribute__((noinline, noclone)) void
39183840Srajf3 (int i)
40183840Sraj{
41183840Sraj  volatile int j;
42183840Sraj  int *p = (int *) __builtin_calloc (N, sizeof (*p));
43183840Sraj  int *o = &p[i];
44183840Sraj  j = *o;
45183840Sraj  j = o[0];
46183840Sraj  __builtin_free (p);
47183840Sraj}
48183840Sraj
49183840Srajint
50183840Srajmain ()
51183840Sraj{
52183840Sraj  f1 (N - 1);
53183840Sraj  f2 (N - 1);
54183840Sraj  f3 (N - 1);
55183840Sraj  return 0;
56183840Sraj}
57183840Sraj