Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
Announcements
Welcome to the Intel Community. If you get an answer you like, please mark it as an Accepted Solution to help others. Thank you!
26733 Discussions

generic operator inheritance compile time error

may_ka
Beginner
87 Views

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.

Chees

0 Kudos
1 Reply
IanH
Black Belt
87 Views

That would have been a compiler bug.  It compiles ok with current beta.

Reply