diff options
Diffstat (limited to 'gcc/fortran/trans-expr.c')
-rw-r--r-- | gcc/fortran/trans-expr.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 3cd2ffa..19fb16f 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1824,6 +1824,7 @@ gfc_get_expr_charlen (gfc_expr *e) { gfc_ref *r; tree length; + gfc_se se; gcc_assert (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER); @@ -1859,9 +1860,20 @@ gfc_get_expr_charlen (gfc_expr *e) /* Do nothing. */ break; + case REF_SUBSTRING: + gfc_init_se (&se, NULL); + gfc_conv_expr_type (&se, r->u.ss.start, gfc_charlen_type_node); + length = se.expr; + gfc_conv_expr_type (&se, r->u.ss.end, gfc_charlen_type_node); + length = fold_build2_loc (input_location, MINUS_EXPR, + gfc_charlen_type_node, + se.expr, length); + length = fold_build2_loc (input_location, PLUS_EXPR, + gfc_charlen_type_node, length, + gfc_index_one_node); + break; + default: - /* We should never got substring references here. These will be - broken down by the scalarizer. */ gcc_unreachable (); break; } |