The following is non-standard and the compiler should probably generate a warning/error with '-pedantic -std=f95' MODULE TT TYPE node_type TYPE(node_type), POINTER :: next=>null() END TYPE CONTAINS PURE FUNCTION give_next(node) TYPE(node_type), POINTER :: node TYPE(node_type), POINTER :: give_next give_next => node%next ! not in pure functions END FUNCTION END MODULE
No. 7 in the lower part of p. 212 of the draft f95 standard.
On a similar note, the following is legal code for which an error is incorrectly reported: >> $ cat pr20863a.f90 >> PURE FUNCTION give_next(i) >> TYPE node_type >> sequence >> TYPE(node_type), POINTER :: next >> END TYPE >> TYPE(node_type), POINTER :: node >> TYPE(node_type), target :: t >> integer, intent(in) :: i >> node%next = t >> END FUNCTION >> >> THOMASP@PC-THOMAS-P /cygdrive/d/svn/prs >> $ /irun/bin/gfortran -c pr20863a.f90 >> In file pr20863a.f90:9 >> >> node%next = t >> 1 >> Error: Right side of assignment at (1) is a derived type containing a >> POINTER in a PURE procedure See discussion here for details: http://gcc.gnu.org/ml/fortran/2006-10/msg00340.html
This has been on the books too long - I was hoping that this would be dealt with as a tyro job:) .....and, yes, a fix is on the way! Paul
Subject: Bug number PR20863 A patch for this bug has been added to the patch tracker. The mailing list url for the patch is http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01127.html
Subject: Bug 20863 Author: pault Date: Mon Jun 18 23:04:28 2007 New Revision: 125831 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=125831 Log: 2007-06-19 Paul Thomas <pault@gcc.gnu.org> PR fortran/20863 PR fortran/20082 * resolve.c (resolve_code): Use gfc_impure_variable as a condition for rejecting derived types with pointers, in pure procedures. (gfc_impure_variable): Add test for dummy arguments of pure procedures; any for functions and INTENT_IN for subroutines. PR fortran/32236 * data.c (gfc_assign_data_value): Change the ICE on an array reference initializer not being an array into an error and clear init to prevent a repetition of the error. 2007-06-19 Paul Thomas <pault@gcc.gnu.org> PR fortran/20863 PR fortran/20082 * gfortran.dg/impure_assignment_2.f90 : New test. PR fortran/32236 * gfortran.dg/data_initialized_2.f90 : New test. * gfortran.dg/equiv_7.f90 : Test for endianess and call the appropriate version of 'dmach'. Added: trunk/gcc/testsuite/gfortran.dg/data_initialized_2.f90 trunk/gcc/testsuite/gfortran.dg/impure_assignment_2.f90 Modified: trunk/gcc/fortran/ChangeLog trunk/gcc/fortran/data.c trunk/gcc/fortran/resolve.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gfortran.dg/equiv_7.f90
Fixed on trunk Paul
Tobias points out to me that this is not a regression - closed and out. Paul