Fix __builtin_clear_padding for empty struct.
authorMartin Liska <mliska@suse.cz>
Wed, 2 Dec 2020 08:44:40 +0000 (09:44 +0100)
committerMartin Liska <mliska@suse.cz>
Wed, 2 Dec 2020 10:32:54 +0000 (11:32 +0100)
gcc/ChangeLog:

PR c/98087
* gimple-fold.c (clear_padding_type): Do not divide by zero.

gcc/testsuite/ChangeLog:

PR c/98087
* gcc.c-torture/compile/pr98087.c: New test.

gcc/gimple-fold.c
gcc/testsuite/gcc.c-torture/compile/pr98087.c [new file with mode: 0644]

index 1f3d80e288187301b37aafc8747c4b3daf2dc916..ab74494703a0efb319e107451607090fba94c21d 100644 (file)
@@ -4552,6 +4552,8 @@ clear_padding_type (clear_padding_struct *buf, tree type, HOST_WIDE_INT sz)
     case ARRAY_TYPE:
       HOST_WIDE_INT nelts, fldsz;
       fldsz = int_size_in_bytes (TREE_TYPE (type));
+      if (fldsz == 0)
+       break;
       nelts = sz / fldsz;
       if (nelts > 1
          && sz > 8 * UNITS_PER_WORD
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr98087.c b/gcc/testsuite/gcc.c-torture/compile/pr98087.c
new file mode 100644 (file)
index 0000000..8cac770
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR c/98087 */
+
+struct S { char a; long long b; };
+struct T { struct S c[0]; char d; };
+void foo (int n)
+{
+  struct S a[n][0];
+  __builtin_clear_padding (a);
+  __builtin_clear_padding (&a);
+  struct S b[7][0];
+  __builtin_clear_padding (&b);
+  struct T c;
+  __builtin_clear_padding (&c);
+}