diff options
author | Mark Eggleston <markeggleston@gcc.gnu.org> | 2020-05-07 08:29:14 +0100 |
---|---|---|
committer | Mark Eggleston <markeggleston@gcc.gnu.org> | 2020-05-13 14:51:53 +0100 |
commit | f9f98e59a7f6663f31b671c44998190079097f97 (patch) | |
tree | c67bd2020046c78302df340b66465d15260407c2 /gcc/fortran | |
parent | 6cc6b087c8cdfdf58a4bb166aa53950c4bfdef2d (diff) | |
download | gcc-f9f98e59a7f6663f31b671c44998190079097f97.zip gcc-f9f98e59a7f6663f31b671c44998190079097f97.tar.gz gcc-f9f98e59a7f6663f31b671c44998190079097f97.tar.bz2 |
Fortran : ICE in gfc_conv_array_constructor_expr PR93497
Invalid expressions, such as those involving array constructors,
used for the length of character types will cause an ICE.
2020-05-13 Steven G. Kargl <kargl@gcc.gnu.org>
gcc/fortran/
PR fortran/93497
* decl.c (char_len_param_value): Check whether character
length expression is of type EXPR_OP and if so simplify it.
* resolve.c (resolve_charlen): Reject length if it has a
rank.
2020-05-13 Mark Eggleston <markeggleston@gcc.gnu.org>
gcc/testsuite/
PR fortran/93497
* gfortran.dg/pr88025.f90: Change in wording of error.
* gfortran.dg/pr93497.f90: New test.
* gfortran.dg/pr93714_1.f90: Change in wording of errors.
* gfortran.dg/pr93714_2.f90: Change in wording of errors.
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 5 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 2 |
3 files changed, 14 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 9ce70f7..becfda4 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2020-05-13 Steven G. Kargl <kargl@gcc.gnu.org> + + PR fortran/93497 + * decl.c (char_len_param_value): Check whether character + length expression is of type EXPR_OP and if so simplify it. + * resolve.c (resolve_charlen): Reject length if it has a + rank. + 2020-05-13 Tobias Burnus <tobias@codesourcery.com> PR fortran/94690 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index d650407..9cc8136 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1077,6 +1077,11 @@ char_len_param_value (gfc_expr **expr, bool *deferred) if (!gfc_expr_check_typed (*expr, gfc_current_ns, false)) return MATCH_ERROR; + /* If gfortran gets an EXPR_OP, try to simplifiy it. This catches things + like CHARACTER(([1])). */ + if ((*expr)->expr_type == EXPR_OP) + gfc_simplify_expr (*expr, 1); + if ((*expr)->expr_type == EXPR_FUNCTION) { if ((*expr)->ts.type == BT_INTEGER diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 88ba88d..f6e10ea 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -12358,7 +12358,7 @@ resolve_charlen (gfc_charlen *cl) } /* cl->length has been resolved. It should have an integer type. */ - if (cl->length->ts.type != BT_INTEGER) + if (cl->length->ts.type != BT_INTEGER || cl->length->rank != 0) { gfc_error ("Scalar INTEGER expression expected at %L", &cl->length->where); |