https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98573

            Bug ID: 98573
           Summary: Dynamic type lost on assignment
           Product: gcc
           Version: 9.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: davidhneill at gmail dot com
  Target Milestone: ---

Created attachment 49904
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=49904&action=edit
Minimal reproducer

In the following example, the dynamic type of an unlimited polymorphic array is
lost on an assignment but conserved (as expected) on a sourced allocation.

This happens in all versions I've tried: 7.5.0, 8.4.0, 9.3.0, 10.2.0

My system is Ubuntu 20.04 on Intel hardware with all gfortran versions
installed directly from the Ubuntu repositories.

$ cat type_lost.f90

module foo
  type, public:: box
    class(*), allocatable :: val(:)
  end type
contains
  subroutine store1(this, val)
    class(box), intent(out) :: this
    class(*), intent(in) :: val(:)
    this%val = val
  end subroutine store1
  subroutine store2(this, val)
    class(box), intent(out) :: this
    class(*), intent(in) :: val(:)
    allocate(this%val, source=val)
  end subroutine store2
  subroutine vector_type(val)
    class(*), intent(in) :: val(:)
    select type (val)
    type is (integer)
      print '("INTEGER")'
    class default
      print '("OTHER")'
    end select
  end subroutine vector_type
end module foo

program prog
  use foo
  type(box) :: b
  call store1(b, [1, 2, 3])
  call vector_type(b%val)  ! OTHER
  call store2(b, [1, 2, 3])
  call vector_type(b%val)  ! INTEGER

end program

$ gfortran -g -Wall -Wextra minimal.f90
$ ./a.out
OTHER
INTEGER

Reply via email to