diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2016-10-05 21:14:14 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2016-10-05 21:14:14 +0000 |
commit | 50b01e1d461c4aeab4eaadc1e861517564a6db29 (patch) | |
tree | 60dcb3118b8b4ff2e6daeaa2a2f3a83a264dd270 /gcc/fortran/resolve.c | |
parent | 908b82964e0985f2f97e5848ba10cda7e77ce8cb (diff) | |
download | gcc-50b01e1d461c4aeab4eaadc1e861517564a6db29.zip gcc-50b01e1d461c4aeab4eaadc1e861517564a6db29.tar.gz gcc-50b01e1d461c4aeab4eaadc1e861517564a6db29.tar.bz2 |
re PR fortran/58991 (ICE with associate and character string constant)
2016-10-05 Steven G. Kargl <kargls@gcc.gnu.org>
PR fortran/58991
PR fortran/58992
* resolve.c (resolve_assoc_var): Fix CHARACTER type-spec for a
selector in ASSOCIATE.
(resolve_fl_variable): Skip checks for an ASSOCIATE variable.
2016-10-05 Steven G. Kargl <kargls@gcc.gnu.org>
PR fortran/58991
PR fortran/58992
* gfortran.dg/associate_22.f90: New test.
From-SVN: r240812
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index ddd9d74..4645b57 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -8304,6 +8304,18 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) /* Mark this as an associate variable. */ sym->attr.associate_var = 1; + /* Fix up the type-spec for CHARACTER types. */ + if (sym->ts.type == BT_CHARACTER && !sym->attr.select_type_temporary) + { + if (!sym->ts.u.cl) + sym->ts.u.cl = target->ts.u.cl; + + if (!sym->ts.u.cl->length) + sym->ts.u.cl->length + = gfc_get_int_expr (gfc_default_integer_kind, + NULL, target->value.character.length); + } + /* If the target is a good class object, so is the associate variable. */ if (sym->ts.type == BT_CLASS && gfc_expr_attr (target).class_ok) sym->attr.class_ok = 1; @@ -11577,7 +11589,7 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag) if (!deferred_requirements (sym)) return false; - if (sym->ts.type == BT_CHARACTER) + if (sym->ts.type == BT_CHARACTER && !sym->attr.associate_var) { /* Make sure that character string variables with assumed length are dummy arguments. */ |