https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106367
Bug ID: 106367
Summary: ICE in fold_convert_loc.c when referencing an
array-of-structure-eleents from within a polymorphic
function
Product: gcc
Version: 11.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: federico.perini at gmail dot com
Target Milestone: ---
Created attachment 53321
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53321&action=edit
test program
I get an ICE with all gfortran versions from 5 to 12 when having a type-bound
procedure that creates an array from some of its structure components.
The error does not appear if the same command is called not within a function,
or, the when the function argument is not polymorphic.
The error (on 11.3.0) points to
31 | array = c%list%indices(c%v(1:)%flag)
| 1
internal compiler error: in fold_convert_loc, at fold-const.c:2440
This is a minimal program that reproduces the error. It was part of a far more
complex structure:
```
module mymod
implicit none
type vert
integer :: flag = 0 ! The fvm node flag (16 exploitable bits)
end type vert
type contnr
type(vert), allocatable :: v(:)
integer, allocatable :: list(:)
contains
procedure :: poly_get_list
end type contnr
contains
! Polymorphic function causes ICE
function poly_get_list(c) result(array)
class(contnr), intent(in) :: c
integer, allocatable :: array(:)
! ICE internal compiler error: in fold_convert_loc, at
fold-const.c:2440 (11.3.0)
! when this is put into a function
array = c%list(c%v(1:)%flag)
end function poly_get_list
! Non-polymorphic version works
function get_list(c) result(array)
type(contnr), intent(in) :: c
integer, allocatable :: array(:)
array = c%list(c%v(1:)%flag)
end function get_list
end module mymod
program arrayOfStruct
use mymod
implicit none
type(contnr) :: c
integer :: i
allocate(c%v(-1:100),c%list(-1:100))
forall(i=1:100)
c%v(i)%flag = i
c%list(i) = 100-i+1
end forall
! Direct: works!
print "(*(1x,i0))", c%list(c%v(1:)%flag)
! Wrapped with TYPE(contnr): works!
print "(*(1x,i0))", get_list(c)
! Wrapped with polymorphic CLASS(contnr): ICE
! Wrapped with TYPE(contnr): works!
print "(*(1x,i0))", c%poly_get_list()
end program arrayOfStruct
```