https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110877
Bug ID: 110877
Summary: Incorrect copy of allocatable component in polymorphic
assignment from array dummy argument
Product: gcc
Version: 13.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: townsend at astro dot wisc.edu
Target Milestone: ---
I've run into a problem that's demonstrated by the following code:
--
module avs_m
type :: foo_t
end type foo_t
type, extends(foo_t) :: bar_t
real, allocatable :: a
end type bar_t
end module avs_m
program assign_vs_source
use avs_m
implicit none
class(foo_t), allocatable :: foo(:)
allocate(bar_t::foo(1))
select type(foo)
class is (bar_t)
allocate(foo(1)%a)
end select
call check_assign(foo)
contains
subroutine check_assign(f)
class(foo_t), intent(in) :: f(:)
class(foo_t), allocatable :: g(:)
g = f
select type(g)
class is (bar_t)
print *,'is allocated?', allocated(g(1)%a)
end select
deallocate(g)
allocate(g, SOURCE=f)
select type(g)
class is (bar_t)
print *,'is allocated?', allocated(g(1)%a)
end select
end subroutine check_assign
end program assign_vs_source
--
Expected output is
is allocated? T
is allocated? T
but instead I get (gfortran 13.1.0, MacOS 13.4 x86_64):
is allocated? F
is allocated? T
It seems that the polymorphic assignment g=f is not correctly allocating the %a
component -- but the sourced allocation is. The problem seems to go away if (1)
I use scalars for foo, f and g, or (2) if I move the code from the check_assign
subroutine to the main program.
cheers,
Rich