1/* { dg-do run } */
2/* { dg-options "-fsanitize=bounds -Wall -Wextra" } */
3
4/* Test off-by-one.  */
5
6struct S { int a; int b; } s[4], *t;
7struct U { int a[10]; } u[4], *v;
8volatile int *a, *b, *c;
9volatile void *d;
10volatile int e[4][4];
11
12int
13main (void)
14{
15  t = &s[4];  // OK
16  a = &s[4].a; // Error
17  b = &s[4].b; // Error
18  d = &e[4];  // OK
19  c = &e[4][0]; // Error
20  c = &e[3][4]; // OK
21  c = &e[3][3]; // OK
22
23  a = &u[4].a[9]; // Error
24  a = &u[4].a[10]; // Error
25  a = &u[3].a[9]; // OK
26  a = &u[3].a[10]; // OK
27  a = &u[3].a[11]; // Error
28
29  return 0;
30}
31
32/* { dg-output "index 4 out of bounds for type 'S \\\[4\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
33/* { dg-output "\[^\n\r]*index 4 out of bounds for type 'S \\\[4\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
34/* { dg-output "\[^\n\r]*index 4 out of bounds for type 'int \\\[4\\\]\\\[4\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
35/* { dg-output "\[^\n\r]*index 4 out of bounds for type 'U \\\[4\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
36/* { dg-output "\[^\n\r]*index 4 out of bounds for type 'U \\\[4\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
37/* { dg-output "\[^\n\r]*index 11 out of bounds for type 'int \\\[10\\\]'" } */
38