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

Reply via email to