aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Eggleston <markeggleston@gcc.gnu.org>2020-08-21 06:39:30 +0100
committerMark Eggleston <markeggleston@gcc.gnu.org>2020-08-27 15:12:10 +0100
commitc336eda750d4e7a0827fedf995da955d6d88d5ca (patch)
tree885de20dcd69f4de23eb0ae46cd8c675ea2cf481 /gcc
parenteb68d9d828f94d28afa5900fbf3072bbcd64ba8a (diff)
downloadgcc-c336eda750d4e7a0827fedf995da955d6d88d5ca.zip
gcc-c336eda750d4e7a0827fedf995da955d6d88d5ca.tar.gz
gcc-c336eda750d4e7a0827fedf995da955d6d88d5ca.tar.bz2
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-27 Mark Eggleston <markeggleston@gcc.gnu.org> gcc/fortran PR fortran/95882 * decl.c (char_len_param_value): Check gfc_seen_div0 and if it is set return MATCH_ERROR. 2020-08-27 Mark Eggleston <markeggleston@gcc.gnu.org> 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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/decl.c3
-rw-r--r--gcc/testsuite/gfortran.dg/pr95882_1.f908
-rw-r--r--gcc/testsuite/gfortran.dg/pr95882_2.f906
-rw-r--r--gcc/testsuite/gfortran.dg/pr95882_3.f906
-rw-r--r--gcc/testsuite/gfortran.dg/pr95882_4.f907
-rw-r--r--gcc/testsuite/gfortran.dg/pr95882_5.f906
6 files changed, 36 insertions, 0 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index d854b2a..c612b492 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 0000000..c254bdd
--- /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 0000000..d308f0c
--- /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 0000000..bd84913
--- /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 0000000..52892d3
--- /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 0000000..dcdf530
--- /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