Hi:
I'm debugging some truly insane code, have isolated an issue illustrated
by the following example.
module a_mod
type :: some_type
integer :: some_stuff
end type some_type
type :: type1
type(some_type) :: foo
end type type1
type :: type2
type(some_type), pointer :: bar => null()
end type type2
contains
function foo_ptr (t1)
type(type1), intent(in), target :: t1
type(some_type), pointer :: foo_ptr
foo_ptr => t1%foo
end function foo_ptr
subroutine set_bar_ptr (t2, st)
type(type2), intent(out) :: t2
type(some_type), intent(in), target :: st
t2%bar => st
end subroutine set_bar_ptr
end module a_mod
program test_it
use a_mod
type(type1), target :: t1
type(type2) :: t2
call set_bar_ptr (t2, foo_ptr(t1))
print *, associated(t2%bar, t1%foo) ! TRUE OR FALSE?
end program test_it
What value should the ASSOCIATED instrinsic return? Of the compilers
I've tried, all return true except for one. This latter one appears
to have passed a _copy_ of t1%foo to set_bar_ptr, and when this copy
is deallocated after returning, the pointer t2%bar is left dangling.
Indeed, is it illegal to pass an expression as the second argument to
set_bar_ptr (even when the result of that expression is a pointer)?
If I pass a variable, this works; or if I make the second dummy argument
of set_bar_ptr a pointer it works too.
Thoughts/comments?
Thanks!
Neil
--
Neil Carlson <[log in to unmask]>
|