I wrote:
> > One of my compilers was perfectly happy to accept an optional dummy
> > argument as an I/O specifier, viz. "advance=adv", where "adv" was
> > an optional dummy argument.
> >
> > Furthermore, if the actual argument associated with "adv" was not
> > present, the run-time was perfectly happy to pretend I hadn't
> > specified "advance=".
> >
> > I found this to be rather elegant, but I suspect it isn't standard-
> > conforming behavior. The section on I/O statements is quite large,
> > however, so I'm not sure whether there's something therein that defines
> > specifier values or variables to behave like actual arguments associated
> > with optional dummy arguments, and I missed it, or there's nothing
> > there.
And Philip Helbig wrote the following, which is what I expected to be
the case. Does anybody know, by studying a standard, which behavior is
standard-conforming? I suspect Philip's compiler is standard conforming,
and mine isn't. (But it would be cool if it were the other way around!)
> PROGRAM TEST
> PRINT*, 'YES' ! works as expected
> CALL TEST_ADV("YES")
> PRINT*
> PRINT*, 'NO' ! works as expected
> CALL TEST_ADV("NO")
> PRINT*
> !PRINT*, 'NOTHING' ! causes access violation and crashes
> !CALL TEST_ADV()
> !PRINT*
> !PRINT*, 'NOTHING' ! causes access violation and crashes
> !CALL TEST_ADV
> !PRINT*
> !PRINT*, 'INVALID' ! gives "%FOR-F-INVARGFOR, invalid argument
> ! to FORTRAN Run-Time Library" and crashes
> !CALL TEST_ADV("VAN_SNYDER")
> END
> SUBROUTINE TEST_ADV(ADV)
> CHARACTER (LEN=*), OPTIONAL, INTENT(IN) :: ADV
> WRITE (*,'(T2,A)',ADVANCE=ADV) "first"
> WRITE (*,'(TR1,A)',ADVANCE="YES") "second"
> END
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|