1 /* { dg-do run } */
2 /* { dg-skip-if "" { *-*-* } { "*" } { "-O2" } } */
3 /* { dg-options "-fsanitize=object-size" } */
4 
5 /* Test structures with -fsanitize=object-size.  */
6 
7 #define N 20
8 
9 struct S { char *p; int i; };
10 struct T { struct S *s; };
11 
12 __attribute__((noinline, noclone)) void
f1(int i)13 f1 (int i)
14 {
15   volatile int j;
16   struct S s;
17   s.p = (char *) __builtin_calloc (N, 1);
18   j = s.p[i];
19   j = *(s.p + i);
20   __builtin_free (s.p);
21 }
22 
23 /* { dg-output "load of address \[^\n\r]* with insufficient space for an object of type 'char'\[^\n\r]*(\n|\r\n|\r)" } */
24 /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
25 /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
26 /* { dg-output "\[^\n\r]*\\^\[^\n\r]*(\n|\r\n|\r)" } */
27 /* { dg-output "\[^\n\r]*load of address \[^\n\r]* with insufficient space for an object of type 'char'\[^\n\r]*(\n|\r\n|\r)" } */
28 /* { dg-output "\[^\n\r]*note: pointer points here\[^\n\r]*(\n|\r\n|\r)" } */
29 /* { dg-output "\[^\n\r]*\[^\n\r]*(\n|\r\n|\r)" } */
30 /* { dg-output "\[^\n\r]*\\^" } */
31 
32 int
main()33 main ()
34 {
35   f1 (N);
36   f1 (N - 1);
37   return 0;
38 }
39