[Bug lto/88140] [9 Regression] ICE: verify_gimple failed since r266325

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Nov 27 08:32:00 GMT 2018


Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
                 CC|                            |jsm28 at gcc dot gnu.org

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Hmm, no.  But somehow re-building the array type yields TYPE_SIZE == NULL_TREE
rather than TYPE_SIZE == integer_zero_node.

That happens in

Old value = <tree 0x0>
New value = <integer_cst 0x7ffff687ad08>
grokdeclarator (declarator=0x3028700, declspecs=0x30285a0, decl_context=FIELD, 
    initialized=false, width=0x0, decl_attrs=0x7fffffffd518, 
    expr=0x7fffffffd2d0, expr_const_operands=0x7fffffffd2cf, 
    at /space/rguenther/src/gcc-sccvn/gcc/c/c-decl.c:6397
6397                        TYPE_SIZE_UNIT (type) = size_zero_node;

                /* The GCC extension for zero-length arrays differs from
                   ISO flexible array members in that sizeof yields
                   zero.  */
                if (size && integer_zerop (size))
                    gcc_assert (itype);
                    type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type));
                    TYPE_SIZE (type) = bitsize_zero_node;
                    TYPE_SIZE_UNIT (type) = size_zero_node;
                    SET_TYPE_STRUCTURAL_EQUALITY (type);

and this overrides what layout_type does.

The cleanest fix would be to add a type flag ARRAY_TYPE_ZERO_LENGTH but then
the odd thing is that adjusting the domain to be [0, -1] instead of [0, ]
would probably make layout_type do the same decision?!

For the free-lang-data regression the following is a simple fix which I am
testing now:

diff --git a/gcc/tree.c b/gcc/tree.c
index 39a92464414..a39e611292a 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -5201,6 +5201,15 @@ fld_process_array_type (tree t, tree t2, hash_map<tree,
tree> *map,
       array = build_array_type_1 (t2, TYPE_DOMAIN (t),
                                  TYPE_TYPELESS_STORAGE (t), false);
+      /* Re-building the array via build_array_type_1 causes the C FE
+         special-handling of zero-length arrays to be dropped.  So
+        we copy back TYPE_SIZE[_UNIT] from the original type here
+        if layout_type decided the type is incomplete.  */
+      if (!TYPE_SIZE (array))
+       {
+         TYPE_SIZE (array) = TYPE_SIZE (t);
+         TYPE_SIZE_UNIT (array) = TYPE_SIZE_UNIT (t);
+       }
       add_tree_to_fld_list (array, fld);
   return array;

More information about the Gcc-bugs mailing list