Go to the first, previous, next, last section, table of contents.
Warnings are diagnostic messages that report constructions which
are not inherently erroneous but which are risky or suggest there
might have been an error.
You can request many specific warnings with options beginning `-W',
for example `-Wimplicit' to request warnings on implicit
declarations. Each of these specific warning options also has a
negative form beginning `-Wno-' to turn off warnings;
for example, `-Wno-implicit'. This manual lists only one of the
two forms, whichever is not the default.
These options control the amount and kinds of warnings produced by GNU
Fortran:
-fsyntax-only
-
Check the code for syntax errors, but don't do anything beyond that.
-pedantic
-
Issue warnings for uses of extensions to ANSI FORTRAN 77.
`-pedantic' also applies to C-language constructs where they
occur in GNU Fortran source files, such as use of `\e' in a
character constant within a directive like `#include'.
Valid ANSI FORTRAN 77 programs should compile properly with or without
this option.
However, without this option, certain GNU extensions and traditional
Fortran features are supported as well.
With this option, many of them are rejected.
Some users try to use `-pedantic' to check programs for strict ANSI
conformance.
They soon find that it does not do quite what they want--it finds some
non-ANSI practices, but not all.
However, improvements to
g77
in this area are welcome.
-pedantic-errors
-
Like `-pedantic', except that errors are produced rather than
warnings.
-fpedantic
-
Like `-pedantic', but applies only to Fortran constructs.
-w
-
Inhibit all warning messages.
-Wno-globals
-
Inhibit warnings about use of a name as both a global name
(a subroutine, function, or block data program unit, or a
common block) and implicitly as the name of an intrinsic
in a source file.
Also inhibit warnings about inconsistent invocations and/or
definitions of global procedures (function and subroutines).
Such inconsistencies include different numbers of arguments
and different types of arguments.
-Wimplicit
-
Warn whenever a variable, array, or function is implicitly
declared.
Has an effect similar to using the
IMPLICIT NONE
statement
in every program unit.
(Some Fortran compilers provide this feature by an option
named `-u' or `/WARNINGS=DECLARATIONS'.)
-Wunused
-
Warn whenever a variable is unused aside from its declaration.
-Wuninitialized
-
Warn whenever an automatic variable is used without first being initialized.
These warnings are possible only in optimizing compilation,
because they require data-flow information that is computed only
when optimizing. If you don't specify `-O', you simply won't
get these warnings.
These warnings occur only for variables that are candidates for
register allocation. Therefore, they do not occur for a variable
whose address is taken, or whose size
is other than 1, 2, 4 or 8 bytes. Also, they do not occur for
arrays, even when they are in registers.
Note that there might be no warning about a variable that is used only
to compute a value that itself is never used, because such
computations may be deleted by data-flow analysis before the warnings
are printed.
These warnings are made optional because GNU Fortran is not smart
enough to see all the reasons why the code might be correct
despite appearing to have an error. Here is one example of how
this can happen:
SUBROUTINE DISPAT(J)
IF (J.EQ.1) I=1
IF (J.EQ.2) I=4
IF (J.EQ.3) I=5
CALL FOO(I)
END
If the value of J
is always 1, 2 or 3, then I
is
always initialized, but GNU Fortran doesn't know this. Here is
another common case:
SUBROUTINE MAYBE(FLAG)
LOGICAL FLAG
IF (FLAG) VALUE = 9.4
...
IF (FLAG) PRINT *, VALUE
END
This has no bug because VALUE
is used only if it is set.
-Wall
-
The `-Wunused' and `-Wuninitialized' options combined.
These are all the
options which pertain to usage that we recommend avoiding and that we
believe is easy to avoid.
(As more warnings are added to
g77
, some might
be added to the list enabled by `-Wall'.)
The remaining `-W...' options are not implied by `-Wall'
because they warn about constructions that we consider reasonable to
use, on occasion, in clean programs.
-Wsurprising
-
Warn about "suspicious" constructs that are interpreted
by the compiler in a way that might well be surprising to
someone reading the code.
These differences can result in subtle, compiler-dependent
(even machine-dependent) behavioral differences.
The constructs warned about include:
-
Expressions having two arithmetic operators in a row, such
as `X*-Y'.
Such a construct is nonstandard, and can produce
unexpected results in more complicated situations such
as `X**-Y*Z'.
g77
, along with many other compilers, interprets
this example differently than many programmers, and a few
other compilers.
Specifically, g77
interprets `X**-Y*Z' as
`(X**(-Y))*Z', while others might think it should
be interpreted as `X**(-(Y*Z))'.
A revealing example is the constant expression `2**-2*1.',
which g77
evaluates to .25, while others might evaluate
it to 0., the difference resulting from the way precedence affects
type promotion.
(The `-fpedantic' option also warns about expressions
having two arithmetic operators in a row.)
-
Expressions with a unary minus followed by an operand and then
a binary operator other than plus or minus.
For example, `-2**2' produces a warning, because
the precedence is `-(2**2)', yielding -4, not
`(-2)**2', which yields 4, and which might represent
what a programmer expects.
An example of an expression producing different results
in a surprising way is `-I*S', where I holds
the value `-2147483648' and S holds `0.5'.
On many systems, negating I results in the same
value, not a positive number, because it is already the
lower bound of what an
INTEGER(KIND=1)
variable can hold.
So, the expression evaluates to a positive number, while
the "expected" interpretation, `(-I)*S', would
evaluate to a negative number.
Even cases such as `-I*J' produce warnings,
even though, in most configurations and situations,
there is no computational difference between the
results of the two interpretations--the purpose
of this warning is to warn about differing interpretations
and encourage a better style of coding, not to identify
only those places where bugs might exist in the user's
code.
-
DO
loops with DO
variables that are not
of integral type--that is, using REAL
variables as loop control variables.
Although such loops can be written to work in the
"obvious" way, the way g77
is required by the
Fortran standard to interpret such code is likely to
be quite different from the way many programmers expect.
(This is true of all DO
loops, but the differences
are pronounced for non-integral loop control variables.)
See section Loops, for more information.
-Werror
-
Make all warnings into errors.
-W
-
Turns on "extra warnings" and, if optimization is specified
via `-O', the `-Wuninitialized' option.
(This might change in future versions of
g77
.)
"Extra warnings" are issued for:
-
Unused parameters to a procedure (when `-Wunused' also is
specified).
-
Overflows involving floating-point constants (not available
for certain configurations).
See section `Options to Request or Suppress Warnings' in Using and Porting GNU CC, for information on more options offered
by the GBE shared by g77
, gcc
, and other GNU compilers.
Some of these have no effect when compiling programs written in Fortran:
-Wcomment
-
-Wformat
-
-Wparentheses
-
-Wswitch
-
-Wtraditional
-
-Wshadow
-
-Wid-clash-len
-
-Wlarger-than-len
-
-Wconversion
-
-Waggregate-return
-
-Wredundant-decls
-
These options all could have some relevant meaning for
GNU Fortran programs, but are not yet supported.
Go to the first, previous, next, last section, table of contents.