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. */