The following makes us skip zero-sized fields when encoding
aggregate constructors to avoid ICEing when recursing with size == 0.

Bootstrapped and tested on x86_64-unknown-linux-gnu, ok?

Thanks,
Richard.

2016-05-06  Richard Biener  <rguent...@suse.de>

        PR middle-end/70931
        * dwarf2out.c (native_encode_initializer): Skip zero-sized fields.

        * gfortran.dg/pr70931.f90: New testcase.

Index: gcc/dwarf2out.c
===================================================================
*** gcc/dwarf2out.c     (revision 235859)
--- gcc/dwarf2out.c     (working copy)
*************** native_encode_initializer (tree init, un
*** 17806,17812 ****
              fieldsize = tree_to_shwi (DECL_SIZE_UNIT (field));
              pos = int_byte_position (field);
              gcc_assert (pos + fieldsize <= size);
!             if (val
                  && !native_encode_initializer (val, array + pos, fieldsize))
                return false;
            }
--- 17806,17812 ----
              fieldsize = tree_to_shwi (DECL_SIZE_UNIT (field));
              pos = int_byte_position (field);
              gcc_assert (pos + fieldsize <= size);
!             if (val && fieldsize != 0
                  && !native_encode_initializer (val, array + pos, fieldsize))
                return false;
            }
Index: gcc/testsuite/gfortran.dg/pr70931.f90
===================================================================
*** gcc/testsuite/gfortran.dg/pr70931.f90       (revision 0)
--- gcc/testsuite/gfortran.dg/pr70931.f90       (working copy)
***************
*** 0 ****
--- 1,10 ----
+ ! { dg-do compile }
+ ! { dg-options "-g" }
+ program p
+    type t
+       integer :: a
+       integer :: b(0)
+    end type
+    type(t), parameter :: z = t(1, [2])
+    print *, z
+ end

Reply via email to