This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran 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] PR46122 Make PROTECT check less strict


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
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" } }

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