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



             Bug #: 54784

           Summary: [oop] allocation of extended types with polymorphic

                    allocatable members

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: fortran

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: jkoz...@gmail.com





(Error also occurs with gcc 4.7.1)



When I have a container module with stores a collection of polymorphics types,

I sometimes get an error that a pointer is being freed which was not allocated. 



An example program is below. It can be compiled without errors

   gfortran bug.f90



It contains four modules each with an associated type. If the type 'block' in

'block_module' the member nFields is commented out the code runs fine.



If a print statement is added in the program the code runs fine



If the dimension of the member 'x' of types block_cart1d and block_cart2d are

changed so that they are not 3 and 4 (only one must be changed), the program

works.



Finally, if the order in the program of the addBlock command is reversed the 



bug.f90

--------

module block_module

  implicit none

  private



  public :: block

  type,abstract :: block

    ! if commented out code works fine

    integer       ,private :: nFields      = 0

  end type block



end module block_module



module block1d_module

  use block_module, only : block



  type,extends(block) :: block1d

    real,dimension(:,:,:),allocatable,private :: fields

  end type

end module



module block2d_module

  use block_module, only : block



  type,extends(block) :: block2d

    real,dimension(:,:,:,:),allocatable,private :: fields

  end type

end module





module domain_module

  use block_module, only : block



  implicit none

  type :: list

    class(block),allocatable :: B

  end type



  type :: domain

    type(list),dimension(10) :: L

  contains

    procedure :: addBlock

  end type

contains



  subroutine addBlock(this,i,b)

    implicit none

    class(domain),intent(inout) :: this

    integer,intent(in) :: i

    class(block),intent(in) :: b



    allocate(this%L(i)%B,source=b)

  end subroutine

end module



program bug

  use domain_module, only : domain

  use block1d_module, only : block1d

  use block2d_module, only : block2d

  implicit none

  type(domain) :: d

  type(block1d) :: b1

  type(block2d) :: b2



  ! crashes with "pointer being freed was not allocated"

  call d%addBlock(1,b1)

  call d%addBlock(2,b2)



  ! crashes with "invalid memory reference"

  ! call d%addBlock(2,b2)

  ! call d%addBlock(1,b1)



  ! runs fine

  ! call d%addBlock(1,b2)

  ! call d%addBlock(2,b1)



end program  bug

Reply via email to