[Patch, Fortran, OOP] PR 44541: wrong code for polymorphic variable with INTENT(OUT)/Alloc w/ MOLD

Tobias Burnus burnus@net-b.de
Wed Sep 1 17:21:00 GMT 2010


  On 09/01/2010 06:37 PM, Janus Weil wrote:
> Actually I only copied this from the BT_DERIVED case, assuming this
> condition would be the same for both. So probably we should also
> change this for BT_DERIVED dummies, right? How about:

I thought I saw about a year ago a PR that gfortran _warns_ if one does 
not assign to an INTENT(OUT) variable - as the value is set. I thus 
think gfortran most of the time already initializes BT_DERIVED variables.


> @@ -12179,7 +12148,6 @@ resolve_symbol (gfc_symbol *sym)
>        described in 14.7.5, to those variables that have not already
>        been assigned one.  */
>     if (sym->ts.type == BT_DERIVED
> -&&  sym->attr.referenced
>         &&  sym->ns == gfc_current_ns
>         &&  !sym->value
>         &&  !sym->attr.allocatable

That looks fine but ...

> @@ -12187,13 +12155,17 @@ resolve_symbol (gfc_symbol *sym)
>       {
>         symbol_attribute *a =&sym->attr;
>
> -      if ((!a->save&&  !a->dummy&&  !a->pointer
> +      if ((!a->save&&  !a->dummy&&  !a->pointer&&  a->referenced
>   	&&  !a->in_common&&  !a->use_assoc
>   	&&  !(a->function&&  sym != sym->result))
>   	  || (a->dummy&&  a->intent == INTENT_OUT&&  !a->pointer))
>   	apply_default_init (sym);
>       }

I don't think that's correct: We do not want to default initialize 
unused (local) variables. Only dummy arguments - and there is no 
a->referenced  check for them.

The question is: Why are INTENT(OUT) variables already assigned a value? 
I do not want to change the code until one has understood, why the 
following currently works - or until one has found an example which 
fails the the current code. The following example prints "1":

type t
   integer :: i = 1
end type t
type(t) :: a
a%i = 8
call init(a)
print *, a
contains
subroutine init(x)
   type(t), intent(out) :: x
end subroutine
end

> +  if (sym->ts.type == BT_CLASS&&  sym->ns == gfc_current_ns
> +&&  sym->attr.dummy&&  sym->attr.intent == INTENT_OUT)
> +    apply_default_init (sym);

As in the BT_DERIVED checks above, you probably should also check for 
!pointer and !allocatable.

Tobias



More information about the Fortran mailing list