- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Is this a valid standard-conforming Fortran code:
module NonOptionalArg_mod
contains
subroutine nonOptionalArg_func(optionalArg)
integer, intent(in) :: optionalArg
!write(*,*) "optionalArg: ", optionalArg
end subroutine nonOptionalArg_func
end module NonOptionalArg_mod
module OptionalArg_mod
use NonOptionalArg_mod
contains
subroutine optionalArg_func(optionalArg)
integer, intent(in), optional :: optionalArg
call nonOptionalArg_func(optionalArg)
end subroutine optionalArg_func
end module OptionalArg_mod
program optionalProg
use OptionalArgFirst_mod
implicit none
call optionalArg_func()
end program optionalProg
The main program calls a subroutine that takes an optional argument. The function then passes the non-existing optional argument to another function that takes a non-optional argument. The code compiles fine with ifort 19.4 and as long the optional argument is not used, it does not lead to any runtime errors.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
By passing an optional argument as an actual argument to a subprogram, which in turn expects that argument to be always present, you deprive yourself of the ability to check in that subprogram whether the argument is present and only use it if it is present.
Another way of viewing the situation is to regard an optional argument as being represented by a null-pointer. You can pass that null-pointer around, as long as it never gets dereferenced or checked for nullity. This is somewhat analogous to having an argument that is allocatable in the caller but has not been declared as allocatable in the callee.
In your program, on Line-19, "use OptionalArgFirst_mod" should have been "use OptionalArg_mod"
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The standard says "a nonoptional dummy argument shall be present". In your example, it isn't, so your program is non-conforming. The standard does not require detection of this behavior and you should not rely on what happens now.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page