------- Comment #6 from janus at gcc dot gnu dot org 2009-12-15 22:30 -------
The test case in comment #5 has issues which go beyond the usage of 'deferred':
The variant below, which has no deferred procedures, compiles, but produces
wrong code (the operators are always resolved to the TBPs of the base type,
although they should be polymorphic). This should go into a separate PR.
module foo_module
implicit none
private
public :: foo
type :: foo
contains
procedure :: times => times_foo
procedure :: assign => assign_foo
generic :: operator(*) => times
generic :: assignment(=) => assign
end type
contains
function times_foo(this,factor) result(product)
class(foo) ,intent(in) :: this
class(foo) ,allocatable :: product
real, intent(in) :: factor
end function
subroutine assign_foo(lhs,rhs)
class(foo) ,intent(inout) :: lhs
class(foo) ,intent(in) :: rhs
end subroutine
end module
module bar_module
use foo_module ,only : foo
implicit none
private
public :: bar
type ,extends(foo) :: bar
private
real :: x=1.
contains
procedure :: times => times_bar
procedure :: assign => assign_bar
end type
contains
subroutine assign_bar(lhs,rhs)
class(bar) ,intent(inout) :: lhs
class(foo) ,intent(in) :: rhs
select type(rhs)
type is (bar)
lhs%x = rhs%x
end select
end subroutine
function times_bar(this,factor) result(product)
class(bar) ,intent(in) :: this
real, intent(in) :: factor
class(foo), allocatable :: product
select type(this)
type is (bar)
allocate(product,source=this)
select type(product)
type is(bar)
product%x = this%x*factor
end select
end select
end function
end module
program main
use foo_module ,only : foo
use bar_module ,only : bar
implicit none
type(bar) :: unit
call rescale(unit,3.141592654)
contains
subroutine rescale(this,scale)
class(foo) ,intent(inout) :: this
real, intent(in) :: scale
this = this*scale
end subroutine
end program
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42144