Fix PR fortran/93500, ICE on invalid.
authorThomas König <tkoenig@gcc.gnu.org>
Sun, 19 Apr 2020 10:56:32 +0000 (12:56 +0200)
committerThomas König <tkoenig@gcc.gnu.org>
Sun, 19 Apr 2020 10:56:32 +0000 (12:56 +0200)
Returning &gfc_bad_expr when simplifying bounds after a divisin by zero
happened results in the division by zero error actually reaching the user.

2020-04-19  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/93500
* resolve.c (resolve_operator): If both operands are
NULL, return false.
* simplify.c (simplify_bound): If a division by zero
was seen during bound simplification, free the
corresponcing expression and return &gfc_bad_expr.

2020-04-19  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/93500
* arith_divide_3.f90: New test.

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/arith_divide_3.f90 [new file with mode: 0644]

index 2f99ce24599fcfe571574860812ab8a13c0fb336..336ce49090eeaa0411642b9fdfba3b0fd342007d 100644 (file)
@@ -1,3 +1,12 @@
+2020-04-19  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/93500
+       * resolve.c (resolve_operator): If both operands are
+       NULL, return false.
+       * simplify.c (simplify_bound): If a division by zero
+       was seen during bound simplification, free the
+       corresponcing expression and return &gfc_bad_expr.
+
 2020-04-17  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/94090
index 2371ab23645f5f72a0f2f27506d3d59c67a449ae..fd3b025a84ffb74415c5f4eab9cf1902eaac126a 100644 (file)
@@ -3992,6 +3992,9 @@ resolve_operator (gfc_expr *e)
 
   op1 = e->value.op.op1;
   op2 = e->value.op.op2;
+  if (op1 == NULL && op2 == NULL)
+    return false;
+
   dual_locus_error = false;
 
   /* op1 and op2 cannot both be BOZ.  */
index d5703e38251b3a06f3472e247be9aade63290bdd..c7a4f77e70b13381c52d1e31220ba054360bf4c5 100644 (file)
@@ -4251,7 +4251,11 @@ simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
 
              for (j = 0; j < d; j++)
                gfc_free_expr (bounds[j]);
-             return bounds[d];
+
+             if (gfc_seen_div0)
+               return &gfc_bad_expr;
+             else
+               return bounds[d];
            }
        }
 
index 9f8ae6ccccb1b6e0a83a5ecae8188a7a456f8c42..e8742902d12aee30a80b4352daa88ace1a725f67 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-19  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/93500
+       * arith_divide_3.f90: New test.
+
 2020-04-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR objc/94637
diff --git a/gcc/testsuite/gfortran.dg/arith_divide_3.f90 b/gcc/testsuite/gfortran.dg/arith_divide_3.f90
new file mode 100644 (file)
index 0000000..95682df
--- /dev/null
@@ -0,0 +1,17 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=single" }
+! PR 93500 - this used to cause an ICE
+
+program p
+  integer :: a(min(2,0)/0) ! { dg-error "Division by zero" }
+  integer, save :: c[min(2,0)/0,*] ! { dg-error "Division by zero|must have constant shape" }
+  integer :: b = lbound(a) ! { dg-error "must be an array" }
+  print *,lcobound(c)
+end program p
+
+subroutine s
+  integer :: a(min(2,0)/0)  ! { dg-error "Division by zero" }
+  integer, save :: c[min(2,0)/0,*] ! { dg-error "Division by zero" }
+  integer :: b = lbound(a)
+  print *,lcobound(c)
+end subroutine s