More on defined operator/assignment on an abstract type

Janus Weil janus@gcc.gnu.org
Mon Nov 9 13:26:00 GMT 2009


Hi Damian,

> It appears the code I submitted with PR 41556 still gives errors (different
> from the previous errors) with gcc 4.5.0 20091106.  The code and error
> messages are below.
>
> Damian
>
> $ cat abstract.f03
> module foo_module
>  implicit none
>  private  ! Hide everything by default
>  public :: foo
>
>  type ,abstract :: foo
>  contains
>    procedure(times_interface) ,deferred :: times
>    generic :: operator(*) => times
>  end type
>
>  abstract interface
>    function times_interface(this,factor) result(product)
>      import :: foo
>      class(foo) ,intent(in)  :: this
>      class(foo) ,allocatable :: product
>      real, intent(in) :: factor
>    end function
>  end interface
>
> contains
>
>  subroutine scale_this(this,scale)
>    class(foo) :: this
>    real, intent(in) :: scale
>    this = this*scale        ! Preferred implementation
>    this = this%times(scale) ! Alternate implementation
>  end subroutine
>
> end module
> $ /usr/local/gfortran/bin/gfortran-4.5 abstract.f03
> abstract.f03:26.4:
>
>    this = this*scale        ! Preferred implementation
>    1
> Error: Variable must not be polymorphic in assignment at (1)
> abstract.f03:27.4:
>
>    this = this%times(scale) ! Alternate implementation
>    1
> Error: Variable must not be polymorphic in assignment at (1)

I think in this case gfortran is actually right to reject it.
Performing an assignment on a polymorphic variable is only permitted
if the declared type has a defined assignment operator, which your
example does not have (this is also confirmed by ifort and nagfor).

Cheers,
Janus



More information about the Fortran mailing list