Search code examples
fortranfortran2003fortran2008

Automatic LHS reallocation with overloaded assignment


I have a code, which segfaults with all compilers I have at hand, when doing an assignment to an unallocted allocatable on the LHS with a structure constructor on the RHS. The structure (derived type) itself has an overloaded assignment. I thought, that automatic reallocation of the LHS should occur before the assignment routine is called, but it does not seem to be the case.

Below the code, demonstrating the issue. Uncommenting the allocate statement makes everything working, but I do not understand, why the explicit allocation is necessary in this case. Funny enough, if I remove the overloaded assignment, things work as well.

Any hints?

module dummy
  implicit none

  type :: DummyType
    integer :: ii
  contains
    procedure :: assignDummyType
    generic :: assignment(=) => assignDummyType
  end type DummyType

  interface DummyType
    module procedure DummyType_init
  end interface DummyType

contains

  function DummyType_init(initValue) result(this)
    integer, intent(in) :: initValue
    type(DummyType) :: this
    this%ii = initValue
  end function DummyType_init

  subroutine assignDummyType(this, other)
    class(DummyType), intent(out) :: this
    type(DummyType), intent(in) :: other
    this%ii = other%ii + 1
  end subroutine assignDummyType
end module dummy

program test_dummy
  use dummy
  implicit none

  type(DummyType), allocatable :: aa

  !allocate(aa)   ! Should be covered via automatic reallocation...
  aa = DummyType(42)

end program test_dummy

Solution

  • There is a recent discussion on comp.lang.fortran dealing with this topic.

    An assignment statement is either an intrinsic assignment or a defined assignment. Intrinsic assignment permits [re]allocation of the left hand side, defined assignment does not.

    When you provide a procedure for the assignment generic identifier, your assignment is defined assignment. The characteristics of the argument that corresponds to the left hand side then require that the left hand side be allocated.