From e97963ec8edc58217d2ff225c58256ebd61c8e7c Mon Sep 17 00:00:00 2001 From: Mark Eggleston Date: Fri, 21 Aug 2020 06:39:30 +0100 Subject: [PATCH] Fortran : ICE for division by zero in declaration PR95882 A length expression containing a divide by zero in a character declaration will result in an ICE if the constant is anymore complicated that a contant divided by a constant. The cause was that char_len_param_value can return MATCH_YES even if a divide by zero was seen. Prior to returning check whether a divide by zero was seen and if so set it to MATCH_ERROR. 2020-08-24 Mark Eggleston gcc/fortran PR fortran/95882 * decl.c (char_len_param_value): Check gfc_seen_div0 and it is set return MATCH_ERROR. 2020-08-24 Mark Eggleston gcc/testsuite/ PR fortran/95882 * gfortran.dg/pr95882_1.f90: New test. * gfortran.dg/pr95882_2.f90: New test. * gfortran.dg/pr95882_3.f90: New test. * gfortran.dg/pr95882_4.f90: New test. * gfortran.dg/pr95882_5.f90: New test. --- gcc/fortran/decl.c | 3 +++ gcc/testsuite/gfortran.dg/pr95882_1.f90 | 8 ++++++++ gcc/testsuite/gfortran.dg/pr95882_2.f90 | 6 ++++++ gcc/testsuite/gfortran.dg/pr95882_3.f90 | 6 ++++++ gcc/testsuite/gfortran.dg/pr95882_4.f90 | 7 +++++++ gcc/testsuite/gfortran.dg/pr95882_5.f90 | 6 ++++++ 6 files changed, 36 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/pr95882_1.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr95882_2.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr95882_3.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr95882_4.f90 create mode 100644 gcc/testsuite/gfortran.dg/pr95882_5.f90 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index d854b2a0307..c612b492f3e 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1146,6 +1146,9 @@ char_len_param_value (gfc_expr **expr, bool *deferred) gfc_free_expr (e); } + if (gfc_seen_div0) + m = MATCH_ERROR; + return m; syntax: diff --git a/gcc/testsuite/gfortran.dg/pr95882_1.f90 b/gcc/testsuite/gfortran.dg/pr95882_1.f90 new file mode 100644 index 00000000000..c254bddf494 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95882_1.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } + +module m + type t + character(((0)/0)) :: c ! { dg-error "Division by zero" } + end type +end + diff --git a/gcc/testsuite/gfortran.dg/pr95882_2.f90 b/gcc/testsuite/gfortran.dg/pr95882_2.f90 new file mode 100644 index 00000000000..d308f0c3181 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95882_2.f90 @@ -0,0 +1,6 @@ +! { dg-do compile } + +module m + character(0/(0)) :: c = '123456789' ! { dg-error "Division by zero" } +end + diff --git a/gcc/testsuite/gfortran.dg/pr95882_3.f90 b/gcc/testsuite/gfortran.dg/pr95882_3.f90 new file mode 100644 index 00000000000..bd849135480 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95882_3.f90 @@ -0,0 +1,6 @@ +! { dg-do compile } + +subroutine s(c) + character(((0)/0)) :: c ! { dg-error "Division by zero" } +end + diff --git a/gcc/testsuite/gfortran.dg/pr95882_4.f90 b/gcc/testsuite/gfortran.dg/pr95882_4.f90 new file mode 100644 index 00000000000..52892d32b8b --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95882_4.f90 @@ -0,0 +1,7 @@ +! { dg-do compile } + +program p + character(((0)/0)) :: c ! { dg-error "Division by zero" } + common /x/ c +end + diff --git a/gcc/testsuite/gfortran.dg/pr95882_5.f90 b/gcc/testsuite/gfortran.dg/pr95882_5.f90 new file mode 100644 index 00000000000..dcdf5304052 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr95882_5.f90 @@ -0,0 +1,6 @@ +! { dg-do compile } + +program p + character(0/(0)) :: c = '123456789' ! { dg-error "Division by zero" } + common c +end -- 2.11.0