https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59202
--- Comment #4 from federico <federico.perini at gmail dot com> --- The self-assignment issue is present even if the derived type has no allocatable components. Here is a sample test program that gives an error with gfortran 10.2.0: module assign implicit none private type, public :: t integer :: a contains procedure :: destroy=>t_destroy procedure :: assign=>t_assign generic :: assignment(=) =>assign end type t contains elemental subroutine t_destroy(this) class(t), intent(inout) :: this this%a = 0 end subroutine t_destroy subroutine t_assign(this,that) class(t), intent(inout) :: this class(t), intent(in) :: that call this%destroy() ! Clean memory first select type (thatPtr=>that) type is (t) this%a = thatPtr%a end select end subroutine t_assign end module assign program test use assign type(t), allocatable :: t1(:) allocate(t1(10)) do i=1,10 t1(i)%a = i end do n = 0 do i=1,10 if (mod(i,2)/=0) then n = n + 1 t1(n) = t1(i) print *, 'i=',i,' t(i)%a=',t1(i)%a,' expected t(i)%a=',i,': ',merge('ERROR!','OK ',t1(i)%a/=i) endif end do end program test