Something that I’ve been thinking about for a while, and which came up again on Stack Overflow recently: I think it would be nice if it were possible to access array elements and class members of function results directly, without having to create a temporary variable.
For example, consider the code:
module m
implicit none
type :: T
integer :: var
contains
procedure :: foo
end type
contains
function foo(this) result(output)
class(T), intent(in) :: this
integer :: output
output = 1
end function
function g() result(output)
integer :: output(10)
output = 1
end function
function h() result(ouptut)
type(T) :: output
output%var = 1
end function
subroutine main()
type(T) :: array(10)
write(*,*) array(1)%foo()
write(*,*) g()(1)
write(*,*) h()%var
write(*,*) h()%foo()
end subroutine
end module
program p
use m
implicit none
call main()
end program
The first write
statement is fine; it is possible to access a member function of an array element. But the other three write
statements are not allowed by the standard; it is not possible to access an array element of a function result, nor to access a member variable or member function of a function result.
I think allowing this would improve the language, by allowing a number of code patterns to be simplified. See the Stack Overflow question I linked above for one use case.
So, what does everyone think? Is there a reason this could not be allowed by a future standard? Are there downsides I haven’t thought of? Or is it already somewhere at the back of the “TODO” queue?
For what it’s worth, I couldn’t find this suggestion on Issues · j3-fortran/fortran_proposals · GitHub or elsewhere on this site, although I may well have missed it.