language lawyer question
Paul Thomas
paulthomas2@wanadoo.fr
Fri Jan 21 15:36:00 GMT 2005
Paul
>Section 14.6.2.1.3 "Events that cause the association status of a pointer
>to
>become undefined":
>"(3) Execution of a RETURN or END statement that causes a pointer's target
>to
>become undefined."
Surely, this does not happen because the the target is in the scope of the
main program and is pointed to through arguments?
>Section 14.7.6 "Events that cause variables to become undefined":
>"(3) The execution of a RETURN or END statement within a subprogram causes
>all
>variables local to its scoping unit [...] to become undefined [...]"
The targets are not local to the function's scoping unit.
>None of the exceptions listed apply to the case above.
I agree and so do not understand how you conclude:
>Thus the return value of getOa (oa) has undefined pointer association
>status
>after getOa has returned.
>A compiler might allocate ob on the stack, so it will be freed when getOa
>returns.
Does this mean that ob is being passed as a value? I thought that fortran
always passed a reference to the value?
>One way to avoid this is to mark ob as SAVEd
This conflicts with the dummy attribute and the compiler barfs on it.
In fact, the problem lies not in the function getOa but in the treatment of
the temporary in the main program. This works as intended:
program test
use simpleObj
use derivedObj
implicit none
type(objA),target :: oa
type(objA),pointer :: oaptr !add a pointer to an objA
type(objB),target :: ob
call new(oa,1)
call new(ob,oa,2)
call print(ob)
oaptr=>getOa(ob) !assign the pointer function result to
oaptr
call print(oaptr) !instead of its being the argument
of print
end program test
Best regards
Paul T
More information about the Fortran
mailing list