PR fortran/95053 - division by zero constants

Partially revert the fix for PR93499.  Replace by checks for valid
	expressions in the declaration of array shape and PDT KIND and LEN
	expressions at a later stage.

gcc/fortran/

2020-05-18  Harald Anlauf  <anlauf@gmx.de>

	PR fortran/95053
	* arith.c (gfc_divide): Revert hunk introduced by patch for
	PR93499.
	* decl.c (variable_decl): Generate error for array shape not being
	an INTEGER constant.
	(gfc_get_pdt_instance): Generate error if KIND or LEN expressions
	in declaration of a PDT instance do not simplify to INTEGER
	constants.

gcc/testsuite/

2020-05-18  Harald Anlauf  <anlauf@gmx.de>

	PR fortran/95053
	* gfortran.dg/dec_structure_23.f90: Adjust to new error messages.
	* gfortran.dg/pr93499.f90: Adjust to new error messages.
	* gfortran.dg/pr95053_2.f90: New test.
	* gfortran.dg/pr95053_3.f90: New test.
This commit is contained in:
Harald Anlauf 2020-05-18 20:27:29 +02:00
parent 2c832ffedf
commit e5abd1cb91
8 changed files with 63 additions and 37 deletions

View File

@ -1,3 +1,14 @@
2020-05-18 Harald Anlauf <anlauf@gmx.de>
PR fortran/95053
* arith.c (gfc_divide): Revert hunk introduced by patch for
PR93499.
* decl.c (variable_decl): Generate error for array shape not being
an INTEGER constant.
(gfc_get_pdt_instance): Generate error if KIND or LEN expressions
in declaration of a PDT instance do not simplify to INTEGER
constants.
2020-05-15 Tobias Burnus <tobias@codesourcery.com>
PR fortran/94690

View File

@ -1806,38 +1806,6 @@ gfc_multiply (gfc_expr *op1, gfc_expr *op2)
gfc_expr *
gfc_divide (gfc_expr *op1, gfc_expr *op2)
{
if (op2 && op2->expr_type == EXPR_CONSTANT)
{
arith rc = ARITH_OK;
switch (op2->ts.type)
{
case BT_INTEGER:
/* non-integer divided by integer 0 is handled elsewhere. */
if (mpz_sgn (op2->value.integer) == 0
&& op1->ts.type == BT_INTEGER)
rc = ARITH_DIV0;
break;
case BT_REAL:
if (mpfr_sgn (op2->value.real) == 0
&& flag_range_check == 1)
rc = ARITH_DIV0;
break;
case BT_COMPLEX:
if (mpc_cmp_si_si (op2->value.complex, 0, 0) == 0
&& flag_range_check == 1)
rc = ARITH_DIV0;
break;
default:
/* basic type is non-numeric, handle this elsewhere. */
break;
}
if (rc == ARITH_DIV0)
{
gfc_seen_div0 = true;
gfc_error ("Division by zero at %L", &op2->where);
return NULL;
}
}
return eval_intrinsic_f3 (INTRINSIC_DIVIDE, gfc_arith_divide, op1, op2);
}

View File

@ -2607,6 +2607,14 @@ variable_decl (int elem)
gfc_free_expr (e);
}
if (not_constant && e->ts.type != BT_INTEGER)
{
gfc_error ("Explicit array shape at %C must be constant of "
"INTEGER type and not %s type",
gfc_basic_typename (e->ts.type));
m = MATCH_ERROR;
goto cleanup;
}
if (not_constant)
{
gfc_error ("Explicit shaped array with nonconstant bounds at %C");
@ -3741,8 +3749,9 @@ gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym,
if (kind_expr)
{
/* Try simplification even for LEN expressions. */
bool ok;
gfc_resolve_expr (kind_expr);
gfc_simplify_expr (kind_expr, 1);
ok = gfc_simplify_expr (kind_expr, 1);
/* Variable expressions seem to default to BT_PROCEDURE.
TODO find out why this is and fix it. */
if (kind_expr->ts.type != BT_INTEGER
@ -3753,6 +3762,12 @@ gfc_get_pdt_instance (gfc_actual_arglist *param_list, gfc_symbol **sym,
gfc_basic_typename (kind_expr->ts.type));
goto error_return;
}
if (kind_expr->ts.type == BT_INTEGER && !ok)
{
gfc_error ("The parameter expression at %C does not "
"simplify to an INTEGER constant");
goto error_return;
}
tail->expr = gfc_copy_expr (kind_expr);
}

View File

@ -1,3 +1,11 @@
2020-05-18 Harald Anlauf <anlauf@gmx.de>
PR fortran/95053
* gfortran.dg/dec_structure_23.f90: Adjust to new error messages.
* gfortran.dg/pr93499.f90: Adjust to new error messages.
* gfortran.dg/pr95053_2.f90: New test.
* gfortran.dg/pr95053_3.f90: New test.
2020-05-18 Marek Polacek <polacek@redhat.com>
PR c++/95143

View File

@ -13,8 +13,8 @@ program p
integer :: nn
real :: rr
structure /s/
integer x(n) /1/ ! { dg-error "array with nonconstant bounds" }
integer x(n) /1/ ! { dg-error "must be constant of INTEGER type" }
integer xx(nn) /1/ ! { dg-error "array with nonconstant bounds" }
integer xxx(rr) /1.0/ ! { dg-error "array with nonconstant bounds" }
integer xxx(rr) /1.0/ ! { dg-error "must be constant of INTEGER type" }
end structure
end

View File

@ -2,9 +2,9 @@
! PR 93499 - this used to ICE. Original test case by Gerhard Steinmetz.
program p
integer :: a((0.)/0) ! { dg-error "Division by zero" }
integer :: a((0.)/0) ! { dg-error "must be constant of INTEGER type" }
type t(n)
integer, len :: n
end type t
type(t((0)/0)) :: x ! { dg-error "Division by zero" }
type(t((0)/0)) :: x ! { dg-error "does not simplify to an INTEGER constant" }
end

View File

@ -0,0 +1,10 @@
! { dg-do compile }
! PR 95053 - make sure we do not regress on 521.wrf_r from spec2017
!
function f (x)
real, parameter :: cldeps = 0.
f = 0.
if (cldeps > 0.) then
f = floor (x/cldeps) * cldeps
end if
end function f

View File

@ -0,0 +1,14 @@
! { dg-do compile }
! Related to PR 93499 - this used to ICE.
program p
type t(n)
integer, kind :: n
end type t
type u(n)
integer, len :: n
end type u
type(t((0)/0)) :: x ! { dg-error "does not simplify to an INTEGER" }
type(t((0.)/0)) :: y ! { dg-error "must be of INTEGER type" }
type(u(0/(0.))) :: z ! { dg-error "must be of INTEGER type" }
end