===================================================================
@@ -2995,6 +2995,8 @@ void gfc_arith_done_1 (void);
arith gfc_check_integer_range (mpz_t p, int kind);
bool gfc_check_character_range (gfc_char_t, int);
+extern bool gfc_seen_div0;
+
/* trans-types.c */
bool gfc_check_any_c_kind (gfc_typespec *);
int gfc_validate_kind (bt, int, bool);
===================================================================
@@ -32,6 +32,8 @@ along with GCC; see the file COPYING3. If not see
#include "target-memory.h"
#include "constructor.h"
+bool gfc_seen_div0;
+
/* MPFR does not have a direct replacement for mpz_set_f() from GMP.
It's easily implemented with a few calls though. */
@@ -1620,6 +1622,10 @@ eval_intrinsic (gfc_intrinsic_op op,
gfc_error (gfc_arith_error (rc), &op1->where);
if (rc == ARITH_OVERFLOW)
goto done;
+
+ if (rc == ARITH_DIV0 && op2->ts.type == BT_INTEGER)
+ gfc_seen_div0 = true;
+
return NULL;
}
===================================================================
@@ -2551,7 +2551,12 @@ variable_decl (int elem)
for (int i = 0; i < as->rank; i++)
{
e = gfc_copy_expr (as->lower[i]);
- gfc_resolve_expr (e);
+ if (!gfc_resolve_expr (e) && gfc_seen_div0)
+ {
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
+
gfc_simplify_expr (e, 0);
if (e && (e->expr_type != EXPR_CONSTANT))
{
@@ -2561,7 +2566,12 @@ variable_decl (int elem)
gfc_free_expr (e);
e = gfc_copy_expr (as->upper[i]);
- gfc_resolve_expr (e);
+ if (!gfc_resolve_expr (e) && gfc_seen_div0)
+ {
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
+
gfc_simplify_expr (e, 0);
if (e && (e->expr_type != EXPR_CONSTANT))
{
@@ -2587,7 +2597,12 @@ variable_decl (int elem)
if (e->expr_type != EXPR_CONSTANT)
{
n = gfc_copy_expr (e);
- gfc_simplify_expr (n, 1);
+ if (!gfc_simplify_expr (n, 1) && gfc_seen_div0)
+ {
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
+
if (n->expr_type == EXPR_CONSTANT)
gfc_replace_expr (e, n);
else
@@ -2597,7 +2612,12 @@ variable_decl (int elem)
if (e->expr_type != EXPR_CONSTANT)
{
n = gfc_copy_expr (e);
- gfc_simplify_expr (n, 1);
+ if (!gfc_simplify_expr (n, 1) && gfc_seen_div0)
+ {
+ m = MATCH_ERROR;
+ goto cleanup;
+ }
+
if (n->expr_type == EXPR_CONSTANT)
gfc_replace_expr (e, n);
else
@@ -2934,6 +2954,7 @@ variable_decl (int elem)
cleanup:
/* Free stuff up and return. */
+ gfc_seen_div0 = false;
gfc_free_expr (initializer);
gfc_free_array_spec (as);