PR fortran/95979 - ICE in get_kind, at fortran/simplify.c:129
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.
This commit is contained in:
parent
3e8d8f3b88
commit
02629b116e
4 changed files with 26 additions and 6 deletions
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
19
gcc/testsuite/gfortran.dg/index_4.f90
Normal file
19
gcc/testsuite/gfortran.dg/index_4.f90
Normal file
|
@ -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
|
Loading…
Add table
Reference in a new issue