This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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
+ 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]