(j3.2006) Interp 000068 and Fortran 2003

Richard E Maine Richard.Maine
Wed Jan 3 12:00:49 EST 2007

On Jan 2, 2007, at 2:02 PM, Michael Ingrassia wrote:

> Interp 000068...
> It says that the I/O unit identified by an asterisk for input or  
> output
> cannot correspond to more than one external unit.
> On the face of it, that implies an implementation that takes advantage
> of Fortran 2003's permission to use negative unit numbers for
> INPUT_UNIT and OUTPUT_UNIT would have to give up using units 5 and 6
> (respectively), because otherwise (say) stdin would be associated with
> both unit 5 and a unit with negative unit number.

Um... Did you actually read the fill text of the interp? It  
explicitly addresses this. Namely, it says

    Note however that a processor extension may have two units connected
    to the same file - e.g. unit 6 and the * output unit might both
    identify the user's display device.  This is not detectable by a
    standard-conforming program, but in this case closing unit 6 would
    not necessarily affect output to the display device via *.

In particular, you probably forgot the important fundamental point  
that the standard primarily defines standard-conforming programs.  
Standard-conforming processors are indirectly defined in terms of  
being able to process standard-conforming programs.

The interp does *NOT* say that a processor can't have two units  
connected to the same file. In fact, the above quotation specifically  
mentions such a thing as a possibly valid processor extension. The  
interp just says that a standard-conforming program can't rely on  
this feature.

> Somehow, it doesn't seem likely (to this vendor) that users would  
> let us
> stop using units 5 and 6 for stdin/stdout.  Doesn't this make negative
> unit numbers completely unusable in practice ?

If I recall correctly (and I might not), the negative unit number  
option was there mostly for vendors who do not currently use 5/6. I'm  
not off-hand sure why a vendor who currently uses 5/6 would want to  
add a negative number as an additional option. Perhaps there is a  
reason, but I can't recall it. (Later. Oh yes, I recalled one. See  

I think there was also some "funniness" about current implementations  
where * was *NOT* the same thing as 6. Both displayed on the  
terminal, but they were in some senses separate files such that, for  
example, closing 6 did not affect output to *. Apparently some users  
even expect that behavior. In fact, I distinctly recall objecting to  
an earlier version of that interp, which amounted to trying to  
retroactively trying to change the standard to specify the behaviors  
expected by those users. I objected because some other users (such as  
myself) did not expect that behavior. Since it was not an error or  
other inconsistency in the standard, I thought it inappropriate to  
make an incompatible change retroactively.

The business about disallowing multiple unit numbers connected to the  
same file has been in the standard since f77. It is explicit and  
clear and applies to all unit numbers. Yes, I think I recall both  
compilers that didn't enforce it and programs that took advantage of  
that lack of enforcement, treating it as a "feature" (even for files  
other than stdin/stdout). The compilers weren't necessarily non- 
standard. The programs were.

> Assuming that negative unit numbers as permitted by the standard were
> intended to be implemented, doesn't that mean that stdout (say) might
> be identified with more than one external unit?  (Say, unit -3 and  
> unit 6).
> Do we need an interp to say so?
> If so, should closing unit -3 affect unit 6 or vice versa ?

No we don't need an interp. I don't think we ever did, as the  
existing language of the standard seemed explicit to me. Interp 68  
was an attempt to retroactively change the standard. It wasn't  
actually about an error or even lack of clarity in the standard. Some  
people just didn't like what the standard clearly said. We certainly  
don't need another interp on exactly the same thing.

As the existing interp says

   "This is not detectable by a standard-conforming program.."

That is, if the program depends on this, it is not standard  
conforming. And

   " in this case closing unit 6 would not necessarily affect output  
to the display device via *"

Not the "necessarily". That's pretty explicitly leaving it up to the  
compiler... just like it always has been.

In fact, on thinking about it, that probably is a reason why some  
vendors would want to use negative numbers as allowed in f2003. If  
the existing implementation keeps * open when 6 is closed, the vendor  
could use a negative number for * and have both that negative number  
and 6 display on the terminal. As mentioned in the above interp, it  
is then allowed for the vendor to choose the behavior where closing 6  
doesn't close * (or the negative number which identifies the same  
unit as *). Since INPUT_UNIT and * are different identifiers for the  
same unit in f2003, the user is allowed to assume that closing (and  
more interestingly, reopening) INPUT_UNIT also affects *. (With the  
"usual" huge loophole that applies to all I/O.) That is, the f2003  
standard forces the relationship between OUTPUT_UNIT and * that some  
vendors now use and that some users (such as myself) find more  
intuitive - they are different identifiers for the same unit. If you  
want a different relationship than that between 6 and *, then make  
OUTPUT_UNIT something other than 6 (possibly negative for minimal  
interference), and you may.

The huge loophole mentioned above is the first para of 9.11 in f2003  
(and similar words in other versions). A vendor can use that loophole  
to "get by" with almost anything relating to I/O in a way that might  
satisfy a lawyer (though it would make users pretty grumpy). In  
particular, a vendor can claim that no units have the properties to  
support any Fortran I/O at all and thus that any program doing what  
looks like Fortran I/O is a non-standard program using a vendor  
extension instead of standard Fortran I/O, where the vendor extension  
just happens to look a lot like standard Fortran I/O with whatever  
exceptions the vendor wants. I wouldn't try that argument on a  
customer unless there was *REALLY* good reason for it (an embedded  
system where there are no physical I/O devices might qualify as a  
really good reason, but that's rare - though such beasts have existed).

Richard Maine                |  Good judgment comes from experience;
Richard.Maine at nasa.gov       |  experience comes from bad judgment.
                             |        -- Mark Twain

More information about the J3 mailing list