diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/Warray-bounds-27.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/Warray-bounds-27.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-27.c b/gcc/testsuite/gcc.dg/Warray-bounds-27.c new file mode 100644 index 00000000000..98c9439bbf3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Warray-bounds-27.c @@ -0,0 +1,35 @@ +/* { dg-do compile } + { dg-options "-O2 -Wall -Wextra -Warray-bounds -Wrestrict" } */ + +typedef __SIZE_TYPE__ size_t; + +extern void* memcpy (void* restrict, const void* restrict, size_t); + +extern void sink (void*, ...); + +struct Data { + size_t n; + void *p; +}; + +void test_copy (void) +{ + struct Data d; + sink (&d); + + char dp1[sizeof d + 1]; + char d2x[2 * sizeof d]; + char d2xp1[2 * sizeof d + 1]; + + /* During development the following would incorrectly trigger: + warning: 'memcpy' forming offset [17, 25] is out of the bounds [0, 16] + of object ādā with type 'struct Data' [-Warray-bounds] + that wasn't caught by the test suite. Make sure it is. */ + memcpy (&dp1, d.p, sizeof dp1); /* { dg-bogus "\\\[-Warray-bounds" } */ + + /* Likewise. */ + memcpy (&d2x, d.p, sizeof d2x); /* { dg-bogus "\\\[-Warray-bounds" } */ + memcpy (&d2xp1, d.p, sizeof d2xp1); /* { dg-bogus "\\\[-Warray-bounds" } */ + + sink (&d, &dp1, &d2x, &d2xp1); +} |