From: Mark Eggleston <mark.eggleston@codethink.co.uk>
To: gcc-patches <gcc-patches@gcc.gnu.org>, fortran <fortran@gcc.gnu.org>
Subject: [9/10 Regression, PATCH] fortran: ICE in gfc_validate_kind(): Got bad kind [PR93580]
Date: Tue, 11 Feb 2020 15:25:00 -0000 [thread overview]
Message-ID: <0f6bcd37-600e-e5b8-38be-9bbb498eae92@codethink.co.uk> (raw)
[-- Attachment #1: Type: text/plain, Size: 1055 bytes --]
Please find attached a patch, it is based on Steve Kargl's patch in
PR93580 adding a check for %len and test case.
The commit message in the patch includes change logs as I believe that
is the intended way forward. One thing I'm unsure of it how handle
multiple authors, it was easy in the ChangeLog files but it is not
obvious for git commit messages.
OK for master and gcc 9 branch?
gcc/fortran/ChangeLog:
   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.
gcc/testsuite/ChangeLog:
   Mark Eggleston <markeggleston@gcc.gnu.org>
   PR fortran/93580
   * gfortran.dg/dg/pr93580.f90: New test.
--
https://www.codethink.co.uk/privacy.html
[-- Attachment #2: 0001-fortran-ICE-in-gfc_validate_kind-Got-bad-kind-PR93580.patch --]
[-- Type: text/x-patch, Size: 2848 bytes --]
From 2d4fddda1ccd981c9956f798b3ed4871d8fcb4f1 Mon Sep 17 00:00:00 2001
From: Mark Eggleston <markeggleston@gcc.gnu.org>
Date: Wed, 5 Feb 2020 10:38:37 +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 <kargl@gcc.gnu.org> 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/primary.c | 24 ++++++++++++++++++++++--
gcc/testsuite/gfortran.dg/pr93580.f90 | 13 +++++++++++++
2 files changed, 35 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/gfortran.dg/pr93580.f90
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/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.11.0
next reply other threads:[~2020-02-11 15:25 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-11 15:25 Mark Eggleston [this message]
2020-02-17 22:09 ` Thomas Koenig
-- strict thread matches above, loose matches on Subject: below --
2020-02-11 14:41 Mark Eggleston
2020-02-11 15:20 ` Steve Kargl
2020-02-11 15:22 ` Mark Eggleston
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0f6bcd37-600e-e5b8-38be-9bbb498eae92@codethink.co.uk \
--to=mark.eggleston@codethink.co.uk \
--cc=fortran@gcc.gnu.org \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).