3. Compiling Using gcc
This chapter discusses how to compile Ada programs using the gcc
command. It also describes the set of switches
that can be used to control the behavior of the compiler.
3.1 Compiling Programs
The first step in creating an executable program is to compile the units
of the program using the gcc command. You must compile the
following files:
-
the body file (`.adb') for a library level subprogram or generic
subprogram
-
the spec file (`.ads') for a library level package or generic
package that has no body
-
the body file (`.adb') for a library level package
or generic package that has a body
You need not compile the following files
-
the spec of a library unit which has a body
-
subunits
because they are compiled as part of compiling related units. GNAT
package specs
when the corresponding body is compiled, and subunits when the parent is
compiled.
If you attempt to compile any of these files, you will get one of the
following error messages (where fff is the name of the file you compiled):
| | cannot generate code for file fff (package spec)
to check package spec, use -gnatc
cannot generate code for file fff (missing subunits)
to check parent unit, use -gnatc
cannot generate code for file fff (subprogram spec)
to check subprogram spec, use -gnatc
cannot generate code for file fff (subunit)
to check subunit, use -gnatc
|
As indicated by the above error messages, if you want to submit
one of these files to the compiler to check for correct semantics
without generating code, then use the `-gnatc' switch.
The basic command for compiling a file containing an Ada unit is
| | $ gcc -c [switches] `file name'
|
where file name is the name of the Ada file (usually
having an extension
`.ads' for a spec or `.adb' for a body).
You specify the
`-c' switch to tell gcc to compile, but not link, the file.
The result of a successful compilation is an object file, which has the
same name as the source file but an extension of `.o' and an Ada
Library Information (ALI) file, which also has the same name as the
source file, but with `.ali' as the extension. GNAT creates these
two output files in the current directory, but you may specify a source
file in any directory using an absolute or relative path specification
containing the directory information.
gcc is actually a driver program that looks at the extensions of
the file arguments and loads the appropriate compiler. For example, the
GNU C compiler is `cc1', and the Ada compiler is `gnat1'.
These programs are in directories known to the driver program (in some
configurations via environment variables you set), but need not be in
your path. The gcc driver also calls the assembler and any other
utilities needed to complete the generation of the required object
files.
It is possible to supply several file names on the same gcc
command. This causes gcc to call the appropriate compiler for
each file. For example, the following command lists three separate
files to be compiled:
calls gnat1 (the Ada compiler) twice to compile `x.adb' and
`y.adb', and cc1 (the C compiler) once to compile `z.c'.
The compiler generates three object files `x.o', `y.o' and
`z.o' and the two ALI files `x.ali' and `y.ali' from the
Ada compilations. Any switches apply to all the files listed,
except for
`-gnatx' switches, which apply only to Ada compilations.
3.2 Switches for gcc
The gcc command accepts switches that control the
compilation process. These switches are fully described in this section.
First we briefly list all the switches, in alphabetical order, then we
describe the switches in more detail in functionally grouped sections.
More switches exist for GCC than those documented here, especially
for specific targets. However, their use is not recommended as
they may change code generation in ways that are incompatible with
the Ada run-time library, or can cause inconsistencies between
compilation units.
- `-b target'
- Compile your program to run on target, which is the name of a
system configuration. You must have a GNAT cross-compiler built if
target is not the same as your host system.
- `-Bdir'
-
Load compiler executables (for example,
gnat1, the Ada compiler)
from dir instead of the default location. Only use this switch
when multiple versions of the GNAT compiler are available.
See section `Options for Directory Search' in Using the GNU Compiler Collection (GCC), for further details. You would normally
use the `-b' or `-V' switch instead.
- `-c'
-
Compile. Always use this switch when compiling Ada programs.
Note: for some other languages when using gcc, notably in
the case of C and C++, it is possible to use
use gcc without a `-c' switch to
compile and link in one step. In the case of GNAT, you
cannot use this approach, because the binder must be run
and gcc cannot be used to run the GNAT binder.
- `-fno-inline'
-
Suppresses all back-end inlining, even if other optimization or inlining
switches are set.
This includes suppression of inlining that results
from the use of the pragma
Inline_Always.
Any occurrences of pragma Inline or Inline_Always
are ignored, and `-gnatn' and `-gnatN' have no
effect if this switch is present.
- `-fno-inline-functions'
-
Suppresses automatic inlining of small subprograms, which is enabled
if `-O3' is used.
- `-fno-inline-functions-called-once'
-
Suppresses inlining of subprograms local to the unit and called once
from within it, which is enabled if `-O1' is used.
- `-fno-strict-aliasing'
-
Causes the compiler to avoid assumptions regarding non-aliasing
of objects of different types. See
7.1.7 Optimization and Strict Aliasing for details.
- `-fstack-check'
-
Activates stack checking.
See 22.1 Stack Overflow Checking for details.
- `-fstack-usage'
-
Makes the compiler output stack usage information for the program, on a
per-function basis. See 22.2 Static Stack Usage Analysis for details.
- `-fcallgraph-info[=su]'
-
Makes the compiler output callgraph information for the program, on a
per-file basis. The information is generated in the VCG format. It can
be decorated with stack-usage per-node information.
- `-g'
-
Generate debugging information. This information is stored in the object
file and copied from there to the final executable file by the linker,
where it can be read by the debugger. You must use the
`-g' switch if you plan on using the debugger.
- `-gnat83'
-
Enforce Ada 83 restrictions.
- `-gnat95'
-
Enforce Ada 95 restrictions.
- `-gnat05'
-
Allow full Ada 2005 features.
- `-gnata'
-
Assertions enabled.
Pragma Assert and pragma Debug to be
activated. Note that these pragmas can also be controlled using the
configuration pragmas Assertion_Policy and Debug_Policy.
It also activates pragmas Check, Precondition, and
Postcondition. Note that these pragmas can also be controlled
using the configuration pragma Check_Policy.
- `-gnatA'
-
Avoid processing `gnat.adc'. If a `gnat.adc' file is present,
it will be ignored.
- `-gnatb'
-
Generate brief messages to `stderr' even if verbose mode set.
- `-gnatc'
-
Check syntax and semantics only (no code generation attempted).
- `-gnatd'
-
Specify debug options for the compiler. The string of characters after
the `-gnatd' specify the specific debug options. The possible
characters are 0-9, a-z, A-Z, optionally preceded by a dot. See
compiler source file `debug.adb' for details of the implemented
debug options. Certain debug options are relevant to applications
programmers, and these are documented at appropriate points in this
users guide.
- `-gnatD'
-
Create expanded source files for source level debugging. This switch
also suppress generation of cross-reference information
(see `-gnatx').
- `-gnatec=path'
-
Specify a configuration pragma file
(the equal sign is optional)
(see section 9.2 The Configuration Pragmas Files).
- `-gnateDsymbol[=value]'
-
Defines a symbol, associated with value, for preprocessing.
(see section 3.2.17 Integrated Preprocessing).
- `-gnatef'
-
Display full source path name in brief error messages.
- `-gnatem=path'
-
Specify a mapping file
(the equal sign is optional)
(see section 3.2.16 Units to Sources Mapping Files).
- `-gnatep=file'
-
Specify a preprocessing data file
(the equal sign is optional)
(see section 3.2.17 Integrated Preprocessing).
- `-gnatE'
-
Full dynamic elaboration checks.
- `-gnatf'
-
Full errors. Multiple errors per line, all undefined references, do not
attempt to suppress cascaded errors.
- `-gnatF'
-
Externals names are folded to all uppercase.
- `-gnatg'
-
Internal GNAT implementation mode. This should not be used for
applications programs, it is intended only for use by the compiler
and its run-time library. For documentation, see the GNAT sources.
Note that `-gnatg' implies
`-gnatwae' and
`-gnatyg'
so that all standard warnings and all standard style options are turned on.
All warnings and style error messages are treated as errors.
- `-gnatG'
-
List generated expanded code in source form.
- `-gnath'
-
Output usage information. The output is written to `stdout'.
- `-gnatic'
-
Identifier character set
(c=1/2/3/4/8/9/p/f/n/w).
For details of the possible selections for c,
see 3.2.10 Character Set Control.
- `-gnatI'
-
Ignore representation clauses. When this switch is used, all
representation clauses are treated as comments. This is useful
when initially porting code where you want to ignore rep clause
problems, and also for compiling foreign code (particularly
for use with ASIS).
- `-gnatjnn'
-
Reformat error messages to fit on nn character lines
- `-gnatk=n'
-
Limit file names to n (1-999) characters (
k = krunch).
- `-gnatl'
-
Output full source listing with embedded error messages.
- `-gnatL'
-
Used in conjunction with -gnatG or -gnatD to intersperse original
source lines (as comment lines with line numbers) in the expanded
source output.
- `-gnatm=n'
-
Limit number of detected error or warning messages to n
where n is in the range 1..999_999. The default setting if
no switch is given is 9999. Compilation is terminated if this
limit is exceeded. The equal sign here is optional.
- `-gnatn'
-
Activate inlining for subprograms for which
pragma
inline is specified. This inlining is performed
by the GCC back-end.
- `-gnatN'
-
Activate front end inlining for subprograms for which
pragma
Inline is specified. This inlining is performed
by the front end and will be visible in the
`-gnatG' output.
In some cases, this has proved more effective than the back end
inlining resulting from the use of
`-gnatn'.
Note that
`-gnatN' automatically implies
`-gnatn' so it is not necessary
to specify both options. There are a few cases that the back-end inlining
catches that cannot be dealt with in the front-end.
- `-gnato'
-
Enable numeric overflow checking (which is not normally enabled by
default). Not that division by zero is a separate check that is not
controlled by this switch (division by zero checking is on by default).
- `-gnatp'
-
Suppress all checks.
- `-gnatP'
-
Enable polling. This is required on some systems (notably Windows NT) to
obtain asynchronous abort and asynchronous transfer of control capability.
See section `Pragma Polling' in GNAT Reference Manual, for full
details.
- `-gnatq'
-
Don't quit; try semantics, even if parse errors.
- `-gnatQ'
-
Don't quit; generate `ALI' and tree files even if illegalities.
- `-gnatR[0/1/2/3[s]]'
-
Output representation information for declared types and objects.
- `-gnats'
-
Syntax check only.
- `-gnatS'
-
Print package Standard.
- `-gnatt'
-
Generate tree output file.
- `-gnatTnnn'
-
All compiler tables start at nnn times usual starting size.
- `-gnatu'
-
List units for this compilation.
- `-gnatU'
-
Tag all error messages with the unique string "error:"
- `-gnatv'
-
Verbose mode. Full error output with source lines to `stdout'.
- `-gnatV'
-
Control level of validity checking. See separate section describing
this feature.
- `-gnatwxxx'
-
Warning mode where
xxx is a string of option letters that denotes
the exact warnings that
are enabled or disabled (see section 3.2.2 Warning Message Control).
- `-gnatWe'
-
Wide character encoding method
(e=n/h/u/s/e/8).
- `-gnatx'
-
Suppress generation of cross-reference information.
- `-gnaty'
-
Enable built-in style checks (see section 3.2.5 Style Checking).
- `-gnatzm'
-
Distribution stub generation and compilation
(m=r/c for receiver/caller stubs).
- `-Idir'
-
Direct GNAT to search the dir directory for source files needed by
the current compilation
(see section 3.3 Search Paths and the Run-Time Library (RTL)).
- `-I-'
-
Except for the source file named in the command line, do not look for source
files in the directory containing the source file named in the command line
(see section 3.3 Search Paths and the Run-Time Library (RTL)).
- `-mbig-switch'
-
This standard gcc switch causes the compiler to use larger offsets in its
jump table representation for
case statements.
This may result in less efficient code, but is sometimes necessary
(for example on HP-UX targets)
in order to compile large and/or nested case statements.
- `-o file'
-
This switch is used in
gcc to redirect the generated object file
and its associated ALI file. Beware of this switch with GNAT, because it may
cause the object file and ALI file to have different names which in turn
may confuse the binder and the linker.
- `-nostdinc'
-
Inhibit the search of the default location for the GNAT Run Time
Library (RTL) source files.
- `-nostdlib'
-
Inhibit the search of the default location for the GNAT Run Time
Library (RTL) ALI files.
- `-O[n]'
-
n controls the optimization level.
- n = 0
- No optimization, the default setting if no `-O' appears
- n = 1
- Normal optimization, the default if you specify `-O' without
an operand. A good compromise between code quality and compilation
time.
- n = 2
- Extensive optimization, may improve execution time, possibly at the cost of
substantially increased compilation time.
- n = 3
- Same as `-O2', and also includes inline expansion for small subprograms
in the same unit.
- n = s
- Optimize space usage
See also 7.1.3 Optimization Levels.
- `-pass-exit-codes'
-
Catch exit codes from the compiler and use the most meaningful as
exit status.
- `--RTS=rts-path'
-
Specifies the default location of the runtime library. Same meaning as the
equivalent
gnatmake flag (see section 6.2 Switches for gnatmake).
- `-S'
-
Used in place of `-c' to
cause the assembler source file to be
generated, using `.s' as the extension,
instead of the object file.
This may be useful if you need to examine the generated assembly code.
- `-fverbose-asm'
-
Used in conjunction with `-S'
to cause the generated assembly code file to be annotated with variable
names, making it significantly easier to follow.
- `-v'
-
Show commands generated by the
gcc driver. Normally used only for
debugging purposes or if you need to be sure what version of the
compiler you are executing.
- `-V ver'
-
Execute ver version of the compiler. This is the
gcc
version, not the GNAT version.
- `-w'
-
Turn off warnings generated by the back end of the compiler. Use of
this switch also causes the default for front end warnings to be set
to suppress (as though `-gnatws' had appeared at the start of
the options).
You may combine a sequence of GNAT switches into a single switch. For
example, the combined switch
is equivalent to specifying the following sequence of switches:
The following restrictions apply to the combination of switches
in this manner:
-
The switch `-gnatc' if combined with other switches must come
first in the string.
-
The switch `-gnats' if combined with other switches must come
first in the string.
-
The switches
`-gnatz', `-gnatzc', and `-gnatzr'
may not be combined with any other switches.
-
Once a "y" appears in the string (that is a use of the `-gnaty'
switch), then all further characters in the switch are interpreted
as style modifiers (see description of `-gnaty').
-
Once a "d" appears in the string (that is a use of the `-gnatd'
switch), then all further characters in the switch are interpreted
as debug flags (see description of `-gnatd').
-
Once a "w" appears in the string (that is a use of the `-gnatw'
switch), then all further characters in the switch are interpreted
as warning mode modifiers (see description of `-gnatw').
-
Once a "V" appears in the string (that is a use of the `-gnatV'
switch), then all further characters in the switch are interpreted
as validity checking options (see description of `-gnatV').
3.2.1 Output and Error Message Control
The standard default format for error messages is called "brief format".
Brief format messages are written to `stderr' (the standard error
file) and have the following form:
| | e.adb:3:04: Incorrect spelling of keyword "function"
e.adb:4:20: ";" should be "is"
|
The first integer after the file name is the line number in the file,
and the second integer is the column number within the line.
GPS can parse the error messages
and point to the referenced character.
The following switches provide control over the error message
format:
- `-gnatv'
-
The v stands for verbose.
The effect of this setting is to write long-format error
messages to `stdout' (the standard output file.
The same program compiled with the
`-gnatv' switch would generate:
| | 3. funcion X (Q : Integer)
|
>>> Incorrect spelling of keyword "function"
4. return Integer;
|
>>> ";" should be "is"
|
The vertical bar indicates the location of the error, and the `>>>'
prefix can be used to search for error messages. When this switch is
used the only source lines output are those with errors.
- `-gnatl'
-
The
l stands for list.
This switch causes a full listing of
the file to be generated. In the case where a body is
compiled, the corresponding spec is also listed, along
with any subunits. Typical output from compiling a package
body `p.adb' might look like:
| | Compiling: p.adb
1. package body p is
2. procedure a;
3. procedure a is separate;
4. begin
5. null
|
>>> missing ";"
6. end;
Compiling: p.ads
1. package p is
2. pragma Elaborate_Body
|
>>> missing ";"
3. end p;
Compiling: p-a.adb
1. separate p
|
>>> missing "("
2. procedure a is
3. begin
4. null
|
>>> missing ";"
5. end;
|
When you specify the `-gnatv' or `-gnatl' switches and
standard output is redirected, a brief summary is written to
`stderr' (standard error) giving the number of error messages and
warning messages generated.
- `-gnatl=file'
-
This has the same effect as `-gnatl' except that the output is
written to a file instead of to standard output. If the given name
`fname' does not start with a period, then it is the full name
of the file to be written. If `fname' is an extension, it is
appended to the name of the file being compiled. For example, if
file `xyz.adb' is compiled with `-gnatl=.lst',
then the output is written to file xyz.adb.lst.
- `-gnatU'
-
This switch forces all error messages to be preceded by the unique
string "error:". This means that error messages take a few more
characters in space, but allows easy searching for and identification
of error messages.
- `-gnatb'
-
The
b stands for brief.
This switch causes GNAT to generate the
brief format error messages to `stderr' (the standard error
file) as well as the verbose
format message or full listing (which as usual is written to
`stdout' (the standard output file).
- `-gnatm=n'
-
The
m stands for maximum.
n is a decimal integer in the
range of 1 to 999 and limits the number of error messages to be
generated. For example, using `-gnatm2' might yield
| | e.adb:3:04: Incorrect spelling of keyword "function"
e.adb:5:35: missing ".."
fatal error: maximum errors reached
compilation abandoned
|
Note that the equal sign is optional, so the switches
`-gnatm2' and `-gnatm=2' are equivalent.
- `-gnatf'
-
The
f stands for full.
Normally, the compiler suppresses error messages that are likely to be
redundant. This switch causes all error
messages to be generated. In particular, in the case of
references to undefined variables. If a given variable is referenced
several times, the normal format of messages is
| | e.adb:7:07: "V" is undefined (more references follow)
|
where the parenthetical comment warns that there are additional
references to the variable V. Compiling the same program with the
`-gnatf' switch yields
| | e.adb:7:07: "V" is undefined
e.adb:8:07: "V" is undefined
e.adb:8:12: "V" is undefined
e.adb:8:16: "V" is undefined
e.adb:9:07: "V" is undefined
e.adb:9:12: "V" is undefined
|
The `-gnatf' switch also generates additional information for
some error messages. Some examples are:
-
Full details on entities not available in high integrity mode
-
Details on possibly non-portable unchecked conversion
-
List possible interpretations for ambiguous calls
-
Additional details on incorrect parameters
- `-gnatjnn'
-
In normal operation mode (or if `-gnatj0' is used, then error messages
with continuation lines are treated as though the continuation lines were
separate messages (and so a warning with two continuation lines counts as
three warnings, and is listed as three separate messages).
If the `-gnatjnn' switch is used with a positive value for nn, then
messages are output in a different manner. A message and all its continuation
lines are treated as a unit, and count as only one warning or message in the
statistics totals. Furthermore, the message is reformatted so that no line
is longer than nn characters.
- `-gnatq'
-
The
q stands for quit (really "don't quit").
In normal operation mode, the compiler first parses the program and
determines if there are any syntax errors. If there are, appropriate
error messages are generated and compilation is immediately terminated.
This switch tells
GNAT to continue with semantic analysis even if syntax errors have been
found. This may enable the detection of more errors in a single run. On
the other hand, the semantic analyzer is more likely to encounter some
internal fatal error when given a syntactically invalid tree.
- `-gnatQ'
-
In normal operation mode, the `ALI' file is not generated if any
illegalities are detected in the program. The use of `-gnatQ' forces
generation of the `ALI' file. This file is marked as being in
error, so it cannot be used for binding purposes, but it does contain
reasonably complete cross-reference information, and thus may be useful
for use by tools (e.g., semantic browsing tools or integrated development
environments) that are driven from the `ALI' file. This switch
implies `-gnatq', since the semantic phase must be run to get a
meaningful ALI file.
In addition, if `-gnatt' is also specified, then the tree file is
generated even if there are illegalities. It may be useful in this case
to also specify `-gnatq' to ensure that full semantic processing
occurs. The resulting tree file can be processed by ASIS, for the purpose
of providing partial information about illegal units, but if the error
causes the tree to be badly malformed, then ASIS may crash during the
analysis.
When `-gnatQ' is used and the generated `ALI' file is marked as
being in error, gnatmake will attempt to recompile the source when it
finds such an `ALI' file, including with switch `-gnatc'.
Note that `-gnatQ' has no effect if `-gnats' is specified,
since ALI files are never generated if `-gnats' is set.
3.2.2 Warning Message Control
In addition to error messages, which correspond to illegalities as defined
in the Ada Reference Manual, the compiler detects two kinds of warning
situations.
First, the compiler considers some constructs suspicious and generates a
warning message to alert you to a possible error. Second, if the
compiler detects a situation that is sure to raise an exception at
run time, it generates a warning message. The following shows an example
of warning messages:
| | e.adb:4:24: warning: creation of object may raise Storage_Error
e.adb:10:17: warning: static value out of range
e.adb:10:17: warning: "Constraint_Error" will be raised at run time
|
GNAT considers a large number of situations as appropriate
for the generation of warning messages. As always, warnings are not
definite indications of errors. For example, if you do an out-of-range
assignment with the deliberate intention of raising a
Constraint_Error exception, then the warning that may be
issued does not indicate an error. Some of the situations for which GNAT
issues warnings (at least some of the time) are given in the following
list. This list is not complete, and new warnings are often added to
subsequent versions of GNAT. The list is intended to give a general idea
of the kinds of warnings that are generated.
-
Possible infinitely recursive calls
-
Out-of-range values being assigned
-
Possible order of elaboration problems
-
Assertions (pragma Assert) that are sure to fail
-
Unreachable code
-
Address clauses with possibly unaligned values, or where an attempt is
made to overlay a smaller variable with a larger one.
-
Fixed-point type declarations with a null range
-
Direct_IO or Sequential_IO instantiated with a type that has access values
-
Variables that are never assigned a value
-
Variables that are referenced before being initialized
-
Task entries with no corresponding
accept statement
-
Duplicate accepts for the same task entry in a
select
-
Objects that take too much storage
-
Unchecked conversion between types of differing sizes
-
Missing
return statement along some execution path in a function
-
Incorrect (unrecognized) pragmas
-
Incorrect external names
-
Allocation from empty storage pool
-
Potentially blocking operation in protected type
-
Suspicious parenthesization of expressions
-
Mismatching bounds in an aggregate
-
Attempt to return local value by reference
-
Premature instantiation of a generic body
-
Attempt to pack aliased components
-
Out of bounds array subscripts
-
Wrong length on string assignment
-
Violations of style rules if style checking is enabled
-
Unused
with clauses
-
Bit_Order usage that does not have any effect
-
Standard.Duration used to resolve universal fixed expression
-
Dereference of possibly null value
-
Declaration that is likely to cause storage error
-
Internal GNAT unit
with'ed by application unit
-
Values known to be out of range at compile time
-
Unreferenced labels and variables
-
Address overlays that could clobber memory
-
Unexpected initialization when address clause present
-
Bad alignment for address clause
-
Useless type conversions
-
Redundant assignment statements and other redundant constructs
-
Useless exception handlers
-
Accidental hiding of name by child unit
-
Access before elaboration detected at compile time
-
A range in a
for loop that is known to be null or might be null
The following section lists compiler switches that are available
to control the handling of warning messages. It is also possible
to exercise much finer control over what warnings are issued and
suppressed using the GNAT pragma Warnings, See section `Pragma Warnings' in GNAT Reference manual.
- `-gnatwa'
- Activate all optional errors.
This switch activates most optional warning messages, see remaining list
in this section for details on optional warning messages that can be
individually controlled. The warnings that are not turned on by this
switch are
`-gnatwd' (implicit dereferencing),
`-gnatwh' (hiding),
`-gnatwl' (elaboration warnings),
`-gnatw.o' (warn on values set by out parameters ignored)
and `-gnatwt' (tracking of deleted conditional code).
All other optional warnings are turned on.
- `-gnatwA'
- Suppress all optional errors.
This switch suppresses all optional warning messages, see remaining list
in this section for details on optional warning messages that can be
individually controlled.
- `-gnatw.a'
- Activate warnings on failing assertions.
This switch activates warnings for assertions where the compiler can tell at
compile time that the assertion will fail. Note that this warning is given
even if assertions are disabled. The default is that such warnings are
generated.
- `-gnatw.A'
- Suppress warnings on failing assertions.
This switch suppresses warnings for assertions where the compiler can tell at
compile time that the assertion will fail.
- `-gnatwb'
- Activate warnings on bad fixed values.
This switch activates warnings for static fixed-point expressions whose
value is not an exact multiple of Small. Such values are implementation
dependent, since an implementation is free to choose either of the multiples
that surround the value. GNAT always chooses the closer one, but this is not
required behavior, and it is better to specify a value that is an exact
multiple, ensuring predictable execution. The default is that such warnings
are not generated.
- `-gnatwB'
- Suppress warnings on bad fixed values.
This switch suppresses warnings for static fixed-point expressions whose
value is not an exact multiple of Small.
- `-gnatwc'
- Activate warnings on conditionals.
This switch activates warnings for conditional expressions used in
tests that are known to be True or False at compile time. The default
is that such warnings are not generated.
Note that this warning does
not get issued for the use of boolean variables or constants whose
values are known at compile time, since this is a standard technique
for conditional compilation in Ada, and this would generate too many
false positive warnings.
This warning option also activates a special test for comparisons using
the operators ">=" and" <=".
If the compiler can tell that only the equality condition is possible,
then it will warn that the ">" or "<" part of the test
is useless and that the operator could be replaced by "=".
An example would be comparing a Natural variable <= 0.
This warning option also generates warnings if
one or both tests is optimized away in a membership test for integer
values if the result can be determined at compile time. Range tests on
enumeration types are not included, since it is common for such tests
to include an end point.
This warning can also be turned on using `-gnatwa'.
- `-gnatwC'
- Suppress warnings on conditionals.
This switch suppresses warnings for conditional expressions used in
tests that are known to be True or False at compile time.
- `-gnatw.c'
- Activate warnings on missing component clauses.
This switch activates warnings for record components where a record
representation clause is present and has component clauses for the
majority, but not all, of the components. A warning is given for each
component for which no component clause is present.
This warning can also be turned on using `-gnatwa'.
- `-gnatw.C'
- Suppress warnings on missing component clauses.
This switch suppresses warnings for record components that are
missing a component clause in the situation described above.
- `-gnatwd'
- Activate warnings on implicit dereferencing.
If this switch is set, then the use of a prefix of an access type
in an indexed component, slice, or selected component without an
explicit
.all will generate a warning. With this warning
enabled, access checks occur only at points where an explicit
.all appears in the source code (assuming no warnings are
generated as a result of this switch). The default is that such
warnings are not generated.
Note that `-gnatwa' does not affect the setting of
this warning option.
- `-gnatwD'
- Suppress warnings on implicit dereferencing.
This switch suppresses warnings for implicit dereferences in
indexed components, slices, and selected components.
- `-gnatwe'
- Treat warnings as errors.
This switch causes warning messages to be treated as errors.
The warning string still appears, but the warning messages are counted
as errors, and prevent the generation of an object file.
- `-gnatw.e'
- Activate every optional warning
This switch activates all optional warnings, including those which
are not activated by
-gnatwa.
- `-gnatwf'
- Activate warnings on unreferenced formals.
This switch causes a warning to be generated if a formal parameter
is not referenced in the body of the subprogram. This warning can
also be turned on using `-gnatwa' or `-gnatwu'. The
default is that these warnings are not generated.
- `-gnatwF'
- Suppress warnings on unreferenced formals.
This switch suppresses warnings for unreferenced formal
parameters. Note that the
combination `-gnatwu' followed by `-gnatwF' has the
effect of warning on unreferenced entities other than subprogram
formals.
- `-gnatwg'
- Activate warnings on unrecognized pragmas.
This switch causes a warning to be generated if an unrecognized
pragma is encountered. Apart from issuing this warning, the
pragma is ignored and has no effect. This warning can
also be turned on using `-gnatwa'. The default
is that such warnings are issued (satisfying the Ada Reference
Manual requirement that such warnings appear).
- `-gnatwG'
- Suppress warnings on unrecognized pragmas.
This switch suppresses warnings for unrecognized pragmas.
- `-gnatwh'
- Activate warnings on hiding.
This switch activates warnings on hiding declarations.
A declaration is considered hiding
if it is for a non-overloadable entity, and it declares an entity with the
same name as some other entity that is directly or use-visible. The default
is that such warnings are not generated.
Note that `-gnatwa' does not affect the setting of this warning option.
- `-gnatwH'
- Suppress warnings on hiding.
This switch suppresses warnings on hiding declarations.
- `-gnatwi'
- Activate warnings on implementation units.
This switch activates warnings for a
with of an internal GNAT
implementation unit, defined as any unit from the Ada,
Interfaces, GNAT,
or System
hierarchies that is not
documented in either the Ada Reference Manual or the GNAT
Programmer's Reference Manual. Such units are intended only
for internal implementation purposes and should not be with'ed
by user programs. The default is that such warnings are generated
This warning can also be turned on using `-gnatwa'.
- `-gnatwI'
- Disable warnings on implementation units.
This switch disables warnings for a
with of an internal GNAT
implementation unit.
- `-gnatwj'
- Activate warnings on obsolescent features (Annex J).
If this warning option is activated, then warnings are generated for
calls to subprograms marked with
pragma Obsolescent and
for use of features in Annex J of the Ada Reference Manual. In the
case of Annex J, not all features are flagged. In particular use
of the renamed packages (like Text_IO) and use of package
ASCII are not flagged, since these are very common and
would generate many annoying positive warnings. The default is that
such warnings are not generated. This warning is also turned on by
the use of `-gnatwa'.
In addition to the above cases, warnings are also generated for
GNAT features that have been provided in past versions but which
have been superseded (typically by features in the new Ada standard).
For example, pragma Ravenscar will be flagged since its
function is replaced by pragma Profile(Ravenscar).
Note that this warning option functions differently from the
restriction No_Obsolescent_Features in two respects.
First, the restriction applies only to annex J features.
Second, the restriction does flag uses of package ASCII.
- `-gnatwJ'
- Suppress warnings on obsolescent features (Annex J).
This switch disables warnings on use of obsolescent features.
- `-gnatwk'
- Activate warnings on variables that could be constants.
This switch activates warnings for variables that are initialized but
never modified, and then could be declared constants. The default is that
such warnings are not given.
This warning can also be turned on using `-gnatwa'.
- `-gnatwK'
- Suppress warnings on variables that could be constants.
This switch disables warnings on variables that could be declared constants.
- `-gnatwl'
- Activate warnings for elaboration pragmas.
This switch activates warnings on missing
Elaborate_All and Elaborate pragmas.
See the section in this guide on elaboration checking for details on
when such pragmas should be used. In dynamic elaboration mode, this switch
generations warnings about the need to add elaboration pragmas. Note however,
that if you blindly follow these warnings, and add Elaborate_All
warnings wherever they are recommended, you basically end up with the
equivalent of the static elaboration model, which may not be what you want for
legacy code for which the static model does not work.
For the static model, the messages generated are labeled "info:" (for
information messages). They are not warnings to add elaboration pragmas,
merely informational messages showing what implicit elaboration pragmas
have been added, for use in analyzing elaboration circularity problems.
Warnings are also generated if you
are using the static mode of elaboration, and a pragma Elaborate
is encountered. The default is that such warnings
are not generated.
This warning is not automatically turned on by the use of `-gnatwa'.
- `-gnatwL'
- Suppress warnings for elaboration pragmas.
This switch suppresses warnings on missing Elaborate and Elaborate_All pragmas.
See the section in this guide on elaboration checking for details on
when such pragmas should be used.
- `-gnatwm'
- Activate warnings on modified but unreferenced variables.
This switch activates warnings for variables that are assigned (using
an initialization value or with one or more assignment statements) but
whose value is never read. The warning is suppressed for volatile
variables and also for variables that are renamings of other variables
or for which an address clause is given.
This warning can also be turned on using `-gnatwa'.
The default is that these warnings are not given.
- `-gnatwM'
- Disable warnings on modified but unreferenced variables.
This switch disables warnings for variables that are assigned or
initialized, but never read.
- `-gnatwn'
- Set normal warnings mode.
This switch sets normal warning mode, in which enabled warnings are
issued and treated as warnings rather than errors. This is the default
mode. the switch `-gnatwn' can be used to cancel the effect of
an explicit `-gnatws' or
`-gnatwe'. It also cancels the effect of the
implicit `-gnatwe' that is activated by the
use of `-gnatg'.
- `-gnatwo'
- Activate warnings on address clause overlays.
This switch activates warnings for possibly unintended initialization
effects of defining address clauses that cause one variable to overlap
another. The default is that such warnings are generated.
This warning can also be turned on using `-gnatwa'.
- `-gnatwO'
- Suppress warnings on address clause overlays.
This switch suppresses warnings on possibly unintended initialization
effects of defining address clauses that cause one variable to overlap
another.
- `-gnatw.o'
- Activate warnings on modified but unreferenced out parameters.
This switch activates warnings for variables that are modified by using
them as actuals for a call to a procedure with an out mode formal, where
the resulting assigned value is never read. It is applicable in the case
where there is more than one out mode formal. If there is only one out
mode formal, the warning is issued by default (controlled by -gnatwu).
The warning is suppressed for volatile
variables and also for variables that are renamings of other variables
or for which an address clause is given.
The default is that these warnings are not given. Note that this warning
is not included in -gnatwa, it must be activated explicitly.
- `-gnatw.O'
- Disable warnings on modified but unreferenced out parameters.
This switch suppresses warnings for variables that are modified by using
them as actuals for a call to a procedure with an out mode formal, where
the resulting assigned value is never read.
- `-gnatwp'
- Activate warnings on ineffective pragma Inlines.
This switch activates warnings for failure of front end inlining
(activated by `-gnatN') to inline a particular call. There are
many reasons for not being able to inline a call, including most
commonly that the call is too complex to inline. The default is
that such warnings are not given.
This warning can also be turned on using `-gnatwa'.
Warnings on ineffective inlining by the gcc back-end can be activated
separately, using the gcc switch -Winline.
- `-gnatwP'
- Suppress warnings on ineffective pragma Inlines.
This switch suppresses warnings on ineffective pragma Inlines. If the
inlining mechanism cannot inline a call, it will simply ignore the
request silently.
- `-gnatw.p'
- Activate warnings on parameter ordering.
This switch activates warnings for cases of suspicious parameter
ordering when the list of arguments are all simple identifiers that
match the names of the formals, but are in a different order. The
warning is suppressed if any use of named parameter notation is used,
so this is the appropriate way to suppress a false positive (and
serves to emphasize that the "misordering" is deliberate). The
default is
that such warnings are not given.
This warning can also be turned on using `-gnatwa'.
- `-gnatw.P'
- Suppress warnings on parameter ordering.
This switch suppresses warnings on cases of suspicious parameter
ordering.
- `-gnatwq'
- Activate warnings on questionable missing parentheses.
This switch activates warnings for cases where parentheses are not used and
the result is potential ambiguity from a readers point of view. For example
(not a > b) when a and b are modular means ((not a) > b) and very likely the
programmer intended (not (a > b)). Similarly (-x mod 5) means (-(x mod 5)) and
quite likely ((-x) mod 5) was intended. In such situations it seems best to
follow the rule of always parenthesizing to make the association clear, and
this warning switch warns if such parentheses are not present. The default
is that these warnings are given.
This warning can also be turned on using `-gnatwa'.
- `-gnatwQ'
- Suppress warnings on questionable missing parentheses.
This switch suppresses warnings for cases where the association is not
clear and the use of parentheses is preferred.
- `-gnatwr'
- Activate warnings on redundant constructs.
This switch activates warnings for redundant constructs. The following
is the current list of constructs regarded as redundant:
-
Assignment of an item to itself.
-
Type conversion that converts an expression to its own type.
-
Use of the attribute
Base where typ'Base is the same
as typ.
-
Use of pragma
Pack when all components are placed by a record
representation clause.
-
Exception handler containing only a reraise statement (raise with no
operand) which has no effect.
-
Use of the operator abs on an operand that is known at compile time
to be non-negative
-
Comparison of boolean expressions to an explicit True value.
This warning can also be turned on using `-gnatwa'.
The default is that warnings for redundant constructs are not given.
- `-gnatwR'
- Suppress warnings on redundant constructs.
This switch suppresses warnings for redundant constructs.
- `-gnatws'
- Suppress all warnings.
This switch completely suppresses the
output of all warning messages from the GNAT front end.
Note that it does not suppress warnings from the
gcc back end.
To suppress these back end warnings as well, use the switch `-w'
in addition to `-gnatws'.
- `-gnatwt'
- Activate warnings for tracking of deleted conditional code.
This switch activates warnings for tracking of code in conditionals (IF and
CASE statements) that is detected to be dead code which cannot be executed, and
which is removed by the front end. This warning is off by default, and is not
turned on by `-gnatwa', it has to be turned on explicitly. This may be
useful for detecting deactivated code in certified applications.
- `-gnatwT'
- Suppress warnings for tracking of deleted conditional code.
This switch suppresses warnings for tracking of deleted conditional code.
- `-gnatwu'
- Activate warnings on unused entities.
This switch activates warnings to be generated for entities that
are declared but not referenced, and for units that are
with'ed
and not
referenced. In the case of packages, a warning is also generated if
no entities in the package are referenced. This means that if the package
is referenced but the only references are in use
clauses or renames
declarations, a warning is still generated. A warning is also generated
for a generic package that is with'ed but never instantiated.
In the case where a package or subprogram body is compiled, and there
is a with on the corresponding spec
that is only referenced in the body,
a warning is also generated, noting that the
with can be moved to the body. The default is that
such warnings are not generated.
This switch also activates warnings on unreferenced formals
(it includes the effect of `-gnatwf').
This warning can also be turned on using `-gnatwa'.
- `-gnatwU'
- Suppress warnings on unused entities.
This switch suppresses warnings for unused entities and packages.
It also turns off warnings on unreferenced formals (and thus includes
the effect of `-gnatwF').
- `-gnatwv'
- Activate warnings on unassigned variables.
This switch activates warnings for access to variables which
may not be properly initialized. The default is that
such warnings are generated.
This warning can also be turned on using `-gnatwa'.
- `-gnatwV'
- Suppress warnings on unassigned variables.
This switch suppresses warnings for access to variables which
may not be properly initialized.
For variables of a composite type, the warning can also be suppressed in
Ada 2005 by using a default initialization with a box. For example, if
Table is an array of records whose components are only partially uninitialized,
then the following code:
| | Tab : Table := (others => <>);
|
will suppress warnings on subsequent statements that access components
of variable Tab.
- `-gnatww'
- Activate warnings on wrong low bound assumption.
This switch activates warnings for indexing an unconstrained string parameter
with a literal or S'Length. This is a case where the code is assuming that the
low bound is one, which is in general not true (for example when a slice is
passed). The default is that such warnings are generated.
This warning can also be turned on using `-gnatwa'.
- `-gnatwW'
- Suppress warnings on wrong low bound assumption.
This switch suppresses warnings for indexing an unconstrained string parameter
with a literal or S'Length. Note that this warning can also be suppressed
in a particular case by adding an
assertion that the lower bound is 1,
as shown in the following example.
| | procedure K (S : String) is
pragma Assert (S'First = 1);
...
|
- `-gnatw.w'
- Activate warnings on unnecessary Warnings Off pragmas
This switch activates warnings for use of
pragma Warnings (Off, entity
where either the pragma is entirely useless (because it suppresses no
warnings), or it could be replaced by pragma Unreferenced or
pragma Unmodified.The default is that these warnings are not given.
Note that this warning is not included in -gnatwa, it must be
activated explicitly.
- `-gnatw.W'
- Suppress warnings on unnecessary Warnings Off pragmas
This switch suppresses warnings for use of
pragma Warnings (Off, entity.
- `-gnatwx'
- Activate warnings on Export/Import pragmas.
This switch activates warnings on Export/Import pragmas when
the compiler detects a possible conflict between the Ada and
foreign language calling sequences. For example, the use of
default parameters in a convention C procedure is dubious
because the C compiler cannot supply the proper default, so
a warning is issued. The default is that such warnings are
generated.
This warning can also be turned on using `-gnatwa'.
- `-gnatwX'
- Suppress warnings on Export/Import pragmas.
This switch suppresses warnings on Export/Import pragmas.
The sense of this is that you are telling the compiler that
you know what you are doing in writing the pragma, and it
should not complain at you.
- `-gnatw.x'
- Activate warnings for No_Exception_Propagation mode.
This switch activates warnings for exception usage when pragma Restrictions
(No_Exception_Propagation) is in effect. Warnings are given for implicit or
explicit exception raises which are not covered by a local handler, and for
exception handlers which do not cover a local raise. The default is that these
warnings are not given.
- `-gnatw.X'
- Disable warnings for No_Exception_Propagation mode.
This switch disables warnings for exception usage when pragma Restrictions
(No_Exception_Propagation) is in effect.
- `-gnatwy'
- Activate warnings for Ada 2005 compatibility issues.
For the most part Ada 2005 is upwards compatible with Ada 95,
but there are some exceptions (for example the fact that
interface is now a reserved word in Ada 2005). This
switch activates several warnings to help in identifying
and correcting such incompatibilities. The default is that
these warnings are generated. Note that at one point Ada 2005
was called Ada 0Y, hence the choice of character.
This warning can also be turned on using `-gnatwa'.
- `-gnatwY'
- Disable warnings for Ada 2005 compatibility issues.
This switch suppresses several warnings intended to help in identifying
incompatibilities between Ada 95 and Ada 2005.
- `-gnatwz'
- Activate warnings on unchecked conversions.
This switch activates warnings for unchecked conversions
where the types are known at compile time to have different
sizes. The default
is that such warnings are generated. Warnings are also
generated for subprogram pointers with different conventions,
and, on VMS only, for data pointers with different conventions.
This warning can also be turned on using `-gnatwa'.
- `-gnatwZ'
- Suppress warnings on unchecked conversions.
This switch suppresses warnings for unchecked conversions
where the types are known at compile time to have different
sizes or conventions.
- `-Wunused'
-
The warnings controlled by the `-gnatw' switch are generated by
the front end of the compiler. The `GCC' back end can provide
additional warnings and they are controlled by the `-W' switch.
For example, `-Wunused' activates back end
warnings for entities that are declared but not referenced.
- `-Wuninitialized'
-
Similarly, `-Wuninitialized' activates
the back end warning for uninitialized variables. This switch must be
used in conjunction with an optimization level greater than zero.
- `-Wall'
-
This switch enables all the above warnings from the `GCC' back end.
The code generator detects a number of warning situations that are missed
by the `GNAT' front end, and this switch can be used to activate them.
The use of this switch also sets the default front end warning mode to
`-gnatwa', that is, most front end warnings activated as well.
- `-w'
-
Conversely, this switch suppresses warnings from the `GCC' back end.
The use of this switch also sets the default front end warning mode to
`-gnatws', that is, front end warnings suppressed as well.
A string of warning parameters can be used in the same parameter. For example:
will turn on all optional warnings except for elaboration pragma warnings,
and also specify that warnings should be treated as errors.
When no switch `-gnatw' is used, this is equivalent to:
- `-gnatwC'
- `-gnatwD'
- `-gnatwF'
- `-gnatwg'
- `-gnatwH'
- `-gnatwi'
- `-gnatwJ'
- `-gnatwK'
- `-gnatwL'
- `-gnatwM'
- `-gnatwn'
- `-gnatwo'
- `-gnatwP'
- `-gnatwR'
- `-gnatwU'
- `-gnatwv'
- `-gnatwz'
- `-gnatwx'
3.2.3 Debugging and Assertion Control
- `-gnata'
-
The pragmas Assert and Debug normally have no effect and
are ignored. This switch, where `a' stands for assert, causes
Assert and Debug pragmas to be activated.
The pragmas have the form:
| | pragma Assert (Boolean-expression [,
static-string-expression])
pragma Debug (procedure call)
|
The Assert pragma causes Boolean-expression to be tested.
If the result is True, the pragma has no effect (other than
possible side effects from evaluating the expression). If the result is
False, the exception Assert_Failure declared in the package
System.Assertions is
raised (passing static-string-expression, if present, as the
message associated with the exception). If no string expression is
given the default is a string giving the file name and line number
of the pragma.
The Debug pragma causes procedure to be called. Note that
pragma Debug may appear within a declaration sequence, allowing
debugging procedures to be called between declarations.
3.2.4 Validity Checking
The Ada Reference Manual has specific requirements for checking
for invalid values. In particular, RM 13.9.1 requires that the
evaluation of invalid values (for example from unchecked conversions),
not result in erroneous execution. In GNAT, the result of such an
evaluation in normal default mode is to either use the value
unmodified, or to raise Constraint_Error in those cases where use
of the unmodified value would cause erroneous execution. The cases
where unmodified values might lead to erroneous execution are case
statements (where a wild jump might result from an invalid value),
and subscripts on the left hand side (where memory corruption could
occur as a result of an invalid value).
The `-gnatVx' switch allows more control over the validity
checking mode.
The x argument is a string of letters that
indicate validity checks that are performed or not performed in addition
to the default checks described above.
- `-gnatVa'
- All validity checks.
All validity checks are turned on.
That is, `-gnatVa' is
equivalent to `gnatVcdfimorst'.
- `-gnatVc'
- Validity checks for copies.
The right hand side of assignments, and the initializing values of
object declarations are validity checked.
- `-gnatVd'
- Default (RM) validity checks.
Some validity checks are done by default following normal Ada semantics
(RM 13.9.1 (9-11)).
A check is done in case statements that the expression is within the range
of the subtype. If it is not, Constraint_Error is raised.
For assignments to array components, a check is done that the expression used
as index is within the range. If it is not, Constraint_Error is raised.
Both these validity checks may be turned off using switch `-gnatVD'.
They are turned on by default. If `-gnatVD' is specified, a subsequent
switch `-gnatVd' will leave the checks turned on.
Switch `-gnatVD' should be used only if you are sure that all such
expressions have valid values. If you use this switch and invalid values
are present, then the program is erroneous, and wild jumps or memory
overwriting may occur.
- `-gnatVe'
- Validity checks for elementary components.
In the absence of this switch, assignments to record or array components are
not validity checked, even if validity checks for assignments generally
(`-gnatVc') are turned on. In Ada, assignment of composite values do not
require valid data, but assignment of individual components does. So for
example, there is a difference between copying the elements of an array with a
slice assignment, compared to assigning element by element in a loop. This
switch allows you to turn off validity checking for components, even when they
are assigned component by component.
- `-gnatVf'
- Validity checks for floating-point values.
In the absence of this switch, validity checking occurs only for discrete
values. If `-gnatVf' is specified, then validity checking also applies
for floating-point values, and NaNs and infinities are considered invalid,
as well as out of range values for constrained types. Note that this means
that standard IEEE infinity mode is not allowed. The exact contexts
in which floating-point values are checked depends on the setting of other
options. For example,
`-gnatVif' or
`-gnatVfi'
(the order does not matter) specifies that floating-point parameters of mode
in should be validity checked.
- `-gnatVi'
- Validity checks for
in mode parameters
Arguments for parameters of mode in are validity checked in function
and procedure calls at the point of call.
- `-gnatVm'
- Validity checks for
in out mode parameters.
Arguments for parameters of mode in out are validity checked in
procedure calls at the point of call. The 'm' here stands for
modify, since this concerns parameters that can be modified by the call.
Note that there is no specific option to test out parameters,
but any reference within the subprogram will be tested in the usual
manner, and if an invalid value is copied back, any reference to it
will be subject to validity checking.
- `-gnatVn'
- No validity checks.
This switch turns off all validity checking, including the default checking
for case statements and left hand side subscripts. Note that the use of
the switch `-gnatp' suppresses all run-time checks, including
validity checks, and thus implies `-gnatVn'. When this switch
is used, it cancels any other `-gnatV' previously issued.
- `-gnatVo'
- Validity checks for operator and attribute operands.
Arguments for predefined operators and attributes are validity checked.
This includes all operators in package
Standard,
the shift operators defined as intrinsic in package Interfaces
and operands for attributes such as Pos. Checks are also made
on individual component values for composite comparisons, and on the
expressions in type conversions and qualified expressions. Checks are
also made on explicit ranges using `..' (e.g. slices, loops etc).
- `-gnatVp'
- Validity checks for parameters.
This controls the treatment of parameters within a subprogram (as opposed
to `-gnatVi' and `-gnatVm' which control validity testing
of parameters on a call. If either of these call options is used, then
normally an assumption is made within a subprogram that the input arguments
have been validity checking at the point of call, and do not need checking
again within a subprogram). If `-gnatVp' is set, then this assumption
is not made, and parameters are not assumed to be valid, so their validity
will be checked (or rechecked) within the subprogram.
- `-gnatVr'
- Validity checks for function returns.
The expression in
return statements in functions is validity
checked.
- `-gnatVs'
- Validity checks for subscripts.
All subscripts expressions are checked for validity, whether they appear
on the right side or left side (in default mode only left side subscripts
are validity checked).
- `-gnatVt'
- Validity checks for tests.
Expressions used as conditions in
if, while or exit
statements are checked, as well as guard expressions in entry calls.
The `-gnatV' switch may be followed by
a string of letters
to turn on a series of validity checking options.
For example,
`-gnatVcr'
specifies that in addition to the default validity checking, copies and
function return expressions are to be validity checked.
In order to make it easier
to specify the desired combination of effects,
the upper case letters CDFIMORST may
be used to turn off the corresponding lower case option.
Thus
`-gnatVaM'
turns on all validity checking options except for
checking of in out procedure arguments.
The specification of additional validity checking generates extra code (and
in the case of `-gnatVa' the code expansion can be substantial.
However, these additional checks can be very useful in detecting
uninitialized variables, incorrect use of unchecked conversion, and other
errors leading to invalid values. The use of pragma Initialize_Scalars
is useful in conjunction with the extra validity checking, since this
ensures that wherever possible uninitialized variables have invalid values.
See also the pragma Validity_Checks which allows modification of
the validity checking mode at the program source level, and also allows for
temporary disabling of validity checks.
3.2.5 Style Checking
The `-gnatyx' switch
causes the compiler to
enforce specified style rules. A limited set of style rules has been used
in writing the GNAT sources themselves. This switch allows user programs
to activate all or some of these checks. If the source program fails a
specified style check, an appropriate warning message is given, preceded by
the character sequence "(style)".
The string x is a sequence of letters or digits
indicating the particular style
checks to be performed. The following checks are defined:
- `0-9'
- Specify indentation level.
If a digit from 1-9 appears
in the string after `-gnaty'
then proper indentation is checked, with the digit indicating the
indentation level required. A value of zero turns off this style check.
The general style of required indentation is as specified by
the examples in the Ada Reference Manual. Full line comments must be
aligned with the
-- starting on a column that is a multiple of
the alignment level, or they may be aligned the same way as the following
non-blank line (this is useful when full line comments appear in the middle
of a statement.
- `a'
- Check attribute casing.
Attribute names, including the case of keywords such as
digits
used as attributes names, must be written in mixed case, that is, the
initial letter and any letter following an underscore must be uppercase.
All other letters must be lowercase.
- `A'
- Use of array index numbers in array attributes.
When using the array attributes First, Last, Range,
or Length, the index number must be omitted for one-dimensional arrays
and is required for multi-dimensional arrays.
- `b'
- Blanks not allowed at statement end.
Trailing blanks are not allowed at the end of statements. The purpose of this
rule, together with h (no horizontal tabs), is to enforce a canonical format
for the use of blanks to separate source tokens.
- `c'
- Check comments.
Comments must meet the following set of rules:
-
The "
--" that starts the column must either start in column one,
or else at least one blank must precede this sequence.
-
Comments that follow other tokens on a line must have at least one blank
following the "
--" at the start of the comment.
-
Full line comments must have two blanks following the "
--" that
starts the comment, with the following exceptions.
-
A line consisting only of the "
--" characters, possibly preceded
by blanks is permitted.
-
A comment starting with "
--x" where x is a special character
is permitted.
This allows proper processing of the output generated by specialized tools
including gnatprep (where "--!" is used) and the SPARK
annotation
language (where "--#" is used). For the purposes of this rule, a
special character is defined as being in one of the ASCII ranges
16#21#...16#2F# or 16#3A#...16#3F#.
Note that this usage is not permitted
in GNAT implementation units (i.e., when `-gnatg' is used).
-
A line consisting entirely of minus signs, possibly preceded by blanks, is
permitted. This allows the construction of box comments where lines of minus
signs are used to form the top and bottom of the box.
-
A comment that starts and ends with "
--" is permitted as long as at
least one blank follows the initial "--". Together with the preceding
rule, this allows the construction of box comments, as shown in the following
example:
| | ---------------------------
-- This is a box comment --
-- with two text lines. --
---------------------------
|
- `d'
- Check no DOS line terminators present.
All lines must be terminated by a single ASCII.LF
character (in particular the DOS line terminator sequence CR/LF is not
allowed).
- `e'
- Check end/exit labels.
Optional labels on
end statements ending subprograms and on
exit statements exiting named loops, are required to be present.
- `f'
- No form feeds or vertical tabs.
Neither form feeds nor vertical tab characters are permitted
in the source text.
- `g'
- GNAT style mode
The set of style check switches is set to match that used by the GNAT sources.
This may be useful when developing code that is eventually intended to be
incorporated into GNAT. For further details, see GNAT sources.
- `h'
- No horizontal tabs.
Horizontal tab characters are not permitted in the source text.
Together with the b (no blanks at end of line) check, this
enforces a canonical form for the use of blanks to separate
source tokens.
- `i'
- Check if-then layout.
The keyword
then must appear either on the same
line as corresponding if, or on a line on its own, lined
up under the if with at least one non-blank line in between
containing all or part of the condition to be tested.
- `I'
- check mode IN keywords
Mode
in (the default mode) is not
allowed to be given explicitly. in out is fine,
but not in on its own.
- `k'
- Check keyword casing.
All keywords must be in lower case (with the exception of keywords
such as
digits used as attribute names to which this check
does not apply).
- `l'
- Check layout.
Layout of statement and declaration constructs must follow the
recommendations in the Ada Reference Manual, as indicated by the
form of the syntax rules. For example an
else keyword must
be lined up with the corresponding if keyword.
There are two respects in which the style rule enforced by this check
option are more liberal than those in the Ada Reference Manual. First
in the case of record declarations, it is permissible to put the
record keyword on the same line as the type keyword, and
then the end in end record must line up under type.
This is also permitted when the type declaration is split on two lines.
For example, any of the following three layouts is acceptable:
| | type q is record
a : integer;
b : integer;
end record;
type q is
record
a : integer;
b : integer;
end record;
type q is
record
a : integer;
b : integer;
end record;
|
Second, in the case of a block statement, a permitted alternative
is to put the block label on the same line as the declare or
begin keyword, and then line the end keyword up under
the block label. For example both the following are permitted:
| | Block : declare
A : Integer := 3;
begin
Proc (A, A);
end Block;
Block :
declare
A : Integer := 3;
begin
Proc (A, A);
end Block;
|
The same alternative format is allowed for loops. For example, both of
the following are permitted:
| | Clear : while J < 10 loop
A (J) := 0;
end loop Clear;
Clear :
while J < 10 loop
A (J) := 0;
end loop Clear;
|
- `Lnnn'
- Set maximum nesting level
The maximum level of nesting of constructs (including subprograms, loops,
blocks, packages, and conditionals) may not exceed the given value
`nnn'. A value of zero disconnects this style check.
- `m'
- Check maximum line length.
The length of source lines must not exceed 79 characters, including
any trailing blanks. The value of 79 allows convenient display on an
80 character wide device or window, allowing for possible special
treatment of 80 character lines. Note that this count is of
characters in the source text. This means that a tab character counts
as one character in this count but a wide character sequence counts as
a single character (however many bytes are needed in the encoding).
- `Mnnn'
- Set maximum line length.
The length of lines must not exceed the
given value `nnn'. The maximum value that can be specified is 32767.
- `n'
- Check casing of entities in Standard.
Any identifier from Standard must be cased
to match the presentation in the Ada Reference Manual (for example,
Integer and ASCII.NUL).
- `N'
- Turn off all style checks
All style check options are turned off.
- `o'
- Check order of subprogram bodies.
All subprogram bodies in a given scope
(e.g. a package body) must be in alphabetical order. The ordering
rule uses normal Ada rules for comparing strings, ignoring casing
of letters, except that if there is a trailing numeric suffix, then
the value of this suffix is used in the ordering (e.g. Junk2 comes
before Junk10).
- `p'
- Check pragma casing.
Pragma names must be written in mixed case, that is, the
initial letter and any letter following an underscore must be uppercase.
All other letters must be lowercase.
- `r'
- Check references.
All identifier references must be cased in the same way as the
corresponding declaration. No specific casing style is imposed on
identifiers. The only requirement is for consistency of references
with declarations.
- `S'
- Check no statements after THEN/ELSE.
No statements are allowed
on the same line as a THEN OR ELSE keyword following the
keyword in an IF statement. OR ELSE and AND THEN are not affected,
and a special exception allows a pragma to appear after ELSE.
- `s'
- Check separate specs.
Separate declarations ("specs") are required for subprograms (a
body is not allowed to serve as its own declaration). The only
exception is that parameterless library level procedures are
not required to have a separate declaration. This exception covers
the most frequent form of main program procedures.
- `t'
- Check token spacing.
The following token spacing rules are enforced:
-
The keywords
abs and not must be followed by a space.
-
The token
=> must be surrounded by spaces.
-
The token
<> must be preceded by a space or a left parenthesis.
-
Binary operators other than
** must be surrounded by spaces.
There is no restriction on the layout of the ** binary operator.
-
Colon must be surrounded by spaces.
-
Colon-equal (assignment, initialization) must be surrounded by spaces.
-
Comma must be the first non-blank character on the line, or be
immediately preceded by a non-blank character, and must be followed
by a space.
-
If the token preceding a left parenthesis ends with a letter or digit, then
a space must separate the two tokens.
-
A right parenthesis must either be the first non-blank character on
a line, or it must be preceded by a non-blank character.
-
A semicolon must not be preceded by a space, and must not be followed by
a non-blank character.
-
A unary plus or minus may not be followed by a space.
-
A vertical bar must be surrounded by spaces.
- `u'
- Check unnecessary blank lines.
Unnecessary blank lines are not allowed. A blank line is considered
unnecessary if it appears at the end of the file, or if more than
one blank line occurs in sequence.
- `x'
- Check extra parentheses.
Unnecessary extra level of parentheses (C-style) are not allowed
around conditions in
if statements, while statements and
exit statements.
- `y'
- Set all standard style check options
This is equivalent to
gnaty3aAbcefhiklmnprst, that is all checking
options enabled with the exception of `-gnatyo',
`-gnatyd', `-gnatyu', and `-gnatyx'.
- `-'
- Remove style check options
This causes any subsequent options in the string to act as canceling the
corresponding style check option.
- `+'
- This causes any subsequent options in the string to enable the corresponding
style check option. It only has an effect if a previous - has been
encountered.
In the above rules, appearing in column one is always permitted, that is,
counts as meeting either a requirement for a required preceding space,
or as meeting a requirement for no preceding space.
Appearing at the end of a line is also always permitted, that is, counts
as meeting either a requirement for a following space, or as meeting
a requirement for no following space.
If any of these style rules is violated, a message is generated giving
details on the violation. The initial characters of such messages are
always "(style)". Note that these messages are treated as warning
messages, so they normally do not prevent the generation of an object
file. The `-gnatwe' switch can be used to treat warning messages,
including style messages, as fatal errors.
The switch
`-gnaty' on its own (that is not
followed by any letters or digits), then the effect is equivalent
to the use of `-gnatyy', as described above, that is all
built-in standard style check options are enabled.
an indentation level of 3 is set. This is similar to the standard
checking option that is used for the GNAT sources.
The switch
`-gnatyN'
clears any previously set style checks.
3.2.6 Run-Time Checks
If you compile with the default options, GNAT will insert many run-time
checks into the compiled code, including code that performs range
checking against constraints, but not arithmetic overflow checking for
integer operations (including division by zero), checks for access
before elaboration on subprogram calls, or stack overflow checking. All
other run-time checks, as required by the Ada Reference Manual, are
generated by default. The following gcc switches refine this
default behavior:
- `-gnatp'
-
Suppress all run-time checks as though
pragma Suppress (all_checks)
had been present in the source. Validity checks are also suppressed (in
other words `-gnatp' also implies `-gnatVn'.
Use this switch to improve the performance
of the code at the expense of safety in the presence of invalid data or
program bugs.
- `-gnato'
-
Enables overflow checking for integer operations.
This causes GNAT to generate slower and larger executable
programs by adding code to check for overflow (resulting in raising
Constraint_Error as required by standard Ada
semantics). These overflow checks correspond to situations in which
the true value of the result of an operation may be outside the base
range of the result type. The following example shows the distinction:
| | X1 : Integer := Integer'Last;
X2 : Integer range 1 .. 5 := 5;
X3 : Integer := Integer'Last;
X4 : Integer range 1 .. 5 := 5;
F : Float := 2.0E+20;
...
X1 := X1 + 1;
X2 := X2 + 1;
X3 := Integer (F);
X4 := Integer (F);
|
Here the first addition results in a value that is outside the base range
of Integer, and hence requires an overflow check for detection of the
constraint error. Thus the first assignment to X1 raises a
Constraint_Error exception only if `-gnato' is set.
The second increment operation results in a violation
of the explicit range constraint, and such range checks are always
performed (unless specifically suppressed with a pragma suppress
or the use of `-gnatp').
The two conversions of F both result in values that are outside
the base range of type Integer and thus will raise
Constraint_Error exceptions only if `-gnato' is used.
The fact that the result of the second conversion is assigned to
variable X4 with a restricted range is irrelevant, since the problem
is in the conversion, not the assignment.
Basically the rule is that in the default mode (`-gnato' not
used), the generated code assures that all integer variables stay
within their declared ranges, or within the base range if there is
no declared range. This prevents any serious problems like indexes
out of range for array operations.
What is not checked in default mode is an overflow that results in
an in-range, but incorrect value. In the above example, the assignments
to X1, X2, X3 all give results that are within the
range of the target variable, but the result is wrong in the sense that
it is too large to be represented correctly. Typically the assignment
to X1 will result in wrap around to the largest negative number.
The conversions of F will result in some Integer value
and if that integer value is out of the X4 range then the
subsequent assignment would generate an exception.
Note that the `-gnato' switch does not affect the code generated
for any floating-point operations; it applies only to integer
semantics).
For floating-point, GNAT has the Machine_Overflows
attribute set to False and the normal mode of operation is to
generate IEEE NaN and infinite values on overflow or invalid operations
(such as dividing 0.0 by 0.0).
The reason that we distinguish overflow checking from other kinds of
range constraint checking is that a failure of an overflow check, unlike
for example the failure of a range check, can result in an incorrect
value, but cannot cause random memory destruction (like an out of range
subscript), or a wild jump (from an out of range case value). Overflow
checking is also quite expensive in time and space, since in general it
requires the use of double length arithmetic.
Note again that `-gnato' is off by default, so overflow checking is
not performed in default mode. This means that out of the box, with the
default settings, GNAT does not do all the checks expected from the
language description in the Ada Reference Manual. If you want all constraint
checks to be performed, as described in this Manual, then you must
explicitly use the -gnato switch either on the gnatmake or
gcc command.
- `-gnatE'
-
Enables dynamic checks for access-before-elaboration
on subprogram calls and generic instantiations.
For full details of the effect and use of this switch,
See section 3. Compiling Using
gcc.
- `-fstack-check'
-
Activates stack overflow checking. For full details of the effect and use of
this switch see 22.1 Stack Overflow Checking.
The setting of these switches only controls the default setting of the
checks. You may modify them using either Suppress (to remove
checks) or Unsuppress (to add back suppressed checks) pragmas in
the program source.
3.2.7 Using gcc for Syntax Checking
- `-gnats'
-
The s stands for "syntax".
Run GNAT in syntax checking only mode. For
example, the command
compiles file `x.adb' in syntax-check-only mode. You can check a
series of files in a single command
, and can use wild cards to specify such a group of files.
Note that you must specify the `-c' (compile
only) flag in addition to the `-gnats' flag.
.
You may use other switches in conjunction with `-gnats'. In
particular, `-gnatl' and `-gnatv' are useful to control the
format of any generated error messages.
When the source file is empty or contains only empty lines and/or comments,
the output is a warning:
| | $ gcc -c -gnats -x ada toto.txt
toto.txt:1:01: warning: empty file, contains no compilation units
$
|
Otherwise, the output is simply the error messages, if any. No object file or
ALI file is generated by a syntax-only compilation. Also, no units other
than the one specified are accessed. For example, if a unit X
with's a unit Y, compiling unit X in syntax
check only mode does not access the source file containing unit
Y.
Normally, GNAT allows only a single unit in a source file. However, this
restriction does not apply in syntax-check-only mode, and it is possible
to check a file containing multiple compilation units concatenated
together. This is primarily used by the gnatchop utility
(see section 8. Renaming Files Using gnatchop).
3.2.8 Using gcc for Semantic Checking
- `-gnatc'
-
The c stands for "check".
Causes the compiler to operate in semantic check mode,
with full checking for all illegalities specified in the
Ada Reference Manual, but without generation of any object code
(no object file is generated).
Because dependent files must be accessed, you must follow the GNAT
semantic restrictions on file structuring to operate in this mode:
The output consists of error messages as appropriate. No object file is
generated. An `ALI' file is generated for use in the context of
cross-reference tools, but this file is marked as not being suitable
for binding (since no object file is generated).
The checking corresponds exactly to the notion of
legality in the Ada Reference Manual.
Any unit can be compiled in semantics-checking-only mode, including
units that would not normally be compiled (subunits,
and specifications where a separate body is present).
3.2.9 Compiling Different Versions of Ada
The switches described in this section allow you to explicitly specify
the version of the Ada language that your programs are written in.
By default GNAT Pro assumes Ada 95,
but you can also specify Ada 2005 or
indicate Ada 83 compatibility mode.
- `-gnat83 (Ada 83 Compatibility Mode)'
-
Although GNAT is primarily an Ada 95 / Ada 2005 compiler, this switch
specifies that the program is to be compiled in Ada 83 mode. With
`-gnat83', GNAT rejects most post-Ada 83 extensions and applies Ada 83
semantics where this can be done easily.
It is not possible to guarantee this switch does a perfect
job; some subtle tests, such as are
found in earlier ACVC tests (and that have been removed from the ACATS suite
for Ada 95), might not compile correctly.
Nevertheless, this switch may be useful in some circumstances, for example
where, due to contractual reasons, existing code needs to be maintained
using only Ada 83 features.
With few exceptions (most notably the need to use <> on
unconstrained generic formal parameters, the use of the new Ada 95 / Ada 2005
reserved words, and the use of packages
with optional bodies), it is not necessary to specify the
`-gnat83' switch when compiling Ada 83 programs, because, with rare
exceptions, Ada 95 and Ada 2005 are upwardly compatible with Ada 83. Thus
a correct Ada 83 program is usually also a correct program
in these later versions of the language standard.
For further information, please refer to F. Compatibility and Porting Guide.
- `-gnat95 (Ada 95 mode)'
-
This switch directs the compiler to implement the Ada 95 version of the
language.
Since Ada 95 is almost completely upwards
compatible with Ada 83, Ada 83 programs may generally be compiled using
this switch (see the description of the `-gnat83' switch for further
information about Ada 83 mode).
If an Ada 2005 program is compiled in Ada 95 mode,
uses of the new Ada 2005 features will cause error
messages or warnings.
This switch also can be used to cancel the effect of a previous
`-gnat83' or `-gnat05' switch earlier in the command line.
- `-gnat05 (Ada 2005 mode)'
-
This switch directs the compiler to implement the Ada 2005 version of the
language.
Since Ada 2005 is almost completely upwards
compatible with Ada 95 (and thus also with Ada 83), Ada 83 and Ada 95 programs
may generally be compiled using this switch (see the description of the
`-gnat83' and `-gnat95' switches for further
information).
For information about the approved "Ada Issues" that have been incorporated
into Ada 2005, see http://www.ada-auth.org/cgi-bin/cvsweb.cgi/AIs.
Included with GNAT releases is a file `features-ada0y' that describes
the set of implemented Ada 2005 features.
3.2.10 Character Set Control
- `-gnatic'
-
Normally GNAT recognizes the Latin-1 character set in source program
identifiers, as described in the Ada Reference Manual.
This switch causes
GNAT to recognize alternate character sets in identifiers. c is a
single character indicating the character set, as follows:
1
- ISO 8859-1 (Latin-1) identifiers
2
- ISO 8859-2 (Latin-2) letters allowed in identifiers
3
- ISO 8859-3 (Latin-3) letters allowed in identifiers
4
- ISO 8859-4 (Latin-4) letters allowed in identifiers
5
- ISO 8859-5 (Cyrillic) letters allowed in identifiers
9
- ISO 8859-15 (Latin-9) letters allowed in identifiers
p
- IBM PC letters (code page 437) allowed in identifiers
8
- IBM PC letters (code page 850) allowed in identifiers
f
- Full upper-half codes allowed in identifiers
n
- No upper-half codes allowed in identifiers
w
- Wide-character codes (that is, codes greater than 255)
allowed in identifiers
See section 2.2 Foreign Language Representation, for full details on the
implementation of these character sets.
- `-gnatWe'
-
Specify the method of encoding for wide characters.
e is one of the following:
h
- Hex encoding (brackets coding also recognized)
u
- Upper half encoding (brackets encoding also recognized)
s
- Shift/JIS encoding (brackets encoding also recognized)
e
- EUC encoding (brackets encoding also recognized)
8
- UTF-8 encoding (brackets encoding also recognized)
b
- Brackets encoding only (default value)
For full details on these encoding
methods see 2.2.3 Wide Character Encodings.
Note that brackets coding is always accepted, even if one of the other
options is specified, so for example `-gnatW8' specifies that both
brackets and UTF-8 encodings will be recognized. The units that are
with'ed directly or indirectly will be scanned using the specified
representation scheme, and so if one of the non-brackets scheme is
used, it must be used consistently throughout the program. However,
since brackets encoding is always recognized, it may be conveniently
used in standard libraries, allowing these libraries to be used with
any of the available coding schemes.
scheme.
If no `-gnatW?' parameter is present, then the default
representation is normally Brackets encoding only. However, if the
first three characters of the file are 16#EF# 16#BB# 16#BF# (the standard
byte order mark or BOM for UTF-8), then these three characters are
skipped and the default representation for the file is set to UTF-8.
Note that the wide character representation that is specified (explicitly
or by default) for the main program also acts as the default encoding used
for Wide_Text_IO files if not specifically overridden by a WCEM form
parameter.
3.2.11 File Naming Control
- `-gnatkn'
-
Activates file name "krunching". n, a decimal integer in the range
1-999, indicates the maximum allowable length of a file name (not
including the `.ads' or `.adb' extension). The default is not
to enable file name krunching.
For the source file naming rules, See section 2.3 File Naming Rules.
3.2.12 Subprogram Inlining Control
- `-gnatn'
-
The
n here is intended to suggest the first syllable of the
word "inline".
GNAT recognizes and processes Inline pragmas.