diff options
Diffstat (limited to 'gcc/fortran/data.c')
-rw-r--r-- | gcc/fortran/data.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/fortran/data.c b/gcc/fortran/data.c index e12eccd..2ab6f50 100644 --- a/gcc/fortran/data.c +++ b/gcc/fortran/data.c @@ -167,13 +167,26 @@ create_character_intializer (gfc_expr * init, gfc_typespec * ts, if (ref) { + gfc_expr *start_expr, *end_expr; + gcc_assert (ref->type == REF_SUBSTRING); /* Only set a substring of the destination. Fortran substring bounds are one-based [start, end], we want zero based [start, end). */ - gfc_extract_int (ref->u.ss.start, &start); + start_expr = gfc_copy_expr (ref->u.ss.start); + end_expr = gfc_copy_expr (ref->u.ss.end); + + if ((gfc_simplify_expr (start_expr, 1) == FAILURE) + || (gfc_simplify_expr (end_expr, 1)) == FAILURE) + { + gfc_error ("failure to simplify substring reference in DATA" + "statement at %L", &ref->u.ss.start->where); + return NULL; + } + + gfc_extract_int (start_expr, &start); start--; - gfc_extract_int (ref->u.ss.end, &end); + gfc_extract_int (end_expr, &end); } else { |