https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99348

anlauf at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |anlauf at gcc dot gnu.org

--- Comment #3 from anlauf at gcc dot gnu.org ---
There's no ICE when x is scalar:

   type(t), parameter :: x = t('abc')

With the following patch we avoid the NULL pointer dereference at
resolve.c:1286

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 1c9b0c5cb62..0b9e11cdd41 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -1282,7 +1282,7 @@ resolve_structure_cons (gfc_expr *expr, int init)
   /* A constructor may have references if it is the result of substituting a
      parameter variable.  In this case we just pull out the component we
      want.  */
-  if (expr->ref)
+  if (expr->ref && expr->ref->u.c.sym)
     comp = expr->ref->u.c.sym->components;
   else
     comp = expr->ts.u.derived->components;

but later run into an issue at expr.c:1917:

1913                      for (c = gfc_constructor_first
(p->value.constructor);
1914                           c; c = gfc_constructor_next (c))
1915                        {
1916                          c->expr->ref = gfc_copy_ref (p->ref->next);
1917                          if (!simplify_const_ref (c->expr))
1918                            return false;
1919                        }

(gdb) p c->expr->ts.u.cl->length
$104 = (gfc_expr *) 0x0
(gdb) p c->expr->value.character.length 
$105 = 3

This leads to an ICE during processing simplify_const_ref.

Reply via email to