This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, fortran] PR32881 - PURE attribute escapes from contained procedure
- From: Paul Thomas <paulthomas2 at wanadoo dot fr>
- To: Fortran List <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 17 Aug 2007 08:09:16 +0200
- Subject: [Patch, fortran] PR32881 - PURE attribute escapes from contained procedure
:ADDPATCH fortran:
This problem came about because the initialization assignment is tested
both in the outer and the contained namespaces. Thus, if the contained
namespace is pure, an error was caused. The initialization assignment
is tested by seeing if the rhs is the same as the 'value' field of the
lhs symbol. The testcase is the reporter's.
Regtests on amd64/Cygwin_NT - OK for trunk?
Paul
2007-08-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/32881
* expr.c (gfc_check_pointer_assign): If the rhs is the
initialization expression for the rhs, there is no error.
2007-08-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/32881
* gfortran.dg/pure_initializer_1.f90: New test.
Index: gcc/fortran/expr.c
===================================================================
*** gcc/fortran/expr.c (revision 127505)
--- gcc/fortran/expr.c (working copy)
*************** gfc_check_pointer_assign (gfc_expr *lval
*** 2749,2755 ****
is_pure = gfc_pure (NULL);
! if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym))
{
gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
return FAILURE;
--- 2749,2756 ----
is_pure = gfc_pure (NULL);
! if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
! && lvalue->symtree->n.sym->value != rvalue)
{
gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
return FAILURE;
Index: gcc/testsuite/gfortran.dg/pure_initializer_1.f90
===================================================================
*** gcc/testsuite/gfortran.dg/pure_initializer_1.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/pure_initializer_1.f90 (revision 0)
***************
*** 0 ****
--- 1,17 ----
+ ! { dg-do compile }
+ ! Tests the fix for PR32881, in which the initialization
+ ! of 'p' generated an error because the pureness of 'bar'
+ ! escaped.
+ !
+ ! Contributed by Janne Blomqvist <jb@gcc.gnu.org>
+ !
+ subroutine foo ()
+ integer, pointer :: p => NULL()
+ contains
+ pure function bar (a)
+ integer, intent(in) :: a
+ integer :: bar
+ bar = a
+ end function bar
+ end subroutine foo
+