From 38865feca36f0837f3fea8b401a2b42fb4f818ca Mon Sep 17 00:00:00 2001
From: Mark Eggleston <markeggleston@gcc.gnu.org>
Date: Thu, 26 Mar 2020 14:07:09 +0000
Subject: [PATCH] fortran : ICE in gfc_resolve_findloc PR93498
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/check.c | 4 ++++
gcc/testsuite/gfortran.dg/pr93498_1.f90 | 11 +++++++++++
gcc/testsuite/gfortran.dg/pr93498_2.f90 | 12 ++++++++++++
3 files changed, 27 insertions(+)
create mode 100644 gcc/testsuite/gfortran.dg/pr93498_1.f90
create mode 100644 gcc/testsuite/gfortran.dg/pr93498_2.f90
@@ -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;
new file mode 100644
@@ -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
+
new file mode 100644
@@ -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
+
+
--
2.11.0