[gcc/devel/omp/gcc-9] [fortran] ICE in gfc_validate_kind(): Got bad kind [PR93580]
Tobias Burnus
burnus@gcc.gnu.org
Thu Mar 5 14:51:00 GMT 2020
https://gcc.gnu.org/g:560139481239e37a1cc878fb90805fa5e94f623c
commit 560139481239e37a1cc878fb90805fa5e94f623c
Author: Mark Eggleston <markeggleston@gcc.gnu.org>
Date: Tue Feb 18 10:56:38 2020 +0000
[fortran] ICE in gfc_validate_kind(): Got bad kind [PR93580]
Caused by using invalid part_refs in kind specifications,
e.g. %re or %im on non-complex expressions and %len on
non character expressions.
Check whether %re, %im and %len are valid when checking
kind specification.
The original patch from Steven G. Kargl <kargl@gcc.gnu.org> only
checked for %re and %im.
Backported from mainline
2020-02-18 Mark Eggleston <markeggleston@gcc.gnu.org>
PR fortran/93580
* primary.c (gfc_match_varspec): If the symbol following %
is re or im and the primary expression type is not BT_COMPLEX
issue an error. If the symbol is len and the primary
expression type is not BT_CHARACTER is an error.
PR fortran/93580
* gfortran.dg/dg/pr93580.f90: New test.
Diff:
---
gcc/fortran/ChangeLog | 12 ++++++++++++
gcc/fortran/primary.c | 24 ++++++++++++++++++++++--
gcc/testsuite/ChangeLog | 8 ++++++++
gcc/testsuite/gfortran.dg/pr93580.f90 | 13 +++++++++++++
4 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f31e052..c4257c1 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,15 @@
+2020-02-18 Mark Eggleston <markeggleston@gcc.gnu.org>
+
+ Backported from mainline
+ 2020-02-18 Steven G. Kargl <kargl@gcc.gnu.org>
+ Mark Eggleston <markeggleston@gcc.gnu.org>
+
+ PR fortran/93580
+ * primary.c (gfc_match_varspec): If the symbol following %
+ is re or im and the primary expression type is not BT_COMPLEX
+ issue an error. If the symbol is len and the primary
+ expression type is not BT_CHARACTER is an error.
+
2020-02-13 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c
index 8408e9c..ff93698 100644
--- a/gcc/fortran/primary.c
+++ b/gcc/fortran/primary.c
@@ -2202,8 +2202,28 @@ gfc_match_varspec (gfc_expr *primary, int equiv_flag, bool sub_flag,
if (inquiry)
sym = NULL;
- if (sep == '%' && primary->ts.type != BT_UNKNOWN)
- intrinsic = true;
+ if (sep == '%')
+ {
+ if (tmp)
+ {
+ if ((tmp->u.i == INQUIRY_RE || tmp->u.i == INQUIRY_IM)
+ && primary->ts.type != BT_COMPLEX)
+ {
+ gfc_error ("The RE or IM part_ref at %C must be "
+ "applied to a COMPLEX expression");
+ return MATCH_ERROR;
+ }
+ else if (tmp->u.i == INQUIRY_LEN
+ && primary->ts.type != BT_CHARACTER)
+ {
+ gfc_error ("The LEN part_ref at %C must be applied "
+ "to a CHARACTER expression");
+ return MATCH_ERROR;
+ }
+ }
+ if (primary->ts.type != BT_UNKNOWN)
+ intrinsic = true;
+ }
}
else
inquiry = false;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 62b7b32..81926ef 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2020-02-18 Mark Eggleston <markeggleston@gcc.gnu.org>
+
+ Back-ported from mainline
+ 2020-02-18 Mark Eggleston <markeggleston@gcc.gnu.org>
+
+ PR fortran/93580
+ * gfortran.dg/dg/pr93580.f90: New test.
+
2020-02-18 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/93434
diff --git a/gcc/testsuite/gfortran.dg/pr93580.f90 b/gcc/testsuite/gfortran.dg/pr93580.f90
new file mode 100644
index 0000000..4feaa11
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr93580.f90
@@ -0,0 +1,13 @@
+! { dg-do compile }
+! PR fortran/93580
+
+program p
+ integer, parameter :: n = 4
+ complex(n%re) :: x ! { dg-error "The RE or IM part_ref at" }
+ complex(n%im) :: y ! { dg-error "The RE or IM part_ref at" }
+ complex(n%len) :: z ! { dg-error "The LEN part_ref at" }
+ character(n%im) :: a ! { dg-error "The RE or IM part_ref at" }
+ character(n%re) :: b ! { dg-error "The RE or IM part_ref at" }
+ character(n%len) :: c ! { dg-error "The LEN part_ref at" }
+end
+
More information about the Gcc-cvs
mailing list