diff options
author | Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-14 12:44:19 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2007-08-14 12:44:19 +0000 |
commit | 9a251aa11803ceed2c52286f2b649b4d53a05dba (patch) | |
tree | 8db602af3b13c045381240aefc6106c915111741 /gcc/fortran/expr.c | |
parent | 9ef0c8d982bff201b518d99a900e7f7434ed33c9 (diff) | |
download | gcc-9a251aa11803ceed2c52286f2b649b4d53a05dba.zip gcc-9a251aa11803ceed2c52286f2b649b4d53a05dba.tar.gz gcc-9a251aa11803ceed2c52286f2b649b4d53a05dba.tar.bz2 |
re PR fortran/32594 (substring simplification leads to ICE)
PR fortran/32594
* trans-expr.c (gfc_conv_substring_expr): Only call
gfc_conv_substring if expr->ref is not NULL.
* expr.c (gfc_is_constant_expr): If e->ref is NULL, the substring
expression might be a constant.
(gfc_simplify_expr): Handle missing start and end, as well as
missing ref.
* gfortran.dg/substr_5.f90: New test.
From-SVN: r127478
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index c295f54..f0de19f 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -766,8 +766,8 @@ gfc_is_constant_expr (gfc_expr *e) break; case EXPR_SUBSTRING: - rv = (gfc_is_constant_expr (e->ref->u.ss.start) - && gfc_is_constant_expr (e->ref->u.ss.end)); + rv = e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start) + && gfc_is_constant_expr (e->ref->u.ss.end)); break; case EXPR_STRUCTURE: @@ -1542,9 +1542,19 @@ gfc_simplify_expr (gfc_expr *p, int type) char *s; int start, end; - gfc_extract_int (p->ref->u.ss.start, &start); - start--; /* Convert from one-based to zero-based. */ - gfc_extract_int (p->ref->u.ss.end, &end); + if (p->ref && p->ref->u.ss.start) + { + gfc_extract_int (p->ref->u.ss.start, &start); + start--; /* Convert from one-based to zero-based. */ + } + else + start = 0; + + if (p->ref && p->ref->u.ss.end) + gfc_extract_int (p->ref->u.ss.end, &end); + else + end = p->value.character.length; + s = gfc_getmem (end - start + 2); memcpy (s, p->value.character.string + start, end - start); s[end - start + 1] = '\0'; /* TODO: C-style string. */ |