[gcc/devel/ranger] [fortran] ICE in gfc_validate_kind(): Got bad kind [PR93580]

Aldy Hernandez aldyh@gcc.gnu.org
Wed Jun 17 18:57:51 GMT 2020


https://gcc.gnu.org/g:d4c10c9f4bff616e7ed07e92504fe31a700e2af1

commit d4c10c9f4bff616e7ed07e92504fe31a700e2af1
Author: Mark Eggleston <markeggleston@gcc.gnu.org>
Date:   Tue Feb 18 10:00:50 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.
    
    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.

Diff:
---
 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(-)

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  <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-10  Andrew Benson  <abensonca@gmail.com>
 
         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 <markeggleston@gcc.gnu.org>
+
+	PR fortran/93580
+	* gfortran.dg/dg/pr93580.f90: New test.
+
 2020-02-18  Jakub Jelinek  <jakub@redhat.com>
 
 	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
+


More information about the Gcc-cvs mailing list