[Bug fortran/100440] New: allocated() gives True for unallocated variable
dsmith at lmu dot edu
gcc-bugzilla@gcc.gnu.org
Wed May 5 23:11:26 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100440
Bug ID: 100440
Summary: allocated() gives True for unallocated variable
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: dsmith at lmu dot edu
Target Milestone: ---
A large program that ran correctly on several previous versions of gfortran
(and other compilers) failed when I installed version 10 on a 2017 Intel Mac
running 10.15.3.
gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/gfortran/libexec/gcc/x86_64-apple-darwin19/10.2.0/lto-wrapper
Target: x86_64-apple-darwin19
Configured with: ../gcc-10.2.0/configure --prefix=/usr/local/gfortran
--with-gmp=/Users/fx/devel/gcc/build_package/deps
--with-isl=/Users/fx/devel/gcc/build_package/deps
--enable-languages=c,c++,fortran,objc,obj-c++ --build=x86_64-apple-darwin19
--with-native-system-header-dir=/usr/include
--with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (GCC)
This program ran correctly under gfortran 6.3, but a similar program using
the same set of subroutines failed the same way. That prompted me to upgrade
to gfortran 10, but instead things got worse with several other of my programs
failing with this error.
I have tried to reproduce the error in a small example program, but so far
I have not been able to do it.
Maybe this description will tell you what the error is, in lieu of the full
program.
The debug prints check the allocation status of the array within fmmatmul21_fm
at the top of the routine. Running under gfortran 10.2 gives:
21 j= 1 allocated(fmmatmul21_fm(j)%mfm%mp) = T
size(fmmatmul21_fm(j)%mfm%mp) = 1
At line 133497 of file fmprogram.f95
Fortran runtime error: Attempting to allocate already allocated variable
'fmmatmul21_fm'
Other compilers give correct results:
21 j= 1 allocated(fmmatmul21_fm(j)%mfm%mp) = F
allocated(fmmatmul21_fm(j)%mfm%mp) = T
size(fmmatmul21_fm(j)%mfm%mp) = 12
21 j= 2 allocated(fmmatmul21_fm(j)%mfm%mp) = F
allocated(fmmatmul21_fm(j)%mfm%mp) = T
size(fmmatmul21_fm(j)%mfm%mp) = 12
...
I don't understand why fmmatmul21_fm should show that it is already
allocated when it is basically an uninitialized local variable.
It shouldn't matter, but fmmatmul21_fm has not been called earlier
in the program.
With the deallocate statement enabled, so the allocate statement
should then work, I get:
21 j= 1 allocated(fmmatmul21_fm(j)%mfm%mp) = T
size(fmmatmul21_fm(j)%mfm%mp) = 1
fmprogram(26871,0x10fa64dc0) malloc: *** error for object 0x5000000000000000:
pointer being freed was not allocated
fmprogram(26871,0x10fa64dc0) malloc: *** set a breakpoint in malloc_error_break
to debug
Program received signal SIGABRT: Process abort signal.
Here is the function where the error occurs:
function fmmatmul21_fm(ma,mb)
use fmvals
implicit none
type (fm) :: ma(:,:),mb(:)
type (fm), dimension(size(ma,dim=1)) :: fmmatmul21_fm
integer :: j,k,mxsave,nd2,ndsave
intent (in) :: ma,mb
type(multi), save :: mtlvfm,mulvfm,mvlvfm,mtlv01
if (size(mb) == size(ma,dim=2)) then
do j = 1, size(ma,dim=1)
print*,'21 j=',j,' allocated(fmmatmul21_fm(j)%mfm%mp) = ',
allocated(fmmatmul21_fm(j)%mfm%mp)
if(allocated(fmmatmul21_fm(j)%mfm%mp)) print*,' size(fmmatmul21_fm(j)%mfm%mp) =
', size(fmmatmul21_fm(j)%mfm%mp)
!deallocate(fmmatmul21_fm(j)%mfm%mp)
allocate(fmmatmul21_fm(j)%mfm%mp(ndig+2))
print*,' allocated(fmmatmul21_fm(j)%mfm%mp) = ',
allocated(fmmatmul21_fm(j)%mfm%mp)
print*,' size(fmmatmul21_fm(j)%mfm%mp) = ', size(fmmatmul21_fm(j)%mfm%mp)
enddo
ndsave = ndig
j = max(ngrd52,2)
nd2 = max(2*ndig+j,2)
ndig = nd2
mxsave = mxexp
do j = 1, size(ma,dim=1)
mxexp = mxexp2
call fmi2m(0,mtlvfm)
do k = 1, size(mb,dim=1)
call fmequ(ma(j,k)%mfm,mulvfm,ndsave,ndig)
call fmequ(mb(k)%mfm,mvlvfm,ndsave,ndig)
call fmmpy(mulvfm,mvlvfm,mtlv01)
call fmadd_r1(mtlvfm,mtlv01)
enddo
mxexp = mxsave
call fmequ(mtlvfm,fmmatmul21_fm(j)%mfm,ndig,ndsave)
enddo
ndig = ndsave
else
call fmst2m(' unknown ',mvlvfm)
do j = 1, size(ma,dim=1)
call fmeq(mvlvfm,fmmatmul21_fm(j)%mfm)
enddo
endif
end function fmmatmul21_fm
The context for this subroutine is that it provides the matmul function
for matrix times vector for variables of type(fm), which is defined in
terms of type(multi) containing allocatable d.p. arrays.
type multi
real (kind(1.0d0)), allocatable :: mp(:)
end type
type fm
type(multi) :: mfm
end type
I hope that can give a hint about what might be going wrong.
David Smith
More information about the Gcc-bugs
mailing list