Well, I missed to emphasize one thing: It is my intension to exploit
F2003's lhs-(re)allocate feature. Meaning, it is totally legal in F03 to
write something like that:
integer, allocatable :: array(:)
array = [ 1,2,3,4 ]
array = [ 1 ]
where 'array' gets automatically (re)allocated. One more thing I should
mention: In case 'array' is manually allocate, everything is fine.
Ok, lets do a little case study and make my suggested minimal example a
little more exhaustive:
PROGRAM main
IMPLICIT NONE
!INCLUDE 'mpif.h'
INTEGER :: ierr
TYPE :: test_typ
REAL, ALLOCATABLE :: a(:)
END TYPE
TYPE(test_typ) :: xx, yy
TYPE(test_typ), ALLOCATABLE :: conc(:)
!CALL mpi_init( ierr )
xx = test_typ( a=[1.0] )
yy = test_typ( a=[2.0,1.0] )
conc = [ xx, yy ]
WRITE(*,*) SIZE(conc)
!CALL mpi_finalize( ierr )
END PROGRAM main
Note: For the beginning all MPI-stuff is commented out; xx and yy are
initialized and their member-variable 'a' is allocated.
For now, assume it as purely serial. That piece of code complies and
runs properly with:
* gfortran 4.7.1, 4.7.2 and 4.8.0 (experimental)
* ifort 12.1 and 13.0 (-assume realloc_lhs)
* nagfort 5.3
On the contrary it terminates, throwing a segfault, with
* pgfortran 12.9
Well, for the following lets simply drop PGI. In addition, according to
'The Fortran 2003 Handbook' published by Springer in 2009, the
usage of the array constructor [...] is appropriate and valid.
As a second step lets try to compile and run it invoking OMPI, just
considering INCLUDE 'mpif.h':
* gfortran: all right
* ifort: all right
* nagfor: all right
Finally, lets initialize MPI by calling MPI_Init() and MPI_Finalize():
* gfortran + OMPI: *** glibc detected *** ./a.out: free(): invalid
pointer ...
* gfortran + Intel-MPI: *** glibc detected *** ./a.out: free(): invalid
pointer ...
* ifort + OMPI: all right
* nagfor + OMPI: all right (-thread_safe)
Well, you are right, this is a very strong indication to blame gfortran
for that! However, it gets even more confusing. Instead of linking
against OMPI, the following results are obtained by invoking IBM's MPI
implementation:
* gfortran + IBM-MPI: all right
* ifort + IBM-MPI: all right
Isn't that weired?
Any suggestions? Might it be useful to submit a bug-report to GCC
developers?
Cheers,
Stefan
|