http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52864

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2012-04-04
     Ever Confirmed|0                           |1

--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-04-04 
14:23:09 UTC ---
Interesting issue. The problem is that
  ptr = <value>
is valid while
  nonptr = <value>
is not. That was checked via "is_pointer". However, "ptr(1,1)" has is_pointer
== false (which is correct).

On the other hand, "check_intentin" handles both pointer assignments and normal
assignment. While for pointers:
  ptr%ptr => null()
is valid, the following isn't
  ptr => null()
By contrast,
  val = value
  val%val = value
are valid.

Solution: Set check_intentin differently for assignments than for pointer
assignments.

Draft patch.

--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -4654,11 +4654,15 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer,
bool alloc_obj,
   for (ref = e->ref; ref && check_intentin; ref = ref->next)
     {
       if (ptr_component && ref->type == REF_COMPONENT)
        check_intentin = false;
       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
-       ptr_component = true;
+       {
+         ptr_component = true;
+         if (!pointer)
+           check_intentin = false;
+       }
     }
   if (check_intentin && sym->attr.intent == INTENT_IN)
     {
       if (pointer && is_pointer)
        {

Reply via email to