The attached code (which seems fine to me) produces an internal compiler error. gfortran -c pp.f90 -o pp.o f951: internal compiler error: in gfc_build_null_descriptor, at fortran/trans-array.c:372 gfortran --version GNU Fortran (GCC) 4.5.0 20091229 (experimental) module mod_a implicit none public :: p_fun private abstract interface pure function intf(x) result(y) real, intent(in) :: x(:,:) real :: y(size(x,1),size(x,1),size(x,2)) end function intf end interface !procedure(intf), pointer :: p_fun ! this works procedure(intf), pointer :: p_fun => null() end module mod_a
Confirmed. The initialization works - if in a procedure or program, but it fails in the declaration part of a module. The problem seems to be related to returning an array - one should not have called gfc_build_null_descriptor but via get_proc_pointer_decl the routine gfc_conv_initializer (with pointer = true and array = false). Actually, the following looks bogus: DECL_INITIAL (decl) = gfc_conv_initializer (sym->value, &sym->ts, TREE_TYPE (decl), sym->attr.dimension, sym->attr.proc_pointer); Namely, the last but one argument. I think, it should be: sym->attr.proc_pointer ? false : sym->attr.dimension But that does not explain why it seems to work elsewhere. Janus, what do you think?
(In reply to comment #1) > Confirmed. The initialization works - if in a procedure or program, but it > fails in the declaration part of a module. Actually, it also fails there; it only succeeded because the (unused) declaration was optimized away before reaching the line of interest. I am now testing my patch - looks OK so far.
Subject: Bug 42597 Author: burnus Date: Thu Jan 7 08:12:10 2010 New Revision: 155688 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=155688 Log: 2010-01-07 Tobias Burnus <burnus@net-b.de> PR fortran/42597 * trans-decl.c (get_proc_pointer_decl): Fix call to gfc_conv_initializer for array-valued proc-pointer funcs. 2010-01-07 Tobias Burnus <burnus@net-b.de> PR fortran/42597 * gfortran.dg/proc_ptr_26.f90: New test. Added: trunk/gcc/testsuite/gfortran.dg/proc_ptr_26.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/trans-decl.c trunk/gcc/testsuite/ChangeLog
FIXED on the trunk (4.5). Thanks for reporting the bug!