Fortran: catch failed simplification of bad stride expression
authorHarald Anlauf <anlauf@gmx.de>
Tue, 7 Dec 2021 17:46:52 +0000 (18:46 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Tue, 7 Dec 2021 17:46:52 +0000 (18:46 +0100)
gcc/fortran/ChangeLog:

PR fortran/103588
* array.c (gfc_ref_dimen_size): Do not generate internal error on
failed simplification of stride expression; just return failure.

gcc/testsuite/ChangeLog:

PR fortran/103588
* gfortran.dg/pr103588.f90: New test.

gcc/fortran/array.c
gcc/testsuite/gfortran.dg/pr103588.f90 [new file with mode: 0644]

index 5762c8d..e5e2209 100644 (file)
@@ -2403,12 +2403,11 @@ gfc_ref_dimen_size (gfc_array_ref *ar, int dimen, mpz_t *result, mpz_t *end)
        {
          stride_expr = gfc_copy_expr(ar->stride[dimen]); 
 
-         if(!gfc_simplify_expr(stride_expr, 1))
-           gfc_internal_error("Simplification error");
-
-         if (stride_expr->expr_type != EXPR_CONSTANT
-             || mpz_cmp_ui (stride_expr->value.integer, 0) == 0)
+         if (!gfc_simplify_expr (stride_expr, 1)
+            || stride_expr->expr_type != EXPR_CONSTANT
+            || mpz_cmp_ui (stride_expr->value.integer, 0) == 0)
            {
+             gfc_free_expr (stride_expr);
              mpz_clear (stride);
              return false;
            }
diff --git a/gcc/testsuite/gfortran.dg/pr103588.f90 b/gcc/testsuite/gfortran.dg/pr103588.f90
new file mode 100644 (file)
index 0000000..198e176
--- /dev/null
@@ -0,0 +1,8 @@
+! { dg-do compile }
+! PR fortran/103588 - ICE: Simplification error in gfc_ref_dimen_size
+! Contributed by G.Steinmetz
+
+program p
+  integer, parameter :: a(:) = [1,2] ! { dg-error "cannot be automatic or of deferred shape" }
+  integer :: b(2) = a(::a(1))        ! { dg-error "Invalid" }
+end