aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2021-09-07 20:51:49 +0200
committerHarald Anlauf <anlauf@gmx.de>2021-09-07 20:51:49 +0200
commit2a1537a19cb2fa85823cfa18ed40baa4b259b4e3 (patch)
tree92a691c3ad47e1b42ea7cf0d8109332a5890db28 /gcc/fortran
parent849d5f5929fc1e480aa6d385976810d2b1319755 (diff)
downloadgcc-2a1537a19cb2fa85823cfa18ed40baa4b259b4e3.zip
gcc-2a1537a19cb2fa85823cfa18ed40baa4b259b4e3.tar.gz
gcc-2a1537a19cb2fa85823cfa18ed40baa4b259b4e3.tar.bz2
Fortran - improve error recovery determining array element from constructor
gcc/fortran/ChangeLog: PR fortran/101327 * expr.c (find_array_element): When bounds cannot be determined as constant, return error instead of aborting. gcc/testsuite/ChangeLog: PR fortran/101327 * gfortran.dg/pr101327.f90: New test.
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/expr.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 35563a7..dfecc30 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -1337,7 +1337,9 @@ find_array_element (gfc_constructor_base base, gfc_array_ref *ar,
for (i = 0; i < ar->dimen; i++)
{
if (!gfc_reduce_init_expr (ar->as->lower[i])
- || !gfc_reduce_init_expr (ar->as->upper[i]))
+ || !gfc_reduce_init_expr (ar->as->upper[i])
+ || ar->as->upper[i]->expr_type != EXPR_CONSTANT
+ || ar->as->lower[i]->expr_type != EXPR_CONSTANT)
{
t = false;
cons = NULL;
@@ -1351,9 +1353,6 @@ find_array_element (gfc_constructor_base base, gfc_array_ref *ar,
goto depart;
}
- gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
- && ar->as->lower[i]->expr_type == EXPR_CONSTANT);
-
/* Check the bounds. */
if ((ar->as->upper[i]
&& mpz_cmp (e->value.integer,