diff options
author | Louis Krupp <louis.krupp@zoho.com> | 2015-10-06 23:47:18 +0000 |
---|---|---|
committer | Louis Krupp <lkrupp@gcc.gnu.org> | 2015-10-06 23:47:18 +0000 |
commit | 58864d1c7a4f6ae4642c6d8fd93b52b7586893ac (patch) | |
tree | 284a952dbaa2d667bb8889bd480e3f2c06d5415a /gcc/fortran/resolve.c | |
parent | c12df35927747bd91c0a2d0ffce030f2cdb9f722 (diff) | |
download | gcc-58864d1c7a4f6ae4642c6d8fd93b52b7586893ac.zip gcc-58864d1c7a4f6ae4642c6d8fd93b52b7586893ac.tar.gz gcc-58864d1c7a4f6ae4642c6d8fd93b52b7586893ac.tar.bz2 |
[multiple changes]
2015-10-06 Louis Krupp <louis.krupp@zoho.com>
PR fortran/65766
* resolve.c (gfc_resolve_substring_charlen): For derived type,
use typespec of string component when resolving substring length.
2015-10-06 Louis Krupp <louis.krupp@zoho.com>
PR fortran/65766
* gfortran.dg/substr_alloc_string_comp_1.f90: New.
From-SVN: r228551
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index e75c293..50b5c1d 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -4543,10 +4543,15 @@ gfc_resolve_substring_charlen (gfc_expr *e) { gfc_ref *char_ref; gfc_expr *start, *end; + gfc_typespec *ts = NULL; for (char_ref = e->ref; char_ref; char_ref = char_ref->next) - if (char_ref->type == REF_SUBSTRING) - break; + { + if (char_ref->type == REF_SUBSTRING) + break; + if (char_ref->type == REF_COMPONENT) + ts = &char_ref->u.c.component->ts; + } if (!char_ref) return; @@ -4576,7 +4581,11 @@ gfc_resolve_substring_charlen (gfc_expr *e) if (char_ref->u.ss.end) end = gfc_copy_expr (char_ref->u.ss.end); else if (e->expr_type == EXPR_VARIABLE) - end = gfc_copy_expr (e->symtree->n.sym->ts.u.cl->length); + { + if (!ts) + ts = &e->symtree->n.sym->ts; + end = gfc_copy_expr (ts->u.cl->length); + } else end = NULL; |