(j3.2006) TS 29113: INTENT(out) and TYPE(*)
Tobias Burnus
burnus
Mon Mar 5 04:28:25 EST 2012
Dear all,
I am sure that I just fail to correctly read the standard, but I have problems
with INTENT(OUT).
The following seems to be allowed, but I fail to see how it can work:
type t
integer :: a = 5
end type t
type(t) :: var
var%a = 8
call one(x)
print *, var%a
contains
subroutine one(x)
type(*) :: x
call two(x)
end subroutine two
subroutine two(y) ! optionally with Bind(C).
type(*), intent(out) :: y
end subroutine
end
Seemingly, the standard allows INTENT(OUT) for unlimited polymorphic types -
and in particular for assumed type variables. But on the other hand, the
default initialization is required (F2008, 5.2.10p3):
"The INTENT (OUT) attribute for a nonpointer dummy argument specifies that
the dummy argument becomes undefined on invocation of the procedure, except
for any subcomponents that are default-initialized (4.5.4.6). Any actual
argument that corresponds to such a dummy argument shall be definable.
The INTENT (OUT) attribute for a pointer dummy argument specifies that on
invocation of the procedure the pointer association status of the dummy
argument becomes undefined. Any actual argument that corresponds to such
a pointer dummy shall be a pointer variable. Any undefinition or definition
implied by association of an actual argument with an INTENT (OUT) dummy
argument shall not act any other entity within the statement that invokes
the procedure."
(Besides default initialization, a similar issue also exists for
freeing allocatable components.)
Tobias
PS: I encountered them when thinking about an implementation of TS 29113
in gfortran. There is now a preliminary support of "TYPE(*)" in the
developer version of GCC 4.8.
More information about the J3
mailing list