http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52022
Bug #: 52022
Summary: [4.5/4.6/4.7 Regression] Wrong-code with procedures
passed as actual argument
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: fortran
AssignedTo: [email protected]
ReportedBy: [email protected]
Reported by patnel97269 at http://gcc.gnu.org/ml/fortran/2012-01/msg00232.html
The following program - a stripped-down version of the original version -
compiles and successfully runs with GCC 4.3 and 4.4. It prints:
2.0000000000000000 4.0000000000000000
Using GCC 4.5, 4.6 and 4.7, one gets instead a SEGFAULT.
In 4.4, the passed argument is:
sol (cost1);
while 4.5/4.6/4.7 pass the argument:
sol (&cost1);
which does not make much sense.
There might be internally some confusion between procedures dummies (pass
address of procedure to be called) and procedures pointers (pass address of the
callee such that it can be assigned to).
module m
contains
function cost1(x) result(y)
double precision,dimension(:) :: x
double precision,dimension(:),allocatable :: y
allocate(y(2))
y=2d0*x
end function cost1
end module m
program test
use m
implicit none
call sol(cost1)
contains
subroutine sol(cost3)
interface
function cost3(p) result(y)
double precision,dimension(:) :: p
double precision,dimension(:),allocatable :: y
end function cost3
end interface
print *,cost3([1d0,2d0])
end subroutine
end program test