ICE on valid code. Original patch by Steve, slightly adjusted and regtested on x86_64-pc-linux-gnu.
OK for master? Backports? Should be safe everywhere, as it replaces an assert by an if condition. Thanks, Harald PR fortran/95372 - ICE in find_array_section, at fortran/expr.c:1687 Fix handling of array references in array constructors. gcc/fortran/ChangeLog: PR fortran/95372 * expr.c (find_array_section): Replace assert into a conditional construct. gcc/testsuite/ChangeLog: PR fortran/95372 * gfortran.dg/pr95372.f90: New test.
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index ae9b0a79474..4b0ca453968 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -1684,9 +1684,11 @@ find_array_section (gfc_expr *expr, gfc_ref *ref) } cons = gfc_constructor_lookup (base, limit); - gcc_assert (cons); - gfc_constructor_append_expr (&expr->value.constructor, - gfc_copy_expr (cons->expr), NULL); + if (cons) + gfc_constructor_append_expr (&expr->value.constructor, + gfc_copy_expr (cons->expr), NULL); + else + t = false; } mpz_clear (ptr); diff --git a/gcc/testsuite/gfortran.dg/pr95372.f90 b/gcc/testsuite/gfortran.dg/pr95372.f90 new file mode 100644 index 00000000000..bedd2117c25 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95372.f90 @@ -0,0 +1,14 @@ +! PR fortran/95372 - ICE in find_array_section, at fortran/expr.c:1687 + +program p + type t + integer :: a = 1 + end type t + type(t), parameter :: x(3) = t() + type(t) :: u(3) = t() + type(t) :: y(1), v(1) + y = [x(2:2)] + v = [u(2:2)] + if (any (y% a /= 1)) stop 1 + if (any (v% a /= 1)) stop 2 +end