Patchwork [Fortran] PR46122 Make PROTECT check less strict

login
register
mail settings
Submitter Tobias Burnus
Date Oct. 23, 2010, 12:48 p.m.
Message ID <4CC2D988.7010303@net-b.de>
Download mbox | patch
Permalink /patch/68999/
State New
Headers show

Comments

Tobias Burnus - Oct. 23, 2010, 12:48 p.m.
Currently, GCC rejects

   protected_pointer%pointer%var = 5

as the "protected_pointer" is protected. However, that only protects the 
pointer association status - but the example does not modify it - only 
the target of the pointer is modified, which is valid.

The solution is to do the same as with INTENT: Don't continue checking 
as soon as there is component-ref with a pointer component involved 
(which is not the last component-ref).

Build and currently regtesting on x86-64-linux.
OK for the trunk?

Tobias
Paul Richard Thomas - Oct. 23, 2010, 12:56 p.m.
Dear Tobias,

I saw the thread on clf.  Thanks for fixing it so quickly.

OK for trunk.

Paul

On Sat, Oct 23, 2010 at 2:48 PM, Tobias Burnus <burnus@net-b.de> wrote:
> Currently, GCC rejects
>
>  protected_pointer%pointer%var = 5
>
> as the "protected_pointer" is protected. However, that only protects the
> pointer association status - but the example does not modify it - only the
> target of the pointer is modified, which is valid.
>
> The solution is to do the same as with INTENT: Don't continue checking as
> soon as there is component-ref with a pointer component involved (which is
> not the last component-ref).
>
> Build and currently regtesting on x86-64-linux.
> OK for the trunk?
>
> Tobias
>

Patch

2010-10-23  Tobias Burnus  <burnus@net-b.de>

	PR fortran/46122
	* expr.c (gfc_check_vardef_context): Fix PROTECTED check.

2010-10-23  Tobias Burnus  <burnus@net-b.de>

	PR fortran/46122
	* gfortran.dg/protected_8.f90: New.

diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index ef516a4..e567c98 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -4400,7 +4400,7 @@  gfc_check_vardef_context (gfc_expr* e, bool pointer, const char* context)
     }
 
   /* PROTECTED and use-associated.  */
-  if (sym->attr.is_protected && sym->attr.use_assoc)
+  if (sym->attr.is_protected && sym->attr.use_assoc  && check_intentin)
     {
       if (pointer && is_pointer)
 	{
diff --git a/gcc/testsuite/gfortran.dg/protected_8.f90 b/gcc/testsuite/gfortran.dg/protected_8.f90
new file mode 100644
index 0000000..aaa34a6
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/protected_8.f90
@@ -0,0 +1,50 @@ 
+! { dg-do compile }
+!
+! PR fortran/46122
+!
+! PROTECT check
+!
+! Contributed by Jared Ahern
+!
+
+MODULE amod
+   IMPLICIT NONE
+   TYPE foo
+      INTEGER :: i = 4
+      INTEGER, POINTER :: j => NULL()
+   END TYPE foo
+   TYPE(foo), SAVE, PROTECTED :: a
+   TYPE(foo), SAVE, PROTECTED, POINTER :: b
+   INTEGER, SAVE, PROTECTED :: i = 5
+   INTEGER, SAVE, PROTECTED, POINTER :: j => NULL()
+contains
+  subroutine alloc()
+    allocate(b,j)
+  end subroutine alloc
+END MODULE amod
+
+PROGRAM test
+   USE amod
+   IMPLICIT NONE
+   INTEGER, TARGET :: k
+   TYPE(foo), TARGET :: c
+   k = 2   ! local
+   c%i = 9 ! local
+
+   call alloc()
+
+   i = k    ! { dg-error "is PROTECTED" }
+   j => k   ! { dg-error "is PROTECTED" }
+   j = 3    ! OK 1
+   a = c    ! { dg-error "is PROTECTED" }
+   a%i = k  ! { dg-error "is PROTECTED" }
+   a%j => k ! { dg-error "is PROTECTED" }
+   a%j = 5  ! OK 2
+   b => c   ! { dg-error "is PROTECTED" }
+   b%i = k  ! OK 3
+   b%j => k ! OK 4
+   b%j = 5  ! OK 5
+
+END PROGRAM test
+
+! { dg-final { cleanup-modules "amod" } }