How can I resolve the problem about intrinsic assignment between two polymorphic components into a type variables using Gfortran?

Gfortran 8.1 and 9.1 give me an error about intrinsic assignment between two polymorphic components into a type variables. I don't have any problem using intel compiler but no in the case in gfortran. I'm asking if someone know any workaround. Here an example that you can try to compile.

Program Check
implicit none

!> Type definitions
Type :: Atm_Type
End Type Atm_Type

Type, extends (Atm_type) :: Atm_Std_Type
End Type Atm_Std_Type

Type, extends (Atm_std_type) :: Atm_Ref_Type
End Type Atm_Ref_Type

Type :: AtList_Type
   integer                                    :: Natoms
   class(Atm_Type), dimension(:), allocatable :: Atom
end Type AtList_Type

!> Variables 
type(AtList_Type) :: list

call sub(list)

Contains

Subroutine Sub(List)
   !---- Argument ----!
   type (AtList_Type), intent(in out) :: List

   !---- Local Variables ----!
   integer            :: i
   type (AtList_Type), allocatable :: local

   if (List%natoms <= 0 ) return
   allocate(local%atom(List%natoms))

   do i=1, List%natoms
      local%atom(i)=list%atom(i)
   end do   

End Subroutine Sub

End Program Check

Upvotes: 2

Views: 63

Answers (1)

Here the workaround is very simple and appeared in one of the recent questions/answers. Just copy the whole array

 local%atom = list%atom

However, it is not always possible to do that when you really need to access individual elements. If your real use case is like that, show the real use case.

If the number of possible types inside is limited, you can also use the select type type guard, but often that is not possible either.

Upvotes: 1

Related Questions