PR fortran/95979 - ICE in get_kind, at fortran/simplify.c:129
authorHarald Anlauf <anlauf@gmx.de>
Fri, 16 Oct 2020 20:17:46 +0000 (22:17 +0200)
committerHarald Anlauf <anlauf@gmx.de>
Fri, 16 Oct 2020 20:17:46 +0000 (22:17 +0200)
Simplification of the elemental intrinsic INDEX with constant array-valued
arguments failed with an ICE or did not reduce to a constant array, depending
also on the presence of the optional KIND argument.  Add a further attempt of
simplification in the case of elemental intrinsics, and make sure the KIND
argument is not removed prematurely during simplification of INDEX.

gcc/fortran/ChangeLog:

PR fortran/95979
* expr.c (gfc_check_init_expr): Fix check of return code from
gfc_intrinsic_func_interface.
* intrinsic.c (gfc_intrinsic_func_interface): Add further attempt
of simplification of elemental intrinsics with array arguments.
* iresolve.c (gfc_resolve_index_func): Keep optional KIND argument
for simplification of elemental use of INDEX.

gcc/testsuite/ChangeLog:

PR fortran/95979
* gfortran.dg/index_4.f90: New test.

gcc/fortran/expr.c
gcc/fortran/intrinsic.c
gcc/fortran/iresolve.c
gcc/testsuite/gfortran.dg/index_4.f90 [new file with mode: 0644]

index b87ae3d72a18ea0e3f5599a2b8e6500b6fb8568a..32d905ad1799162e4bf3dd71b5faf589c145855d 100644 (file)
@@ -2904,7 +2904,7 @@ gfc_check_init_expr (gfc_expr *e)
                   && (e->value.function.isym->conversion == 1);
 
        if (!conversion && (!gfc_is_intrinsic (sym, 0, e->where)
-           || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES))
+           || (m = gfc_intrinsic_func_interface (e, 0)) == MATCH_NO))
          {
            gfc_error ("Function %qs in initialization expression at %L "
                       "must be an intrinsic function",
index ef33587a774c8d3ec2edf2f2a10419259f22110e..f4dfcf77e0b0fbadb8abca5bb298bc14b955f218 100644 (file)
@@ -5038,6 +5038,11 @@ got_specific:
   if (!sym->module)
     gfc_intrinsic_symbol (sym);
 
+  /* Have another stab at simplification since elemental intrinsics with array
+     actual arguments would be missed by the calls above to do_simplify.  */
+  if (isym->elemental)
+    gfc_simplify_expr (expr, 1);
+
   return MATCH_YES;
 }
 
index c2a4865f28f32f146b1db78a2b5de1e1bbac67e2..994a9af4eb8d6dcb016e3596a7e5200d6bbb3d5a 100644 (file)
@@ -1296,11 +1296,7 @@ gfc_resolve_index_func (gfc_expr *f, gfc_actual_arglist *a)
 
   f->ts.type = BT_INTEGER;
   if (kind)
-    {
-      f->ts.kind = mpz_get_si ((kind)->value.integer);
-      a_back->next = NULL;
-      gfc_free_actual_arglist (a_kind);
-    }
+    f->ts.kind = mpz_get_si ((kind)->value.integer);
   else
     f->ts.kind = gfc_default_integer_kind;
 
diff --git a/gcc/testsuite/gfortran.dg/index_4.f90 b/gcc/testsuite/gfortran.dg/index_4.f90
new file mode 100644 (file)
index 0000000..0909378
--- /dev/null
@@ -0,0 +1,19 @@
+! { dg-do run }
+! { dg-options "-fdump-tree-original" }
+! { dg-final { scan-tree-dump-times "string_index" 0 "original" } }
+! PR fortran/95979
+
+program p
+  implicit none
+  integer, parameter :: i0    = index( 'abcd',  'b' , .true. , kind=4)
+  integer, parameter :: i1(*) = index(['abcd'], 'b' , .true. , kind=4)
+  integer, parameter :: i2(*) = index( 'abcd' ,['b'], .true.         )
+  integer, parameter :: i3(*) = index( 'abcd' , 'b' ,[.true.]        )
+  integer, parameter :: i4(*) = index(['abcd'],['b'],[.true.], kind=8)
+  if (size (i1) /= 1) stop 1
+  if (size (i2) /= 1) stop 2
+  if (size (i3) /= 1) stop 3
+  if (size (i4) /= 1) stop 4
+  if (i0 /= 2)        stop 5
+  if (i1(1) /= 2 .or. i2(1) /= 2 .or. i3(1) /= 2 .or. i4(1) /= 2) stop 6
+end