diff options
author | Mark Eggleston <markeggleston@gcc.gnu.org> | 2020-08-21 06:39:30 +0100 |
---|---|---|
committer | Mark Eggleston <markeggleston@gcc.gnu.org> | 2020-08-27 15:12:10 +0100 |
commit | c336eda750d4e7a0827fedf995da955d6d88d5ca (patch) | |
tree | 885de20dcd69f4de23eb0ae46cd8c675ea2cf481 /gcc | |
parent | eb68d9d828f94d28afa5900fbf3072bbcd64ba8a (diff) | |
download | gcc-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.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr95882_1.f90 | 8 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr95882_2.f90 | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr95882_3.f90 | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr95882_4.f90 | 7 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pr95882_5.f90 | 6 |
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 |