Hello world, the attached patch fixes an ICE where an array constructor containing an empty array constructor with a type didn't get the type from the inner constructor.
The solution is to stash the type away in yet another variable and only use it if the constructor turns out to be empty, and the type has not been set some other way. Regression-tested. OK for trunk? Regards Thomas Save typespec for empty array constructor. 2020-01-02 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/65428 * array.c (empty_constructor): New variable. (empty_ts): New variable. (expand_constructor): Save typespec in empty_ts. Unset empty_constructor if there is an element. (gfc_expand_constructor): Initialize empty_constructor and empty_ts. If there was no explicit constructor type and the constructor is empty, take the type from empty_ts. 2020-01-02 Thomas Koenig <tkoe...@gcc.gnu.org> PR fortran/65428 * gfortran.dg/zero_sized_11.f90: New test.
Index: array.c =================================================================== --- array.c (Revision 279821) +++ array.c (Arbeitskopie) @@ -1759,7 +1759,12 @@ cleanup: return t; } +/* Variables for noticing if all constructors are empty, and + if any of them had a type. */ +static bool empty_constructor; +static gfc_typespec empty_ts; + /* Expand a constructor into constant constructors without any iterators, calling the work function for each of the expanded expressions. The work function needs to either save or free the @@ -1782,6 +1787,9 @@ expand_constructor (gfc_constructor_base base) e = c->expr; + if (empty_constructor) + empty_ts = e->ts; + if (e->expr_type == EXPR_ARRAY) { if (!expand_constructor (e->value.constructor)) @@ -1790,6 +1798,7 @@ expand_constructor (gfc_constructor_base base) continue; } + empty_constructor = false; e = gfc_copy_expr (e); if (!gfc_simplify_expr (e, 1)) { @@ -1873,6 +1882,8 @@ gfc_expand_constructor (gfc_expr *e, bool fatal) iter_stack = NULL; + empty_constructor = true; + gfc_clear_ts (&empty_ts); current_expand.expand_work_function = expand; if (!expand_constructor (e->value.constructor)) @@ -1882,6 +1893,13 @@ gfc_expand_constructor (gfc_expr *e, bool fatal) goto done; } + /* If we don't have an explicit constructor type, and there + were only empty constructors, then take the type from + them. */ + + if (constructor_ts.type == BT_UNKNOWN && empty_constructor) + e->ts = empty_ts; + gfc_constructor_free (e->value.constructor); e->value.constructor = current_expand.base;
! { dg-do compile } ! PR 65428 - this used to ICE. Original test case by FX Coudert. program p integer :: i print *, [shape(1)] print *, [[ integer :: ]] print *, (/ (/ (i, i=1,0) /) /) end