From d4c10c9f4bff616e7ed07e92504fe31a700e2af1 Mon Sep 17 00:00:00 2001 From: Mark Eggleston Date: Tue, 18 Feb 2020 10:00:50 +0000 Subject: [PATCH] [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 only checked for %re and %im. gcc/fortran/ChangeLog: 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. gcc/testsuite/ChangeLog: PR fortran/93580 * gfortran.dg/dg/pr93580.f90: New test. --- gcc/fortran/ChangeLog | 9 +++++++++ gcc/fortran/primary.c | 24 ++++++++++++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/pr93580.f90 | 13 +++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr93580.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index a2f45d216c2..302af3aa990 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2020-02-18 Steven G. Kargl + Mark Eggleston + + 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-10 Andrew Benson PR fortran/83113 diff --git a/gcc/fortran/primary.c b/gcc/fortran/primary.c index bd50827bb15..d73898473df 100644 --- a/gcc/fortran/primary.c +++ b/gcc/fortran/primary.c @@ -2241,8 +2241,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 8f2c5b0795e..1c7f879bf66 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-02-20 Mark Eggleston + + PR fortran/93580 + * gfortran.dg/dg/pr93580.f90: New test. + 2020-02-18 Jakub Jelinek PR tree-optimization/93780 diff --git a/gcc/testsuite/gfortran.dg/pr93580.f90 b/gcc/testsuite/gfortran.dg/pr93580.f90 new file mode 100644 index 00000000000..4feaa112914 --- /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 + -- 2.30.2