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

--- Comment #2 from Janne Blomqvist <jb at gcc dot gnu.org> ---
Seems it's wrong at least to access value.character.length if the expression
isn't a constant? So,

diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index d1a2368..017b9f7 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -8628,9 +8628,17 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
        sym->ts.u.cl = target->ts.u.cl;

       if (!sym->ts.u.cl->length && !sym->ts.deferred)
-       sym->ts.u.cl->length
-         = gfc_get_int_expr (gfc_charlen_int_kind,
-                             NULL, target->value.character.length);
+       {
+         if (target->expr_type == EXPR_CONSTANT)
+           sym->ts.u.cl->length
+             = gfc_get_int_expr (gfc_charlen_int_kind,
+                                 NULL, target->value.character.length);
+         else
+           {
+             // What now?
+             // sym->ts.deferred = true; // Hack that doesn't quite work..
+           }
+       }
     }

   /* If the target is a good class object, so is the associate variable.  */

Reply via email to