The code below implements an class hierachy with an abstract parent and two progeny and a generic assignment operator defined at the parent level. The operator points to a deferred routine which is subsequently defined for the two progeny classes.
Module Mod_AA Type, abstract :: ta contains Generic, Public :: Assignment(=) => CP Procedure(SubCP), Deferred, PAss :: CP End type ta Abstract Interface Subroutine SubCP(this,other) Import ta Class(ta), Intent(InOUt) :: this Class(ta), Intent(In) :: other end Subroutine SubCP End Interface Type, extends(ta) :: tb integer :: ib contains Procedure, Pass :: CP => SubCPB End type tb Type, extends(ta) :: tc integer :: ic contains Procedure, Pass :: CP => SubCPC End type tc contains Subroutine SubCpB(this,other) class(tb), Intent(inout) :: this Class(ta), intent(in) :: other Select Type(x=>other) Class Is(tb) this%ib=x%ib Class Is(tc) this%ib=x%ic End Select End Subroutine SubCpB Subroutine SubCpC(this,other) class(tC), Intent(inout) :: this Class(ta), intent(in) :: other Select Type(x=>other) Class Is(tc) this%ic=x%ic Class Is(tb) this%ic=x%ib End Select End Subroutine SubCpC End Module Mod_AA Program Test use Mod_AA Type(tb) :: b type(tc) :: c c%ic=1 b=c write(*,*) b%ib End Program Test
From my understanding the code is correct and should work, and when using gfortran, it compiles and runs. However, using ifort 17.07 and 18.02 yields a compile time error:
user@linux:~$ ifort tmp.f90 tmp.f90(51): error #6197: An assignment of different structure types is invalid.
b=c ----^ compilation aborted for tmp.f90 (code 1)
Is this a compiler bug or does gfortran allow for code which does not comply with the standard???
Any comments appreciated.