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.
@@ -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)
{
new file mode 100644
@@ -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" } }