This web mail archive is frozen.
This page is part of a frozen web archive of this mailing list.
You can still navigate around this archive, but know that no new mails
have been added to it since July of 2016.
Click here to be taken to the new web archives of this list; it includes all the mails that are in this frozen archive plus all new mails that have been sent to the list since it was migrated to the new archives.
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:
INTEGER :: ierr
TYPE :: test_typ
REAL, ALLOCATABLE :: a(:)
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 ]
!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
* gfortran + Intel-MPI: *** glibc detected *** ./a.out: free(): invalid
* 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
* 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