Found at http://de.wikibooks.org/wiki/Fortran:_Fortran_2003:_Zeiger The following program gives an ICE: hjff.f90:4.34: procedure( up ), pointer :: pptr => null() 1 Error: Interface 'up' of procedure 'pptr' at (1) must be explicit hjff.f90:4.15: procedure( up ), pointer :: pptr => null() 1 Error: Symbol 'up' at (1) has no IMPLICIT type f951: internal compiler error: in resolve_specific_s0, at fortran/resolve.c:2758 Please submit a full bug report, program bsp implicit none procedure( up ), pointer :: pptr => null() pptr => ooops call pptr end program bsp
The test case can be further compressed to a 3-liner procedure( up ) :: p call p end and is fixed by the following simple patch Index: gcc/fortran/resolve.c =================================================================== --- gcc/fortran/resolve.c (revision 142171) +++ gcc/fortran/resolve.c (working copy) @@ -2748,7 +2748,8 @@ resolve_specific_s0 (gfc_code *c, gfc_sy /* See if we have an intrinsic interface. */ if (sym->ts.interface != NULL && !sym->ts.interface->attr.abstract - && !sym->ts.interface->attr.subroutine) + && !sym->ts.interface->attr.subroutine + && sym->ts.interface->attr.intrinsic) { gfc_intrinsic_sym *isym;
I also tried to compile the other procptr examples from the WikiBooks page, which is linked in comment #0. The only remaining problem I found was: program bsp implicit none abstract interface subroutine up() end subroutine up end interface procedure( up ) , pointer :: pptr pptr => add contains function add( a, b ) integer :: add integer, intent( in ) :: a, b add = a + b end function add end program bsp This is currently accepted by gfortran, although invalid, and is rejected e.g. by ifort with error #8179: The procedure pointer and the procedure target must both be functions or subroutines. Inserting a statement like print *, pptr() produces an ICE.
Subject: Bug 38290 Author: janus Date: Sat Nov 29 13:36:35 2008 New Revision: 142276 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=142276 Log: 2008-11-29 Janus Weil <janus@gcc.gnu.org> Mikael Morin <mikael@gcc.gnu.org> PR fortran/38289 PR fortran/38290 * decl.c (match_procedure_decl): Handle whitespaces. * resolve.c (resolve_specific_s0): Bugfix in check for intrinsic interface. 2008-11-29 Janus Weil <janus@gcc.gnu.org> Tobias Burnus <burnus@gcc.gnu.org> PR fortran/38289 PR fortran/38290 * gfortran.dg/proc_decl_1.f90: Extended test case. Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/decl.c trunk/gcc/fortran/resolve.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gfortran.dg/proc_decl_1.f90
Subject: Bug 38290 Author: janus Date: Tue Dec 2 11:58:16 2008 New Revision: 142351 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=142351 Log: 2008-12-02 Janus Weil <janus@gcc.gnu.org> PR fortran/36704 PR fortran/38290 * decl.c (match_result): Result may be a standard variable or a procedure pointer. * expr.c (gfc_check_pointer_assign): Additional checks for procedure pointer assignments. * primary.c (gfc_match_rvalue): Bugfix for procedure pointer assignments. * resolve.c (resolve_function): Check for attr.subroutine. * symbol.c (check_conflict): Addtional checks for RESULT statements. * trans-types.c (gfc_sym_type,gfc_get_function_type): Support procedure pointers as function result. 2008-12-02 Janus Weil <janus@gcc.gnu.org> PR fortran/36704 PR fortran/38290 * gfortran.dg/entry_7.f90: Modified. * gfortran.dg/proc_ptr_2.f90: Extended. * gfortran.dg/proc_ptr_3.f90: Modified. * gfortran.dg/proc_ptr_11.f90: New. * gfortran.dg/proc_ptr_12.f90: New. * gfortran.dg/result_1.f90: New. Added: trunk/gcc/testsuite/gfortran.dg/proc_ptr_11.f90 trunk/gcc/testsuite/gfortran.dg/proc_ptr_12.f90 trunk/gcc/testsuite/gfortran.dg/result_1.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/decl.c trunk/gcc/fortran/expr.c trunk/gcc/fortran/primary.c trunk/gcc/fortran/resolve.c trunk/gcc/fortran/symbol.c trunk/gcc/fortran/trans-types.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gfortran.dg/entry_7.f90 trunk/gcc/testsuite/gfortran.dg/proc_ptr_2.f90 trunk/gcc/testsuite/gfortran.dg/proc_ptr_3.f90
Fixed with r142351. Closing.
Reopening. The check for comparing the interfaces was taken out again in r142520, since there were problems with intrinsics. Details will follow.
Check backed out in PR 38415, cf. http://gcc.gnu.org/ml/fortran/2008-12/msg00089.html "I'm afraid I'll have to remove the gfc_compare_interfaces check in gfc_check_pointer_assign again, since I just noticed that it has lots of problems with intrinsics (both in lvalue and rvalue)"
Created attachment 16841 [details] patch v1 Here is a draft patch which correctly copies the typespec and formal args for a PROCEDURE statement with INTRINSIC interface. It also makes gfc_compare_interfaces work with intrinsics and re-enables the interface check for procedure pointer assignments. Stuff like the following should work now: procedure(iabs),pointer::p1 procedure(f), pointer::p2 ! valid p1 => iabs p2 => iabs p1 => f p2 => f p2 => p1 p1 => p2 ! invalid p1 => abs p2 => abs contains integer function f(x) integer :: x f = 317 end function end
Patch: http://gcc.gnu.org/ml/fortran/2008-12/msg00191.html
Fixed with r145651 (I messed up the PR number in the ChangeLog entry, though). Closing.