2.8 Pragmas
A pragma is a compiler directive. 
There are language-defined pragmas that give instructions for optimization, 
listing control, etc. An implementation may support additional (implementation-defined) 
pragmas. 
 
Syntax
Pragmas 
are only allowed at the following places in a program: 
 
At any place where the syntax rules allow 
a construct defined by a syntactic category whose name ends with “
declaration”, 
“
item”, “
statement”, 
“
clause”, or “
alternative”, 
or one of the syntactic categories 
variant 
or 
exception_handler; 
but not in place of such a construct if the construct is required, or 
is part of a list that is required to have at least one such construct.
 
Additional syntax rules and placement restrictions 
exist for specific pragmas. 
 An 
identifier 
specific to a pragma is an identifier or reserved word that is used 
in a pragma argument with special meaning for that pragma. 
 
Static Semantics
If an implementation does not recognize the name 
of a 
pragma, 
then it has no effect on the semantics of the program. Inside such a 
pragma, the 
only rules that apply are the Syntax Rules. 
 
Dynamic Semantics
Any 
pragma 
that appears at the place of an executable construct is executed. Unless 
otherwise specified for a particular pragma, this execution consists 
of the evaluation of each evaluable pragma argument in an arbitrary order.
 
 
Implementation Requirements
The implementation shall give a warning message for 
an unrecognized pragma name. 
Implementation Permissions
An implementation may provide implementation-defined 
pragmas; the name of an implementation-defined pragma shall differ from 
those of the language-defined pragmas. 
An implementation may ignore an unrecognized pragma 
even if it violates some of the Syntax Rules, if detecting the syntax 
error is too complex. 
Implementation Advice
 Normally, implementation-defined pragmas should 
have no semantic effect for error-free programs; that is, if the implementation-defined 
pragmas in a working program are replaced with unrecognized pragmas, 
the program should still be legal, and should still have the same semantics. 
Normally, an implementation 
should not define pragmas that can make an illegal program legal, except 
as follows: 
A 
pragma 
used to complete a declaration;
 
A 
pragma 
used to configure the environment by adding, removing, or replacing 
library_items. 
 
Syntax
The forms of List, 
Page, and Optimize 
pragmas 
are as follows:
 
Other pragmas are defined throughout this International 
Standard, and are summarized in 
Annex L. 
 
Static Semantics
A 
pragma 
List takes one of the 
identifiers 
On or Off as the single argument. This pragma is allowed anywhere a 
pragma 
is allowed. It specifies that listing of the compilation is to be continued 
or suspended until a List 
pragma 
with the opposite argument is given within the same compilation. The 
pragma itself 
is always listed if the compiler is producing a listing.
 
A 
pragma 
Page is allowed anywhere a 
pragma 
is allowed. It specifies that the program text which follows the 
pragma 
should start on a new page (if the compiler is currently producing a 
listing).
 
A 
pragma 
Optimize takes one of the 
identifiers 
Time, Space, or Off as the single argument. This 
pragma 
is allowed anywhere a 
pragma 
is allowed, and it applies until the end of the immediately enclosing 
declarative region, or for a 
pragma 
at the place of a 
compilation_unit, 
to the end of the 
compilation. 
It gives advice to the implementation as to whether time or space is 
the primary optimization criterion, or that optional optimizations should 
be turned off. It is implementation defined how this advice is followed. 
 
Examples
Examples of pragmas: 
pragma List(Off); -- turn off listing generation
pragma Optimize(Off); -- turn off optional optimizations
pragma Pure(Rational_Numbers); -- set categorization for package
pragma Assert(Exists(File_Name),
              Message => "Nonexistent file"); -- assert file exists
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe