http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51052

janus at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2011-11-09
     Ever Confirmed|0                           |1

--- Comment #2 from janus at gcc dot gnu.org 2011-11-09 13:45:12 UTC ---
Here is an very much reduced (and corrected) test case. This is another case of
"non-trivial polymorphic operands", cf. PR46262 and PR46328.

Arjen, why do you need those workarounds for 4.6?



module points2d3d

  implicit none

  type point2d
      real :: x, y
  contains
      procedure               :: add_vector_2d
      procedure               :: assign_2d
      generic                 :: operator(+)     => add_vector_2d
      generic                 :: assignment(=)   => assign_2d
  end type

contains

  subroutine assign_2d( point1, point2 )
    class(point2d), intent(inout) :: point1
    class(point2d), intent(in)    :: point2
    point1%x = point2%x
    point1%y = point2%y
  end subroutine

  function add_vector_2d( point, vector )
    class(point2d), intent(in)  :: point, vector
    class(point2d), allocatable :: add_vector_2d
    ! Workaround for gfortran 4.6
    if ( allocated( add_vector_2d ) ) then
        deallocate( add_vector_2d )
    endif
    allocate( add_vector_2d )
    add_vector_2d%x = point%x + vector%x
    add_vector_2d%y = point%y + vector%y
  end function

end module points2d3d



  use points2d3d
  implicit none

contains

  subroutine position_oil_particle()
    class(point2d), pointer      :: position
    type(point2d)                :: p1, p2
    position = position + p1 + p2
  end subroutine

end

Reply via email to