[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