fortran : ICE in gfc_resolve_findloc PR93498
authorMark Eggleston <markeggleston@gcc.gnu.org>
Thu, 2 Apr 2020 06:31:12 +0000 (07:31 +0100)
committerMark Eggleston <markeggleston@gcc.gnu.org>
Thu, 2 Apr 2020 06:31:12 +0000 (07:31 +0100)
ICE occurs when findloc is used with character arguments of different
kinds.  If the character kinds are different reject the code.

Original patch provided by Steven G. Kargl  <kargl@gcc.gnu.org>.

gcc/fortran/ChangeLog:

PR fortran/93498
* check.c (gfc_check_findloc):  If the kinds of the arguments
differ goto label "incompat".

gcc/testsuite/ChangeLog:

PR fortran/93498
* gfortran.dg/pr93498_1.f90:  New test.
* gfortran.dg/pr93498_2.f90:  New test.

gcc/fortran/ChangeLog
gcc/fortran/check.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr93498_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr93498_2.f90 [new file with mode: 0644]

index 1aa71d8778e5cb86aa91586415781c0b688518fb..89de9d00fe2df49c96ad9d09994d4f11218046ab 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-02  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/93498
+       * check.c (gfc_check_findloc):  If the kinds of the arguments
+       differ goto label "incompat".
+
 2020-04-02 Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/94030
index 519aa8b8c2b640b4ee8fa03211aa7b810e47eab2..cdabbf5e12a7462998f1e9e6b15978a7b22fbd00 100644 (file)
@@ -3947,6 +3947,10 @@ gfc_check_findloc (gfc_actual_arglist *ap)
   v1 = v->ts.type == BT_CHARACTER;
   if ((a1 && !v1) || (!a1 && v1))
     goto incompat;
+
+  /* Check the kind of the characters argument match.  */
+  if (a1 && v1 && a->ts.kind != v->ts.kind)
+    goto incompat;
         
   d = ap->next->next->expr;
   m = ap->next->next->next->expr;
index 2a686d23ee67c493873e402ea8d80c94f3b514cd..ac1695f60985bf3ee7022b024c22a9776bb62522 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-02  Mark Eggleston  <mark.eggleston@codethink.com>
+
+       PR fortran/93498
+       * gfortran.dg/pr93498_1.f90:  New test.
+       * gfortran.dg/pr93498_2.f90:  New test.
+
 2020-04-02  Mark Eggleston  <mark.eggleston@codethink.com>
        Steven G. Kargl  <kargl@gcc.gnu.org>
 
diff --git a/gcc/testsuite/gfortran.dg/pr93498_1.f90 b/gcc/testsuite/gfortran.dg/pr93498_1.f90
new file mode 100644 (file)
index 0000000..0210cc7
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+!
+! Test case by  G. Steinmetz
+
+program p
+   character(len=1, kind=1) :: x(3) = ['a', 'b', 'c']
+   character(len=1, kind=4) :: y = 4_'b'
+   print *, findloc(x, y)     ! { dg-error " must be in type conformance" }
+   print *, findloc(x, y, 1)  ! { dg-error " must be in type conformance" }
+end
+
diff --git a/gcc/testsuite/gfortran.dg/pr93498_2.f90 b/gcc/testsuite/gfortran.dg/pr93498_2.f90
new file mode 100644 (file)
index 0000000..ee9238f
--- /dev/null
@@ -0,0 +1,12 @@
+! { dg-do compile }
+!
+! Test case by  G. Steinmetz
+
+program p
+   character(len=1, kind=4) :: x(3) = [4_'a', 4_'b', 4_'c']
+   character(len=1, kind=1) :: y = 'b'
+   print *, findloc(x, y)     ! { dg-error " must be in type conformance" }
+   print *, findloc(x, y, 1)  ! { dg-error " must be in type conformance" }
+end
+
+