On 12/2/20 11:11 AM, Jakub Jelinek wrote:
On Wed, Dec 02, 2020 at 10:25:32AM +0100, Martin Liška wrote:
It's a simple fix of a division by zero.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

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.

Ok, but can you extend the testcase a little bit to cover more cases?

--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr98087.c
@@ -0,0 +1,8 @@
+/* PR c/98087 */
+
+struct S {};
+void foo (int n)
+{
+  struct S a[n][0];
+  __builtin_clear_padding (a);
+}

Like:

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);
}

Without your patch we ICE on the first 3, the 4th not because the zero
length array satisfies is_empty_type.  For the &a case, I even thought
I do handle that (the if (eltsz) conditional), but unlike my expectations,
int_size_in_bytes of the VLA with zero sized elements is not -1, but 0.

Sure, thanks for improvement.

Pushed to master.
Martin


        Jakub


Reply via email to