@@ -2319,7 +2319,7 @@ get_origin_and_offset_r (tree x, HOST_WIDE_INT *fldoff, HOST_WIDE_INT *fldsize,
if (byteoff < HOST_WIDE_INT_MAX
&& elbytes < HOST_WIDE_INT_MAX
- && byteoff / elbytes == idx)
+ && (elbytes == 0 || byteoff / elbytes == idx))
{
/* For in-bounds constant offsets into constant-sized arrays
bump up *OFF, and for what's likely arrays or structs of
new file mode 100644
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-Wall" } */
+
+struct A
+{
+ char a[0][0][0];
+};
+extern struct A b[][2];
+void f (void)
+{
+ __builtin_sprintf (b[0][0].a[1][0], "%s", b[0][0].a[1][0]); /* { dg-warning "past the end" } */
+ /* { dg-warning "overlaps destination" "" { target *-*-* } .-1 } */
+}