On 3/14/2013 10:40 AM, Tobias Burnus wrote:
Mark Hounschell wrote:
When I use -std=f95 this fortran77 code will not compile.
Well, then the code is not a valid Fortran 77 code* but uses some
vendor extension; using vendor extensions is very common with old
so-called "Fortran 77" code. (* valid = valid according to the Fortran
77 standard, cf. http://gcc.gnu.org/wiki/GFortranStandards ) Using
-std=gnu and -std=legacy, gfortran enables support for some more or
less common vendor extensions.
What I meant before is that using -std=gnu (the default) doesn't
disable the support for features which are in -std=f2003. Similarly
for -std=legacy, which should also add only new features without
disabling others.
Using the default "gnu" mostly just lots of warnings show up. Is
"if(present(arg2)) arg2 = 0" available when using gnu?
Yes, it is definitely available with both -std=gnu and -std=legacy.
However, it requires you declare the dummy argument as OPTIONAL.
Maybe my warnings can be suppressed with other switches.
Well, using -std=gnu or -std=legacy to silence those warnings is fine;
as written, they essentially just allow more features, which should
usually not break things.
Hmm, I have not seen the ",)" syntax before. I assume that that is some
vendor extension, where the compiler does something - or a typo and it
should be "arg1)" without ",".
No, the "," is how this old compiler knows I'm not passing that arg.
The same could be done as
call (arg1,,arg3)
Indicating arg2 was not passed. Also, the very last arg can always be
left out without using the ",".
Seems as if this is a vendor extension, which only few compilers
support. I just tried the compilers of PGI, PathScale, NAG, SUN, Cray,
and Intel - and only Intel's ifort seems to support this extension.
And, doing some digging, I also found out that GCC's g77 supports this
feature:
http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Ugly-Null-Arguments.html
(g77 is the predecessor of gfortran. gfortran was written from scratch
to support Fortran 90+. It has most but not not all legacy features of
g77. [On the other hand, it has some vendor extensions which g77 does
not have.])
Thus, one option would be to use GCC 3.4.6's g77. However, GCC 3.x and
g77 are no longer supported and g77 also only supports very few
Fortran 90 features. Thus, I think it would be best to change the code
to be fully Fortran conform.
Actually, I wonder how ifort and g77 pass those 'null arguments'; or
rather, how to use then in the called procedure. Something PRESENT()
does not seem to exist. g77's documentation does not tell this (but
one can look at the source code) and Intel's documentation does not
mention this feature.
Regarding gfortran: In principle, one could add support for null
arguments; however, given that they seem to be only in few old codes,
I don't think that this has a high priority.
Tobias
I do recall following the g77/gcc documentation on optional arguments
when implementing date_and_time, so you might check libg2c source code
as well as continuing documentation search, if you're sufficiently
interested. I don't think anyone considered it as more than a stop-gap
while waiting for the nearly miraculous advent of gfortran. You had to
be very careful about the subset usages of date_and_time for VMS Fortran
and g77 which we used for y2k qualification, although the compiler would
normally tell you if you over-stepped the limits.
--
Tim Prince