https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88140
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, deprecated_state=DEPRECATED_NORMAL) 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); TYPE_CANONICAL (array) = TYPE_CANONICAL (t); + /* 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;