aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/fortran/expr.c7
-rw-r--r--gcc/testsuite/gfortran.dg/pr101327.f9011
2 files changed, 14 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,
diff --git a/gcc/testsuite/gfortran.dg/pr101327.f90 b/gcc/testsuite/gfortran.dg/pr101327.f90
new file mode 100644
index 0000000..f4377aa
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr101327.f90
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR fortran/101327 - ICE in find_array_element, at fortran/expr.c:1355
+
+subroutine s
+ integer, parameter :: n([2]) = [1, 2] ! { dg-error "must be scalar" }
+ type t
+ integer :: a(n(1):n(2))
+ end type
+end
+
+! { dg-error "cannot be automatic or of deferred shape" " " { target *-*-* } 5 }