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
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.