1 /* { dg-do compile }
2    { dg-options "-O2 -Wall -Wextra -Warray-bounds -Wrestrict" } */
3 
4 typedef __SIZE_TYPE__ size_t;
5 
6 extern void* memcpy (void* restrict, const void* restrict, size_t);
7 
8 extern void sink (void*, ...);
9 
10 struct Data {
11   size_t n;
12   void *p;
13 };
14 
test_copy(void)15 void test_copy (void)
16 {
17   struct Data d;
18   sink (&d);
19 
20   char dp1[sizeof d + 1];
21   char d2x[2 * sizeof d];
22   char d2xp1[2 * sizeof d + 1];
23 
24   /* During development the following would incorrectly trigger:
25      warning: 'memcpy' forming offset [17, 25] is out of the bounds [0, 16]
26 	      of object ‘d’ with type 'struct Data' [-Warray-bounds]
27      that wasn't caught by the test suite.  Make sure it is.  */
28   memcpy (&dp1, d.p, sizeof dp1);       /* { dg-bogus "\\\[-Warray-bounds" } */
29 
30   /* Likewise.  */
31   memcpy (&d2x, d.p, sizeof d2x);       /* { dg-bogus "\\\[-Warray-bounds" } */
32   memcpy (&d2xp1, d.p, sizeof d2xp1);   /* { dg-bogus "\\\[-Warray-bounds" } */
33 
34   sink (&d, &dp1, &d2x, &d2xp1);
35 }
36