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