[Bug fortran/49755] New: ALLOCATE with STAT= produces invalid code for already allocated vars
burnus at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jul 15 08:28:00 GMT 2011
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49755
Summary: ALLOCATE with STAT= produces invalid code for already
allocated vars
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Keywords: missed-optimization, wrong-code
Severity: normal
Priority: P3
Component: fortran
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: burnus@gcc.gnu.org
CC: dcarrera@gcc.gnu.org
Blocks: 32834
The Fortran standard states that ALLOCATEing an already allocated variable is
an error.
gfortran nicely aborts with a run-time error if there is no STAT= variable.
However, if there is STAT= variable, instead of just setting it and stopping,
gfortran deallocates the variable and then tries the new allocation.
There are several issues with that:
(a) It's invalid according to the Fortran standard, which states in
"6.7.4 STAT= specifier":
"* each allocate-object that was not successfully allocated or
deallocated shall retain its previous allocation status
or pointer association status."
(b) It adds lots of code, which should be most of the time not used,
increasing the code size and making optimizations more difficult,
especially for derived types with allocatable components
(c) With coarrays, there are even more issues - one shall not simply
free a coarray unilaterally!
Test case (except for the "abort" function, valid Fortran 2008):
integer, allocatable :: A(:, :)
integer :: stat
allocate(A(20,20))
A = 42
! Allocate of already allocated variable
allocate (A(5,5), stat=stat)
! Expected: Error stat and previous allocation status
if (stat == 0) call abort ()
if (any (shape (A) /= [20, 20])) call abort ()
if (any (A /= 42)) call abort ()
end
More information about the Gcc-bugs
mailing list