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