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