.. role:: switch(samp)

.. _Implementation_Defined_Pragmas:

******************************
Implementation Defined Pragmas
******************************

Ada defines a set of pragmas that can be used to supply additional
information to the compiler.  These language defined pragmas are
implemented in GNAT and work as described in the Ada Reference Manual.

In addition, Ada allows implementations to define additional pragmas
whose meaning is defined by the implementation.  GNAT provides a number
of these implementation-defined pragmas, which can be used to extend
and enhance the functionality of the compiler.  This section of the GNAT
Reference Manual describes these additional pragmas.

Note that any program using these pragmas might not be portable to other
compilers (although GNAT implements this set of pragmas on all
platforms).  Therefore if portability to other compilers is an important
consideration, the use of these pragmas should be minimized.

Pragma Abort_Defer
==================

.. index:: Deferring aborts

Syntax:

.. code-block:: ada

  pragma Abort_Defer;


This pragma must appear at the start of the statement sequence of a
handled sequence of statements (right after the ``begin``).  It has
the effect of deferring aborts for the sequence of statements (but not
for the declarations or handlers, if any, associated with this statement
sequence). This can also be useful for adding a polling point in Ada code,
where asynchronous abort of tasks is checked when leaving the statement
sequence, and is lighter than, for example, using ``delay 0.0;``, since with
zero-cost exception handling, propagating exceptions (implicitly used to
implement task abort) cannot be done reliably in an asynchronous way.

An example of usage would be:

.. code-block:: ada

  --  Add a polling point to check for task aborts

  begin
     pragma Abort_Defer;
  end;

.. _Pragma-Abstract_State:

Pragma Abstract_State
=====================

Syntax:

.. code-block:: ada

  pragma Abstract_State (ABSTRACT_STATE_LIST);

  ABSTRACT_STATE_LIST ::=
       null
    |  STATE_NAME_WITH_OPTIONS
    | (STATE_NAME_WITH_OPTIONS {, STATE_NAME_WITH_OPTIONS} )

  STATE_NAME_WITH_OPTIONS ::=
       STATE_NAME
    | (STATE_NAME with OPTION_LIST)

  OPTION_LIST ::= OPTION {, OPTION}

  OPTION ::=
      SIMPLE_OPTION
    | NAME_VALUE_OPTION

  SIMPLE_OPTION ::= Ghost | Synchronous

  NAME_VALUE_OPTION ::=
      Part_Of => ABSTRACT_STATE
    | External [=> EXTERNAL_PROPERTY_LIST]

  EXTERNAL_PROPERTY_LIST ::=
       EXTERNAL_PROPERTY
    | (EXTERNAL_PROPERTY {, EXTERNAL_PROPERTY} )

  EXTERNAL_PROPERTY ::=
      Async_Readers    [=> static_boolean_EXPRESSION]
    | Async_Writers    [=> static_boolean_EXPRESSION]
    | Effective_Reads  [=> static_boolean_EXPRESSION]
    | Effective_Writes [=> static_boolean_EXPRESSION]
      others            => static_boolean_EXPRESSION

  STATE_NAME ::= defining_identifier

  ABSTRACT_STATE ::= name

For the semantics of this pragma, see the entry for aspect ``Abstract_State`` in
the SPARK 2014 Reference Manual, section 7.1.4.

Pragma Ada_83
=============

Syntax:

.. code-block:: ada

  pragma Ada_83;


A configuration pragma that establishes Ada 83 mode for the unit to
which it applies, regardless of the mode set by the command line
switches.  In Ada 83 mode, GNAT attempts to be as compatible with
the syntax and semantics of Ada 83, as defined in the original Ada
83 Reference Manual as possible.  In particular, the keywords added by Ada 95
and Ada 2005 are not recognized, optional package bodies are allowed,
and generics may name types with unknown discriminants without using
the ``(<>)`` notation.  In addition, some but not all of the additional
restrictions of Ada 83 are enforced.

Ada 83 mode is intended for two purposes.  Firstly, it allows existing
Ada 83 code to be compiled and adapted to GNAT with less effort.
Secondly, it aids in keeping code backwards compatible with Ada 83.
However, there is no guarantee that code that is processed correctly
by GNAT in Ada 83 mode will in fact compile and execute with an Ada
83 compiler, since GNAT does not enforce all the additional checks
required by Ada 83.

Pragma Ada_95
=============

Syntax:

.. code-block:: ada

  pragma Ada_95;


A configuration pragma that establishes Ada 95 mode for the unit to which
it applies, regardless of the mode set by the command line switches.
This mode is set automatically for the ``Ada`` and ``System``
packages and their children, so you need not specify it in these
contexts.  This pragma is useful when writing a reusable component that
itself uses Ada 95 features, but which is intended to be usable from
either Ada 83 or Ada 95 programs.

Pragma Ada_05
=============

Syntax:

.. code-block:: ada

  pragma Ada_05;
  pragma Ada_05 (local_NAME);


A configuration pragma that establishes Ada 2005 mode for the unit to which
it applies, regardless of the mode set by the command line switches.
This pragma is useful when writing a reusable component that
itself uses Ada 2005 features, but which is intended to be usable from
either Ada 83 or Ada 95 programs.

The one argument form (which is not a configuration pragma)
is used for managing the transition from
Ada 95 to Ada 2005 in the run-time library. If an entity is marked
as Ada_2005 only, then referencing the entity in Ada_83 or Ada_95
mode will generate a warning. In addition, in Ada_83 or Ada_95
mode, a preference rule is established which does not choose
such an entity unless it is unambiguously specified. This avoids
extra subprograms marked this way from generating ambiguities in
otherwise legal pre-Ada_2005 programs. The one argument form is
intended for exclusive use in the GNAT run-time library.

Pragma Ada_2005
===============

Syntax:

.. code-block:: ada

  pragma Ada_2005;


This configuration pragma is a synonym for pragma Ada_05 and has the
same syntax and effect.

Pragma Ada_12
=============

Syntax:

.. code-block:: ada

  pragma Ada_12;
  pragma Ada_12 (local_NAME);


A configuration pragma that establishes Ada 2012 mode for the unit to which
it applies, regardless of the mode set by the command line switches.
This mode is set automatically for the ``Ada`` and ``System``
packages and their children, so you need not specify it in these
contexts.  This pragma is useful when writing a reusable component that
itself uses Ada 2012 features, but which is intended to be usable from
Ada 83, Ada 95, or Ada 2005 programs.

The one argument form, which is not a configuration pragma,
is used for managing the transition from Ada
2005 to Ada 2012 in the run-time library. If an entity is marked
as Ada_2012 only, then referencing the entity in any pre-Ada_2012
mode will generate a warning. In addition, in any pre-Ada_2012
mode, a preference rule is established which does not choose
such an entity unless it is unambiguously specified. This avoids
extra subprograms marked this way from generating ambiguities in
otherwise legal pre-Ada_2012 programs. The one argument form is
intended for exclusive use in the GNAT run-time library.

Pragma Ada_2012
===============

Syntax:

.. code-block:: ada

  pragma Ada_2012;


This configuration pragma is a synonym for pragma Ada_12 and has the
same syntax and effect.

Pragma Ada_2022
===============

Syntax:

.. code-block:: ada

  pragma Ada_2022;
  pragma Ada_2022 (local_NAME);


A configuration pragma that establishes Ada 2022 mode for the unit to which
it applies, regardless of the mode set by the command line switches.
This mode is set automatically for the ``Ada`` and ``System``
packages and their children, so you need not specify it in these
contexts.  This pragma is useful when writing a reusable component that
itself uses Ada 2022 features, but which is intended to be usable from
Ada 83, Ada 95, Ada 2005 or Ada 2012 programs.

The one argument form, which is not a configuration pragma,
is used for managing the transition from Ada
2012 to Ada 2022 in the run-time library. If an entity is marked
as Ada_2022 only, then referencing the entity in any pre-Ada_2022
mode will generate a warning. In addition, in any pre-Ada_2012
mode, a preference rule is established which does not choose
such an entity unless it is unambiguously specified. This avoids
extra subprograms marked this way from generating ambiguities in
otherwise legal pre-Ada_2022 programs. The one argument form is
intended for exclusive use in the GNAT run-time library.

Pragma Aggregate_Individually_Assign
====================================

Syntax:

.. code-block:: ada

  pragma Aggregate_Individually_Assign;

Where possible, GNAT will store the binary representation of a record aggregate
in memory for space and performance reasons. This configuration pragma changes
this behavior so that record aggregates are instead always converted into
individual assignment statements.


Pragma Allow_Integer_Address
============================

Syntax:

.. code-block:: ada

  pragma Allow_Integer_Address;


In almost all versions of GNAT, ``System.Address`` is a private
type in accordance with the implementation advice in the RM. This
means that integer values,
in particular integer literals, are not allowed as address values.
If the configuration pragma
``Allow_Integer_Address`` is given, then integer expressions may
be used anywhere a value of type ``System.Address`` is required.
The effect is to introduce an implicit unchecked conversion from the
integer value to type ``System.Address``. The reverse case of using
an address where an integer type is required is handled analogously.
The following example compiles without errors:


.. code-block:: ada

  pragma Allow_Integer_Address;
  with System; use System;
  package AddrAsInt is
     X : Integer;
     Y : Integer;
     for X'Address use 16#1240#;
     for Y use at 16#3230#;
     m : Address := 16#4000#;
     n : constant Address := 4000;
     p : constant Address := Address (X + Y);
     v : Integer := y'Address;
     w : constant Integer := Integer (Y'Address);
     type R is new integer;
     RR : R := 1000;
     Z : Integer;
     for Z'Address use RR;
  end AddrAsInt;


Note that pragma ``Allow_Integer_Address`` is ignored if ``System.Address``
is not a private type. In implementations of ``GNAT`` where
System.Address is a visible integer type,
this pragma serves no purpose but is ignored
rather than rejected to allow common sets of sources to be used
in the two situations.

.. _Pragma-Annotate:

Pragma Annotate
===============

Syntax::

  pragma Annotate (IDENTIFIER [, IDENTIFIER {, ARG}] [, entity => local_NAME]);

  ARG ::= NAME | EXPRESSION


This pragma is used to annotate programs.  IDENTIFIER identifies
the type of annotation.  GNAT verifies that it is an identifier, but does
not otherwise analyze it. The second optional identifier is also left
unanalyzed, and by convention is used to control the action of the tool to
which the annotation is addressed.  The remaining ARG arguments
can be either string literals or more generally expressions.
String literals (and concatenations of string literals) are assumed to be
either of type
``Standard.String`` or else ``Wide_String`` or ``Wide_Wide_String``
depending on the character literals they contain.
All other kinds of arguments are analyzed as expressions, and must be
unambiguous. The last argument if present must have the identifier
``Entity`` and GNAT verifies that a local name is given.

The analyzed pragma is retained in the tree, but not otherwise processed
by any part of the GNAT compiler, except to generate corresponding note
lines in the generated ALI file. For the format of these note lines, see
the compiler source file lib-writ.ads. This pragma is intended for use by
external tools, including ASIS. The use of pragma Annotate does not
affect the compilation process in any way. This pragma may be used as
a configuration pragma.

Pragma Assert
=============

Syntax::

  pragma Assert (
    boolean_EXPRESSION
    [, string_EXPRESSION]);


The effect of this pragma depends on whether the corresponding command
line switch is set to activate assertions.  The pragma expands into code
equivalent to the following:

.. code-block:: ada

  if assertions-enabled then
     if not boolean_EXPRESSION then
        System.Assertions.Raise_Assert_Failure
          (string_EXPRESSION);
     end if;
  end if;


The string argument, if given, is the message that will be associated
with the exception occurrence if the exception is raised.  If no second
argument is given, the default message is ``file``:``nnn``,
where ``file`` is the name of the source file containing the assert,
and ``nnn`` is the line number of the assert.

Note that, as with the ``if`` statement to which it is equivalent, the
type of the expression is either ``Standard.Boolean``, or any type derived
from this standard type.

Assert checks can be either checked or ignored. By default they are ignored.
They will be checked if either the command line switch *-gnata* is
used, or if an ``Assertion_Policy`` or ``Check_Policy`` pragma is used
to enable ``Assert_Checks``.

If assertions are ignored, then there
is no run-time effect (and in particular, any side effects from the
expression will not occur at run time).  (The expression is still
analyzed at compile time, and may cause types to be frozen if they are
mentioned here for the first time).

If assertions are checked, then the given expression is tested, and if
it is ``False`` then ``System.Assertions.Raise_Assert_Failure`` is called
which results in the raising of ``Assert_Failure`` with the given message.

You should generally avoid side effects in the expression arguments of
this pragma, because these side effects will turn on and off with the
setting of the assertions mode, resulting in assertions that have an
effect on the program.  However, the expressions are analyzed for
semantic correctness whether or not assertions are enabled, so turning
assertions on and off cannot affect the legality of a program.

Note that the implementation defined policy ``DISABLE``, given in a
pragma ``Assertion_Policy``, can be used to suppress this semantic analysis.

Note: this is a standard language-defined pragma in versions
of Ada from 2005 on. In GNAT, it is implemented in all versions
of Ada, and the DISABLE policy is an implementation-defined
addition.

Pragma Assert_And_Cut
=====================

Syntax::

  pragma Assert_And_Cut (
    boolean_EXPRESSION
    [, string_EXPRESSION]);


The effect of this pragma is identical to that of pragma ``Assert``,
except that in an ``Assertion_Policy`` pragma, the identifier
``Assert_And_Cut`` is used to control whether it is ignored or checked
(or disabled).

The intention is that this be used within a subprogram when the
given test expresion sums up all the work done so far in the
subprogram, so that the rest of the subprogram can be verified
(informally or formally) using only the entry preconditions,
and the expression in this pragma. This allows dividing up
a subprogram into sections for the purposes of testing or
formal verification. The pragma also serves as useful
documentation.

Pragma Assertion_Policy
=======================

Syntax::

  pragma Assertion_Policy (CHECK | DISABLE | IGNORE | SUPPRESSIBLE);

  pragma Assertion_Policy (
      ASSERTION_KIND => POLICY_IDENTIFIER
   {, ASSERTION_KIND => POLICY_IDENTIFIER});

  ASSERTION_KIND ::= RM_ASSERTION_KIND | ID_ASSERTION_KIND

  RM_ASSERTION_KIND ::= Assert                    |
                        Static_Predicate          |
                        Dynamic_Predicate         |
                        Pre                       |
                        Pre'Class                 |
                        Post                      |
                        Post'Class                |
                        Type_Invariant            |
                        Type_Invariant'Class      |
                        Default_Initial_Condition

  ID_ASSERTION_KIND ::= Assertions           |
                        Assert_And_Cut       |
                        Assume               |
                        Contract_Cases       |
                        Debug                |
                        Ghost                |
                        Initial_Condition    |
                        Invariant            |
                        Invariant'Class      |
                        Loop_Invariant       |
                        Loop_Variant         |
                        Postcondition        |
                        Precondition         |
                        Predicate            |
                        Refined_Post         |
                        Statement_Assertions |
                        Subprogram_Variant

  POLICY_IDENTIFIER ::= Check | Disable | Ignore | Suppressible


This is a standard Ada 2012 pragma that is available as an
implementation-defined pragma in earlier versions of Ada.
The assertion kinds ``RM_ASSERTION_KIND`` are those defined in
the Ada standard. The assertion kinds ``ID_ASSERTION_KIND``
are implementation defined additions recognized by the GNAT compiler.

The pragma applies in both cases to pragmas and aspects with matching
names, e.g. ``Pre`` applies to the Pre aspect, and ``Precondition``
applies to both the ``Precondition`` pragma
and the aspect ``Precondition``. Note that the identifiers for
pragmas Pre_Class and Post_Class are Pre'Class and Post'Class (not
Pre_Class and Post_Class), since these pragmas are intended to be
identical to the corresponding aspects.

If the policy is ``CHECK``, then assertions are enabled, i.e.
the corresponding pragma or aspect is activated.
If the policy is ``IGNORE``, then assertions are ignored, i.e.
the corresponding pragma or aspect is deactivated.
This pragma overrides the effect of the *-gnata* switch on the
command line.
If the policy is ``SUPPRESSIBLE``, then assertions are enabled by default,
however, if the *-gnatp* switch is specified all assertions are ignored.

The implementation defined policy ``DISABLE`` is like
``IGNORE`` except that it completely disables semantic
checking of the corresponding pragma or aspect. This is
useful when the pragma or aspect argument references subprograms
in a with'ed package which is replaced by a dummy package
for the final build.

The implementation defined assertion kind ``Assertions`` applies to all
assertion kinds. The form with no assertion kind given implies this
choice, so it applies to all assertion kinds (RM defined, and
implementation defined).

The implementation defined assertion kind ``Statement_Assertions``
applies to ``Assert``, ``Assert_And_Cut``,
``Assume``, ``Loop_Invariant``, and ``Loop_Variant``.

Pragma Assume
=============

Syntax:

::

  pragma Assume (
    boolean_EXPRESSION
    [, string_EXPRESSION]);


The effect of this pragma is identical to that of pragma ``Assert``,
except that in an ``Assertion_Policy`` pragma, the identifier
``Assume`` is used to control whether it is ignored or checked
(or disabled).

The intention is that this be used for assumptions about the
external environment. So you cannot expect to verify formally
or informally that the condition is met, this must be
established by examining things outside the program itself.
For example, we may have code that depends on the size of
``Long_Long_Integer`` being at least 64. So we could write:

.. code-block:: ada

  pragma Assume (Long_Long_Integer'Size >= 64);


This assumption cannot be proved from the program itself,
but it acts as a useful run-time check that the assumption
is met, and documents the need to ensure that it is met by
reference to information outside the program.

Pragma Assume_No_Invalid_Values
===============================
.. index:: Invalid representations

.. index:: Invalid values

Syntax:

.. code-block:: ada

  pragma Assume_No_Invalid_Values (On | Off);


This is a configuration pragma that controls the assumptions made by the
compiler about the occurrence of invalid representations (invalid values)
in the code.

The default behavior (corresponding to an Off argument for this pragma), is
to assume that values may in general be invalid unless the compiler can
prove they are valid. Consider the following example:

.. code-block:: ada

  V1 : Integer range 1 .. 10;
  V2 : Integer range 11 .. 20;
  ...
  for J in V2 .. V1 loop
     ...
  end loop;


if V1 and V2 have valid values, then the loop is known at compile
time not to execute since the lower bound must be greater than the
upper bound. However in default mode, no such assumption is made,
and the loop may execute. If ``Assume_No_Invalid_Values (On)``
is given, the compiler will assume that any occurrence of a variable
other than in an explicit ``'Valid`` test always has a valid
value, and the loop above will be optimized away.

The use of ``Assume_No_Invalid_Values (On)`` is appropriate if
you know your code is free of uninitialized variables and other
possible sources of invalid representations, and may result in
more efficient code. A program that accesses an invalid representation
with this pragma in effect is erroneous, so no guarantees can be made
about its behavior.

It is peculiar though permissible to use this pragma in conjunction
with validity checking (-gnatVa). In such cases, accessing invalid
values will generally give an exception, though formally the program
is erroneous so there are no guarantees that this will always be the
case, and it is recommended that these two options not be used together.

.. _Pragma-Async_Readers:

Pragma Async_Readers
====================

Syntax:

.. code-block:: ada

  pragma Async_Readers [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect ``Async_Readers`` in
the SPARK 2014 Reference Manual, section 7.1.2.

.. _Pragma-Async_Writers:

Pragma Async_Writers
====================

Syntax:

.. code-block:: ada

  pragma Async_Writers [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect ``Async_Writers`` in
the SPARK 2014 Reference Manual, section 7.1.2.

Pragma Attribute_Definition
===========================

Syntax:

::

  pragma Attribute_Definition
    ([Attribute  =>] ATTRIBUTE_DESIGNATOR,
     [Entity     =>] LOCAL_NAME,
     [Expression =>] EXPRESSION | NAME);


If ``Attribute`` is a known attribute name, this pragma is equivalent to
the attribute definition clause:


.. code-block:: ada

    for Entity'Attribute use Expression;


If ``Attribute`` is not a recognized attribute name, the pragma is
ignored, and a warning is emitted. This allows source
code to be written that takes advantage of some new attribute, while remaining
compilable with earlier compilers.

Pragma C_Pass_By_Copy
=====================
.. index:: Passing by copy


Syntax:

::

  pragma C_Pass_By_Copy
    ([Max_Size =>] static_integer_EXPRESSION);


Normally the default mechanism for passing C convention records to C
convention subprograms is to pass them by reference, as suggested by RM
B.3(69).  Use the configuration pragma ``C_Pass_By_Copy`` to change
this default, by requiring that record formal parameters be passed by
copy if all of the following conditions are met:

*
  The size of the record type does not exceed the value specified for
  ``Max_Size``.
*
  The record type has ``Convention C``.
*
  The formal parameter has this record type, and the subprogram has a
  foreign (non-Ada) convention.

If these conditions are met the argument is passed by copy; i.e., in a
manner consistent with what C expects if the corresponding formal in the
C prototype is a struct (rather than a pointer to a struct).

You can also pass records by copy by specifying the convention
``C_Pass_By_Copy`` for the record type, or by using the extended
``Import`` and ``Export`` pragmas, which allow specification of
passing mechanisms on a parameter by parameter basis.

Pragma Check
============
.. index:: Assertions

.. index:: Named assertions


Syntax:

::

  pragma Check (
       [Name    =>] CHECK_KIND,
       [Check   =>] Boolean_EXPRESSION
    [, [Message =>] string_EXPRESSION] );

  CHECK_KIND ::= IDENTIFIER           |
                 Pre'Class            |
                 Post'Class           |
                 Type_Invariant'Class |
                 Invariant'Class


This pragma is similar to the predefined pragma ``Assert`` except that an
extra identifier argument is present. In conjunction with pragma
``Check_Policy``, this can be used to define groups of assertions that can
be independently controlled. The identifier ``Assertion`` is special, it
refers to the normal set of pragma ``Assert`` statements.

Checks introduced by this pragma are normally deactivated by default. They can
be activated either by the command line option *-gnata*, which turns on
all checks, or individually controlled using pragma ``Check_Policy``.

The identifiers ``Assertions`` and ``Statement_Assertions`` are not
permitted as check kinds, since this would cause confusion with the use
of these identifiers in ``Assertion_Policy`` and ``Check_Policy``
pragmas, where they are used to refer to sets of assertions.

Pragma Check_Float_Overflow
===========================
.. index:: Floating-point overflow


Syntax:

.. code-block:: ada

  pragma Check_Float_Overflow;


In Ada, the predefined floating-point types (``Short_Float``,
``Float``, ``Long_Float``, ``Long_Long_Float``) are
defined to be *unconstrained*. This means that even though each
has a well-defined base range, an operation that delivers a result
outside this base range is not required to raise an exception.
This implementation permission accommodates the notion
of infinities in IEEE floating-point, and corresponds to the
efficient execution mode on most machines. GNAT will not raise
overflow exceptions on these machines; instead it will generate
infinities and NaN's as defined in the IEEE standard.

Generating infinities, although efficient, is not always desirable.
Often the preferable approach is to check for overflow, even at the
(perhaps considerable) expense of run-time performance.
This can be accomplished by defining your own constrained floating-point subtypes -- i.e., by supplying explicit
range constraints -- and indeed such a subtype
can have the same base range as its base type. For example:


.. code-block:: ada

  subtype My_Float is Float range Float'Range;


Here ``My_Float`` has the same range as
``Float`` but is constrained, so operations on
``My_Float`` values will be checked for overflow
against this range.

This style will achieve the desired goal, but
it is often more convenient to be able to simply use
the standard predefined floating-point types as long
as overflow checking could be guaranteed.
The ``Check_Float_Overflow``
configuration pragma achieves this effect. If a unit is compiled
subject to this configuration pragma, then all operations
on predefined floating-point types including operations on
base types of these floating-point types will be treated as
though those types were constrained, and overflow checks
will be generated. The ``Constraint_Error``
exception is raised if the result is out of range.

This mode can also be set by use of the compiler
switch *-gnateF*.

Pragma Check_Name
=================
.. index:: Defining check names

.. index:: Check names, defining


Syntax:

.. code-block:: ada

  pragma Check_Name (check_name_IDENTIFIER);


This is a configuration pragma that defines a new implementation
defined check name (unless IDENTIFIER matches one of the predefined
check names, in which case the pragma has no effect). Check names
are global to a partition, so if two or more configuration pragmas
are present in a partition mentioning the same name, only one new
check name is introduced.

An implementation defined check name introduced with this pragma may
be used in only three contexts: ``pragma Suppress``,
``pragma Unsuppress``,
and as the prefix of a ``Check_Name'Enabled`` attribute reference. For
any of these three cases, the check name must be visible. A check
name is visible if it is in the configuration pragmas applying to
the current unit, or if it appears at the start of any unit that
is part of the dependency set of the current unit (e.g., units that
are mentioned in ``with`` clauses).

Check names introduced by this pragma are subject to control by compiler
switches (in particular -gnatp) in the usual manner.

Pragma Check_Policy
===================
.. index:: Controlling assertions

.. index:: Assertions, control

.. index:: Check pragma control

.. index:: Named assertions


Syntax:

::

  pragma Check_Policy
   ([Name   =>] CHECK_KIND,
    [Policy =>] POLICY_IDENTIFIER);

  pragma Check_Policy (
      CHECK_KIND => POLICY_IDENTIFIER
   {, CHECK_KIND => POLICY_IDENTIFIER});

  ASSERTION_KIND ::= RM_ASSERTION_KIND | ID_ASSERTION_KIND

  CHECK_KIND ::= IDENTIFIER           |
                 Pre'Class            |
                 Post'Class           |
                 Type_Invariant'Class |
                 Invariant'Class

  The identifiers Name and Policy are not allowed as CHECK_KIND values. This
  avoids confusion between the two possible syntax forms for this pragma.

  POLICY_IDENTIFIER ::= ON | OFF | CHECK | DISABLE | IGNORE


This pragma is used to set the checking policy for assertions (specified
by aspects or pragmas), the ``Debug`` pragma, or additional checks
to be checked using the ``Check`` pragma. It may appear either as
a configuration pragma, or within a declarative part of package. In the
latter case, it applies from the point where it appears to the end of
the declarative region (like pragma ``Suppress``).

The ``Check_Policy`` pragma is similar to the
predefined ``Assertion_Policy`` pragma,
and if the check kind corresponds to one of the assertion kinds that
are allowed by ``Assertion_Policy``, then the effect is identical.

If the first argument is Debug, then the policy applies to Debug pragmas,
disabling their effect if the policy is ``OFF``, ``DISABLE``, or
``IGNORE``, and allowing them to execute with normal semantics if
the policy is ``ON`` or ``CHECK``. In addition if the policy is
``DISABLE``, then the procedure call in ``Debug`` pragmas will
be totally ignored and not analyzed semantically.

Finally the first argument may be some other identifier than the above
possibilities, in which case it controls a set of named assertions
that can be checked using pragma ``Check``. For example, if the pragma:


.. code-block:: ada

  pragma Check_Policy (Critical_Error, OFF);


is given, then subsequent ``Check`` pragmas whose first argument is also
``Critical_Error`` will be disabled.

The check policy is ``OFF`` to turn off corresponding checks, and ``ON``
to turn on corresponding checks. The default for a set of checks for which no
``Check_Policy`` is given is ``OFF`` unless the compiler switch
*-gnata* is given, which turns on all checks by default.

The check policy settings ``CHECK`` and ``IGNORE`` are recognized
as synonyms for ``ON`` and ``OFF``. These synonyms are provided for
compatibility with the standard ``Assertion_Policy`` pragma. The check
policy setting ``DISABLE`` causes the second argument of a corresponding
``Check`` pragma to be completely ignored and not analyzed.

Pragma Comment
==============

Syntax:


.. code-block:: ada

  pragma Comment (static_string_EXPRESSION);


This is almost identical in effect to pragma ``Ident``.  It allows the
placement of a comment into the object file and hence into the
executable file if the operating system permits such usage.  The
difference is that ``Comment``, unlike ``Ident``, has
no limitations on placement of the pragma (it can be placed
anywhere in the main source unit), and if more than one pragma
is used, all comments are retained.

Pragma Common_Object
====================

Syntax:


::

  pragma Common_Object (
       [Internal =>] LOCAL_NAME
    [, [External =>] EXTERNAL_SYMBOL]
    [, [Size     =>] EXTERNAL_SYMBOL] );

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION


This pragma enables the shared use of variables stored in overlaid
linker areas corresponding to the use of ``COMMON``
in Fortran.  The single
object ``LOCAL_NAME`` is assigned to the area designated by
the ``External`` argument.
You may define a record to correspond to a series
of fields.  The ``Size`` argument
is syntax checked in GNAT, but otherwise ignored.

``Common_Object`` is not supported on all platforms.  If no
support is available, then the code generator will issue a message
indicating that the necessary attribute for implementation of this
pragma is not available.

.. _Compile_Time_Error:

Pragma Compile_Time_Error
=========================

Syntax:


.. code-block:: ada

  pragma Compile_Time_Error
           (boolean_EXPRESSION, static_string_EXPRESSION);


This pragma can be used to generate additional compile time
error messages. It
is particularly useful in generics, where errors can be issued for
specific problematic instantiations. The first parameter is a boolean
expression. The pragma ensures that the value of an expression
is known at compile time, and has the value False. The set of expressions
whose values are known at compile time includes all static boolean
expressions, and also other values which the compiler can determine
at compile time (e.g., the size of a record type set by an explicit
size representation clause, or the value of a variable which was
initialized to a constant and is known not to have been modified).
If these conditions are not met, an error message is generated using
the value given as the second argument. This string value may contain
embedded ASCII.LF characters to break the message into multiple lines.

Pragma Compile_Time_Warning
===========================

Syntax:


.. code-block:: ada

  pragma Compile_Time_Warning
           (boolean_EXPRESSION, static_string_EXPRESSION);


Same as pragma Compile_Time_Error, except a warning is issued instead
of an error message. If switch *-gnatw_C* is used, a warning is only issued
if the value of the expression is known to be True at compile time, not when
the value of the expression is not known at compile time.
Note that if this pragma is used in a package that
is with'ed by a client, the client will get the warning even though it
is issued by a with'ed package (normally warnings in with'ed units are
suppressed, but this is a special exception to that rule).

One typical use is within a generic where compile time known characteristics
of formal parameters are tested, and warnings given appropriately. Another use
with a first parameter of True is to warn a client about use of a package,
for example that it is not fully implemented.

In previous versions of the compiler, combining *-gnatwe* with
Compile_Time_Warning resulted in a fatal error. Now the compiler always emits
a warning. You can use :ref:`Compile_Time_Error` to force the generation of
an error.

Pragma Complete_Representation
==============================

Syntax:


.. code-block:: ada

  pragma Complete_Representation;


This pragma must appear immediately within a record representation
clause. Typical placements are before the first component clause
or after the last component clause. The effect is to give an error
message if any component is missing a component clause. This pragma
may be used to ensure that a record representation clause is
complete, and that this invariant is maintained if fields are
added to the record in the future.

Pragma Complex_Representation
=============================

Syntax:


::

  pragma Complex_Representation
          ([Entity =>] LOCAL_NAME);


The ``Entity`` argument must be the name of a record type which has
two fields of the same floating-point type.  The effect of this pragma is
to force gcc to use the special internal complex representation form for
this record, which may be more efficient.  Note that this may result in
the code for this type not conforming to standard ABI (application
binary interface) requirements for the handling of record types.  For
example, in some environments, there is a requirement for passing
records by pointer, and the use of this pragma may result in passing
this type in floating-point registers.

Pragma Component_Alignment
==========================
.. index:: Alignments of components
.. index:: Pragma Component_Alignment


Syntax:

::

  pragma Component_Alignment (
       [Form =>] ALIGNMENT_CHOICE
    [, [Name =>] type_LOCAL_NAME]);

  ALIGNMENT_CHOICE ::=
    Component_Size
  | Component_Size_4
  | Storage_Unit
  | Default


Specifies the alignment of components in array or record types.
The meaning of the ``Form`` argument is as follows:


  .. index:: Component_Size (in pragma Component_Alignment)

*Component_Size*
  Aligns scalar components and subcomponents of the array or record type
  on boundaries appropriate to their inherent size (naturally
  aligned).  For example, 1-byte components are aligned on byte boundaries,
  2-byte integer components are aligned on 2-byte boundaries, 4-byte
  integer components are aligned on 4-byte boundaries and so on.  These
  alignment rules correspond to the normal rules for C compilers on all
  machines except the VAX.

  .. index:: Component_Size_4 (in pragma Component_Alignment)

*Component_Size_4*
  Naturally aligns components with a size of four or fewer
  bytes.  Components that are larger than 4 bytes are placed on the next
  4-byte boundary.

  .. index:: Storage_Unit (in pragma Component_Alignment)

*Storage_Unit*
  Specifies that array or record components are byte aligned, i.e.,
  aligned on boundaries determined by the value of the constant
  ``System.Storage_Unit``.

  .. index:: Default (in pragma Component_Alignment)

*Default*
  Specifies that array or record components are aligned on default
  boundaries, appropriate to the underlying hardware or operating system or
  both. The ``Default`` choice is the same as ``Component_Size`` (natural
  alignment).

If the ``Name`` parameter is present, ``type_LOCAL_NAME`` must
refer to a local record or array type, and the specified alignment
choice applies to the specified type.  The use of
``Component_Alignment`` together with a pragma ``Pack`` causes the
``Component_Alignment`` pragma to be ignored.  The use of
``Component_Alignment`` together with a record representation clause
is only effective for fields not specified by the representation clause.

If the ``Name`` parameter is absent, the pragma can be used as either
a configuration pragma, in which case it applies to one or more units in
accordance with the normal rules for configuration pragmas, or it can be
used within a declarative part, in which case it applies to types that
are declared within this declarative part, or within any nested scope
within this declarative part.  In either case it specifies the alignment
to be applied to any record or array type which has otherwise standard
representation.

If the alignment for a record or array type is not specified (using
pragma ``Pack``, pragma ``Component_Alignment``, or a record rep
clause), the GNAT uses the default alignment as described previously.

.. _Pragma-Constant_After_Elaboration:

Pragma Constant_After_Elaboration
=================================

Syntax:

.. code-block:: ada

  pragma Constant_After_Elaboration [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect
``Constant_After_Elaboration`` in the SPARK 2014 Reference Manual, section 3.3.1.

.. _Pragma-Contract_Cases:

Pragma Contract_Cases
=====================
.. index:: Contract cases

Syntax:

.. code-block:: ada

  pragma Contract_Cases (CONTRACT_CASE {, CONTRACT_CASE});

  CONTRACT_CASE ::= CASE_GUARD => CONSEQUENCE

  CASE_GUARD ::= boolean_EXPRESSION | others

  CONSEQUENCE ::= boolean_EXPRESSION

The ``Contract_Cases`` pragma allows defining fine-grain specifications
that can complement or replace the contract given by a precondition and a
postcondition. Additionally, the ``Contract_Cases`` pragma can be used
by testing and formal verification tools. The compiler checks its validity and,
depending on the assertion policy at the point of declaration of the pragma,
it may insert a check in the executable. For code generation, the contract
cases


.. code-block:: ada

  pragma Contract_Cases (
    Cond1 => Pred1,
    Cond2 => Pred2);


are equivalent to


.. code-block:: ada

  C1 : constant Boolean := Cond1;  --  evaluated at subprogram entry
  C2 : constant Boolean := Cond2;  --  evaluated at subprogram entry
  pragma Precondition ((C1 and not C2) or (C2 and not C1));
  pragma Postcondition (if C1 then Pred1);
  pragma Postcondition (if C2 then Pred2);


The precondition ensures that one and only one of the case guards is
satisfied on entry to the subprogram.
The postcondition ensures that for the case guard that was True on entry,
the corresponding consequence is True on exit. Other consequence expressions
are not evaluated.

A precondition ``P`` and postcondition ``Q`` can also be
expressed as contract cases:

.. code-block:: ada

  pragma Contract_Cases (P => Q);


The placement and visibility rules for ``Contract_Cases`` pragmas are
identical to those described for preconditions and postconditions.

The compiler checks that boolean expressions given in case guards and
consequences are valid, where the rules for case guards are the same as
the rule for an expression in ``Precondition`` and the rules for
consequences are the same as the rule for an expression in
``Postcondition``. In particular, attributes ``'Old`` and
``'Result`` can only be used within consequence expressions.
The case guard for the last contract case may be ``others``, to denote
any case not captured by the previous cases. The
following is an example of use within a package spec:


.. code-block:: ada

  package Math_Functions is
     ...
     function Sqrt (Arg : Float) return Float;
     pragma Contract_Cases (((Arg in 0.0 .. 99.0) => Sqrt'Result < 10.0,
                             Arg >= 100.0         => Sqrt'Result >= 10.0,
                             others               => Sqrt'Result = 0.0));
     ...
  end Math_Functions;


The meaning of contract cases is that only one case should apply at each
call, as determined by the corresponding case guard evaluating to True,
and that the consequence for this case should hold when the subprogram
returns.

Pragma Convention_Identifier
============================
.. index:: Conventions, synonyms

Syntax:


::

  pragma Convention_Identifier (
           [Name =>]       IDENTIFIER,
           [Convention =>] convention_IDENTIFIER);


This pragma provides a mechanism for supplying synonyms for existing
convention identifiers. The ``Name`` identifier can subsequently
be used as a synonym for the given convention in other pragmas (including
for example pragma ``Import`` or another ``Convention_Identifier``
pragma). As an example of the use of this, suppose you had legacy code
which used Fortran77 as the identifier for Fortran. Then the pragma:


.. code-block:: ada

  pragma Convention_Identifier (Fortran77, Fortran);


would allow the use of the convention identifier ``Fortran77`` in
subsequent code, avoiding the need to modify the sources. As another
example, you could use this to parameterize convention requirements
according to systems. Suppose you needed to use ``Stdcall`` on
windows systems, and ``C`` on some other system, then you could
define a convention identifier ``Library`` and use a single
``Convention_Identifier`` pragma to specify which convention
would be used system-wide.

Pragma CPP_Class
================
.. index:: Interfacing with C++

Syntax:


::

  pragma CPP_Class ([Entity =>] LOCAL_NAME);


The argument denotes an entity in the current declarative region that is
declared as a record type. It indicates that the type corresponds to an
externally declared C++ class type, and is to be laid out the same way
that C++ would lay out the type. If the C++ class has virtual primitives
then the record must be declared as a tagged record type.

Types for which ``CPP_Class`` is specified do not have assignment or
equality operators defined (such operations can be imported or declared
as subprograms as required). Initialization is allowed only by constructor
functions (see pragma ``CPP_Constructor``). Such types are implicitly
limited if not explicitly declared as limited or derived from a limited
type, and an error is issued in that case.

See :ref:`Interfacing_to_C++` for related information.

Note: Pragma ``CPP_Class`` is currently obsolete. It is supported
for backward compatibility but its functionality is available
using pragma ``Import`` with ``Convention`` = ``CPP``.

Pragma CPP_Constructor
======================
.. index:: Interfacing with C++


Syntax:


::

  pragma CPP_Constructor ([Entity =>] LOCAL_NAME
    [, [External_Name =>] static_string_EXPRESSION ]
    [, [Link_Name     =>] static_string_EXPRESSION ]);


This pragma identifies an imported function (imported in the usual way
with pragma ``Import``) as corresponding to a C++ constructor. If
``External_Name`` and ``Link_Name`` are not specified then the
``Entity`` argument is a name that must have been previously mentioned
in a pragma ``Import`` with ``Convention`` = ``CPP``. Such name
must be of one of the following forms:

*
  **function** ``Fname`` **return** T`

*
  **function** ``Fname`` **return** T'Class

*
  **function** ``Fname`` (...) **return** T`

*
  **function** ``Fname`` (...) **return** T'Class

where ``T`` is a limited record type imported from C++ with pragma
``Import`` and ``Convention`` = ``CPP``.

The first two forms import the default constructor, used when an object
of type ``T`` is created on the Ada side with no explicit constructor.
The latter two forms cover all the non-default constructors of the type.
See the GNAT User's Guide for details.

If no constructors are imported, it is impossible to create any objects
on the Ada side and the type is implicitly declared abstract.

Pragma ``CPP_Constructor`` is intended primarily for automatic generation
using an automatic binding generator tool (such as the :switch:`-fdump-ada-spec`
GCC switch).
See :ref:`Interfacing_to_C++` for more related information.

Note: The use of functions returning class-wide types for constructors is
currently obsolete. They are supported for backward compatibility. The
use of functions returning the type T leave the Ada sources more clear
because the imported C++ constructors always return an object of type T;
that is, they never return an object whose type is a descendant of type T.

Pragma CPP_Virtual
==================
.. index:: Interfacing to C++


This pragma is now obsolete and, other than generating a warning if warnings
on obsolescent features are enabled, is completely ignored.
It is retained for compatibility
purposes. It used to be required to ensure compoatibility with C++, but
is no longer required for that purpose because GNAT generates
the same object layout as the G++ compiler by default.

See :ref:`Interfacing_to_C++` for related information.

Pragma CPP_Vtable
=================
.. index:: Interfacing with C++


This pragma is now obsolete and, other than generating a warning if warnings
on obsolescent features are enabled, is completely ignored.
It used to be required to ensure compatibility with C++, but
is no longer required for that purpose because GNAT generates
the same object layout as the G++ compiler by default.

See :ref:`Interfacing_to_C++` for related information.

Pragma CPU
==========

Syntax:


.. code-block:: ada

  pragma CPU (EXPRESSION);


This pragma is standard in Ada 2012, but is available in all earlier
versions of Ada as an implementation-defined pragma.
See Ada 2012 Reference Manual for details.

Pragma Deadline_Floor
=====================

Syntax:


.. code-block:: ada

  pragma Deadline_Floor (time_span_EXPRESSION);


This pragma applies only to protected types and specifies the floor
deadline inherited by a task when the task enters a protected object.
It is effective only when the EDF scheduling policy is used.

.. _Pragma-Default_Initial_Condition:

Pragma Default_Initial_Condition
================================

Syntax:

.. code-block:: ada

  pragma Default_Initial_Condition [ (null | boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect
``Default_Initial_Condition`` in the SPARK 2014 Reference Manual, section 7.3.3.

Pragma Debug
============

Syntax:


::

  pragma Debug ([CONDITION, ]PROCEDURE_CALL_WITHOUT_SEMICOLON);

  PROCEDURE_CALL_WITHOUT_SEMICOLON ::=
    PROCEDURE_NAME
  | PROCEDURE_PREFIX ACTUAL_PARAMETER_PART


The procedure call argument has the syntactic form of an expression, meeting
the syntactic requirements for pragmas.

If debug pragmas are not enabled or if the condition is present and evaluates
to False, this pragma has no effect. If debug pragmas are enabled, the
semantics of the pragma is exactly equivalent to the procedure call statement
corresponding to the argument with a terminating semicolon. Pragmas are
permitted in sequences of declarations, so you can use pragma ``Debug`` to
intersperse calls to debug procedures in the middle of declarations. Debug
pragmas can be enabled either by use of the command line switch *-gnata*
or by use of the pragma ``Check_Policy`` with a first argument of
``Debug``.

Pragma Debug_Policy
===================

Syntax:


.. code-block:: ada

  pragma Debug_Policy (CHECK | DISABLE | IGNORE | ON | OFF);


This pragma is equivalent to a corresponding ``Check_Policy`` pragma
with a first argument of ``Debug``. It is retained for historical
compatibility reasons.

Pragma Default_Scalar_Storage_Order
===================================
.. index:: Default_Scalar_Storage_Order

.. index:: Scalar_Storage_Order


Syntax:


.. code-block:: ada

  pragma Default_Scalar_Storage_Order (High_Order_First | Low_Order_First);


Normally if no explicit ``Scalar_Storage_Order`` is given for a record
type or array type, then the scalar storage order defaults to the ordinary
default for the target. But this default may be overridden using this pragma.
The pragma may appear as a configuration pragma, or locally within a package
spec or declarative part. In the latter case, it applies to all subsequent
types declared within that package spec or declarative part.

The following example shows the use of this pragma:


.. code-block:: ada

  pragma Default_Scalar_Storage_Order (High_Order_First);
  with System; use System;
  package DSSO1 is
     type H1 is record
        a : Integer;
     end record;

     type L2 is record
        a : Integer;
     end record;
     for L2'Scalar_Storage_Order use Low_Order_First;

     type L2a is new L2;

     package Inner is
        type H3 is record
           a : Integer;
        end record;

        pragma Default_Scalar_Storage_Order (Low_Order_First);

        type L4 is record
           a : Integer;
        end record;
     end Inner;

     type H4a is new Inner.L4;

     type H5 is record
        a : Integer;
     end record;
  end DSSO1;


In this example record types with names starting with *L* have `Low_Order_First` scalar
storage order, and record types with names starting with *H* have ``High_Order_First``.
Note that in the case of ``H4a``, the order is not inherited
from the parent type. Only an explicitly set ``Scalar_Storage_Order``
gets inherited on type derivation.

If this pragma is used as a configuration pragma which appears within a
configuration pragma file (as opposed to appearing explicitly at the start
of a single unit), then the binder will require that all units in a partition
be compiled in a similar manner, other than run-time units, which are not
affected by this pragma. Note that the use of this form is discouraged because
it may significantly degrade the run-time performance of the software, instead
the default scalar storage order ought to be changed only on a local basis.

Pragma Default_Storage_Pool
===========================
.. index:: Default_Storage_Pool


Syntax:


.. code-block:: ada

  pragma Default_Storage_Pool (storage_pool_NAME | null);


This pragma is standard in Ada 2012, but is available in all earlier
versions of Ada as an implementation-defined pragma.
See Ada 2012 Reference Manual for details.

.. _Pragma-Depends:

Pragma Depends
==============

Syntax:

.. code-block:: ada

  pragma Depends (DEPENDENCY_RELATION);

  DEPENDENCY_RELATION ::=
       null
    | (DEPENDENCY_CLAUSE {, DEPENDENCY_CLAUSE})

  DEPENDENCY_CLAUSE ::=
      OUTPUT_LIST =>[+] INPUT_LIST
    | NULL_DEPENDENCY_CLAUSE

  NULL_DEPENDENCY_CLAUSE ::= null => INPUT_LIST

  OUTPUT_LIST ::= OUTPUT | (OUTPUT {, OUTPUT})

  INPUT_LIST ::= null | INPUT | (INPUT {, INPUT})

  OUTPUT ::= NAME | FUNCTION_RESULT
  INPUT  ::= NAME

  where FUNCTION_RESULT is a function Result attribute_reference

For the semantics of this pragma, see the entry for aspect ``Depends`` in the
SPARK 2014 Reference Manual, section 6.1.5.

Pragma Detect_Blocking
======================

Syntax:

.. code-block:: ada

  pragma Detect_Blocking;


This is a standard pragma in Ada 2005, that is available in all earlier
versions of Ada as an implementation-defined pragma.

This is a configuration pragma that forces the detection of potentially
blocking operations within a protected operation, and to raise Program_Error
if that happens.

Pragma Disable_Atomic_Synchronization
=====================================

.. index:: Atomic Synchronization

Syntax:

::

  pragma Disable_Atomic_Synchronization [(Entity)];


Ada requires that accesses (reads or writes) of an atomic variable be
regarded as synchronization points in the case of multiple tasks.
Particularly in the case of multi-processors this may require special
handling, e.g. the generation of memory barriers. This capability may
be turned off using this pragma in cases where it is known not to be
required.

The placement and scope rules for this pragma are the same as those
for ``pragma Suppress``. In particular it can be used as a
configuration  pragma, or in a declaration sequence where it applies
till the end of the scope. If an ``Entity`` argument is present,
the action applies only to that entity.

Pragma Dispatching_Domain
=========================

Syntax:


.. code-block:: ada

  pragma Dispatching_Domain (EXPRESSION);


This pragma is standard in Ada 2012, but is available in all earlier
versions of Ada as an implementation-defined pragma.
See Ada 2012 Reference Manual for details.

.. _Pragma-Effective_Reads:

Pragma Effective_Reads
======================

Syntax:

.. code-block:: ada

  pragma Effective_Reads [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect ``Effective_Reads`` in
the SPARK 2014 Reference Manual, section 7.1.2.

.. _Pragma-Effective_Writes:

Pragma Effective_Writes
=======================

Syntax:

.. code-block:: ada

  pragma Effective_Writes [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect ``Effective_Writes``
in the SPARK 2014 Reference Manual, section 7.1.2.

Pragma Elaboration_Checks
=========================
.. index:: Elaboration control


Syntax:


.. code-block:: ada

  pragma Elaboration_Checks (Dynamic | Static);


This is a configuration pragma which specifies the elaboration model to be
used during compilation. For more information on the elaboration models of
GNAT, consult the chapter on elaboration order handling in the *GNAT User's
Guide*.

The pragma may appear in the following contexts:

* Configuration pragmas file

* Prior to the context clauses of a compilation unit's initial declaration

Any other placement of the pragma will result in a warning and the effects of
the offending pragma will be ignored.

If the pragma argument is ``Dynamic``, then the dynamic elaboration model is in
effect. If the pragma argument is ``Static``, then the static elaboration model
is in effect.

Pragma Eliminate
================
.. index:: Elimination of unused subprograms


Syntax:


::

   pragma Eliminate (
               [  Unit_Name       => ] IDENTIFIER | SELECTED_COMPONENT ,
               [  Entity          => ] IDENTIFIER |
                                       SELECTED_COMPONENT |
                                       STRING_LITERAL
               [, Source_Location =>   SOURCE_TRACE ] );

           SOURCE_TRACE    ::= STRING_LITERAL


This pragma indicates that the given entity is not used in the program to be
compiled and built, thus allowing the compiler to
eliminate the code or data associated with the named entity. Any reference to
an eliminated entity causes a compile-time or link-time error.

The pragma has the following semantics, where ``U`` is the unit specified by
the ``Unit_Name`` argument and ``E`` is the entity specified by the ``Entity``
argument:

* ``E`` must be a subprogram that is explicitly declared either:

  * Within ``U``, or
  * Within a generic package that is instantiated in ``U``, or
  * As an instance of generic subprogram instantiated in ``U``.

  Otherwise the pragma is ignored.

* If ``E`` is overloaded within ``U`` then, in the absence of a
  ``Source_Location`` argument, all overloadings are eliminated.
* If ``E`` is overloaded within ``U`` and only some overloadings
  are to be eliminated, then each overloading to be eliminated
  must be specified in a corresponding pragma ``Eliminate``
  with a ``Source_Location`` argument identifying the line where the
  declaration appears, as described below.
* If ``E`` is declared as the result of a generic instantiation, then
  a ``Source_Location`` argument is needed, as described below.

Pragma ``Eliminate`` allows a program to be compiled in a system-independent
manner, so that unused entities are eliminated but without
needing to modify the source text. Normally the required set of
``Eliminate`` pragmas is constructed automatically using the ``gnatelim`` tool.

Any source file change that removes, splits, or
adds lines may make the set of ``Eliminate`` pragmas invalid because their
``Source_Location`` argument values may get out of date.

Pragma ``Eliminate`` may be used where the referenced entity is a dispatching
operation. In this case all the subprograms to which the given operation can
dispatch are considered to be unused (are never called as a result of a direct
or a dispatching call).

The string literal given for the source location specifies the line number
of the declaration of the entity, using the following syntax for ``SOURCE_TRACE``:

::

   SOURCE_TRACE     ::= SOURCE_REFERENCE [ LBRACKET SOURCE_TRACE RBRACKET ]

   LBRACKET         ::= '['
   RBRACKET         ::= ']'

   SOURCE_REFERENCE ::= FILE_NAME : LINE_NUMBER

   LINE_NUMBER      ::= DIGIT {DIGIT}


Spaces around the colon in a ``SOURCE_REFERENCE`` are optional.

The source trace that is given as the ``Source_Location`` must obey the
following rules (or else the pragma is ignored), where ``U`` is
the unit ``U`` specified by the ``Unit_Name`` argument and ``E`` is the
subprogram specified by the ``Entity`` argument:

*  ``FILE_NAME`` is the short name (with no directory
   information) of the Ada source file for ``U``, using the required syntax
   for the underlying file system (e.g. case is significant if the underlying
   operating system is case sensitive).
   If ``U`` is a package and ``E`` is a subprogram declared in the package
   specification and its full declaration appears in the package body,
   then the  relevant source file is the one for the package specification;
   analogously if ``U`` is a generic package.

*  If ``E`` is not declared in a generic instantiation (this includes
   generic subprogram instances), the source trace includes only one source
   line reference. ``LINE_NUMBER`` gives the line number of the occurrence
   of the declaration of ``E`` within the source file (as a decimal literal
   without an exponent or point).

*  If ``E`` is declared by a generic instantiation, its source trace
   (from left to right) starts with the source location of the
   declaration of ``E`` in the generic unit and ends with the source
   location of the instantiation, given in square brackets. This approach is
   applied recursively with nested instantiations: the rightmost (nested
   most deeply in square brackets) element of the source trace is the location
   of the outermost instantiation, and the leftmost element (that is, outside
   of any square brackets) is the location of the declaration of ``E`` in
   the generic unit.

Examples:

   .. code-block:: ada

      pragma Eliminate (Pkg0, Proc);
      -- Eliminate (all overloadings of) Proc in Pkg0

      pragma Eliminate (Pkg1, Proc,
                        Source_Location => "pkg1.ads:8");
      -- Eliminate overloading of Proc at line 8 in pkg1.ads

      -- Assume the following file contents:
      --   gen_pkg.ads
      --   1: generic
      --   2:   type T is private;
      --   3: package Gen_Pkg is
      --   4:   procedure Proc(N : T);
      --  ...   ...
      --  ... end Gen_Pkg;
      --
      --    q.adb
      --   1: with Gen_Pkg;
      --   2: procedure Q is
      --   3:   package Inst_Pkg is new Gen_Pkg(Integer);
      --  ...   -- No calls on Inst_Pkg.Proc
      --  ... end Q;

      -- The following pragma eliminates Inst_Pkg.Proc from Q
      pragma Eliminate (Q, Proc,
                        Source_Location => "gen_pkg.ads:4[q.adb:3]");



Pragma Enable_Atomic_Synchronization
====================================
.. index:: Atomic Synchronization


Syntax:


::

  pragma Enable_Atomic_Synchronization [(Entity)];


Ada requires that accesses (reads or writes) of an atomic variable be
regarded as synchronization points in the case of multiple tasks.
Particularly in the case of multi-processors this may require special
handling, e.g. the generation of memory barriers. This synchronization
is performed by default, but can be turned off using
``pragma Disable_Atomic_Synchronization``. The
``Enable_Atomic_Synchronization`` pragma can be used to turn
it back on.

The placement and scope rules for this pragma are the same as those
for ``pragma Unsuppress``. In particular it can be used as a
configuration  pragma, or in a declaration sequence where it applies
till the end of the scope. If an ``Entity`` argument is present,
the action applies only to that entity.

Pragma Export_Function
======================
.. index:: Argument passing mechanisms


Syntax:


::

  pragma Export_Function (
       [Internal         =>] LOCAL_NAME
    [, [External         =>] EXTERNAL_SYMBOL]
    [, [Parameter_Types  =>] PARAMETER_TYPES]
    [, [Result_Type      =>] result_SUBTYPE_MARK]
    [, [Mechanism        =>] MECHANISM]
    [, [Result_Mechanism =>] MECHANISM_NAME]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION
  | ""

  PARAMETER_TYPES ::=
    null
  | TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

  TYPE_DESIGNATOR ::=
    subtype_NAME
  | subtype_Name ' Access

  MECHANISM ::=
    MECHANISM_NAME
  | (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

  MECHANISM_ASSOCIATION ::=
    [formal_parameter_NAME =>] MECHANISM_NAME

  MECHANISM_NAME ::= Value | Reference


Use this pragma to make a function externally callable and optionally
provide information on mechanisms to be used for passing parameter and
result values.  We recommend, for the purposes of improving portability,
this pragma always be used in conjunction with a separate pragma
``Export``, which must precede the pragma ``Export_Function``.
GNAT does not require a separate pragma ``Export``, but if none is
present, ``Convention Ada`` is assumed, which is usually
not what is wanted, so it is usually appropriate to use this
pragma in conjunction with a ``Export`` or ``Convention``
pragma that specifies the desired foreign convention.
Pragma ``Export_Function``
(and ``Export``, if present) must appear in the same declarative
region as the function to which they apply.

The ``internal_name`` must uniquely designate the function to which the
pragma applies.  If more than one function name exists of this name in
the declarative part you must use the ``Parameter_Types`` and
``Result_Type`` parameters to achieve the required
unique designation.  The `subtype_mark`\ s in these parameters must
exactly match the subtypes in the corresponding function specification,
using positional notation to match parameters with subtype marks.
The form with an ``'Access`` attribute can be used to match an
anonymous access parameter.

.. index:: Suppressing external name

Special treatment is given if the EXTERNAL is an explicit null
string or a static string expressions that evaluates to the null
string. In this case, no external name is generated. This form
still allows the specification of parameter mechanisms.

Pragma Export_Object
====================

Syntax:


::

  pragma Export_Object (
        [Internal =>] LOCAL_NAME
     [, [External =>] EXTERNAL_SYMBOL]
     [, [Size     =>] EXTERNAL_SYMBOL]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION


This pragma designates an object as exported, and apart from the
extended rules for external symbols, is identical in effect to the use of
the normal ``Export`` pragma applied to an object.  You may use a
separate Export pragma (and you probably should from the point of view
of portability), but it is not required.  ``Size`` is syntax checked,
but otherwise ignored by GNAT.

Pragma Export_Procedure
=======================

Syntax:


::

  pragma Export_Procedure (
       [Internal        =>] LOCAL_NAME
    [, [External        =>] EXTERNAL_SYMBOL]
    [, [Parameter_Types =>] PARAMETER_TYPES]
    [, [Mechanism       =>] MECHANISM]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION
  | ""

  PARAMETER_TYPES ::=
    null
  | TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

  TYPE_DESIGNATOR ::=
    subtype_NAME
  | subtype_Name ' Access

  MECHANISM ::=
    MECHANISM_NAME
  | (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

  MECHANISM_ASSOCIATION ::=
    [formal_parameter_NAME =>] MECHANISM_NAME

  MECHANISM_NAME ::= Value | Reference


This pragma is identical to ``Export_Function`` except that it
applies to a procedure rather than a function and the parameters
``Result_Type`` and ``Result_Mechanism`` are not permitted.
GNAT does not require a separate pragma ``Export``, but if none is
present, ``Convention Ada`` is assumed, which is usually
not what is wanted, so it is usually appropriate to use this
pragma in conjunction with a ``Export`` or ``Convention``
pragma that specifies the desired foreign convention.

.. index:: Suppressing external name

Special treatment is given if the EXTERNAL is an explicit null
string or a static string expressions that evaluates to the null
string. In this case, no external name is generated. This form
still allows the specification of parameter mechanisms.

Pragma Export_Valued_Procedure
==============================

Syntax:


::

  pragma Export_Valued_Procedure (
       [Internal        =>] LOCAL_NAME
    [, [External        =>] EXTERNAL_SYMBOL]
    [, [Parameter_Types =>] PARAMETER_TYPES]
    [, [Mechanism       =>] MECHANISM]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION
  | ""

  PARAMETER_TYPES ::=
    null
  | TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

  TYPE_DESIGNATOR ::=
    subtype_NAME
  | subtype_Name ' Access

  MECHANISM ::=
    MECHANISM_NAME
  | (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

  MECHANISM_ASSOCIATION ::=
    [formal_parameter_NAME =>] MECHANISM_NAME

  MECHANISM_NAME ::= Value | Reference


This pragma is identical to ``Export_Procedure`` except that the
first parameter of ``LOCAL_NAME``, which must be present, must be of
mode ``out``, and externally the subprogram is treated as a function
with this parameter as the result of the function.  GNAT provides for
this capability to allow the use of ``out`` and ``in out``
parameters in interfacing to external functions (which are not permitted
in Ada functions).
GNAT does not require a separate pragma ``Export``, but if none is
present, ``Convention Ada`` is assumed, which is almost certainly
not what is wanted since the whole point of this pragma is to interface
with foreign language functions, so it is usually appropriate to use this
pragma in conjunction with a ``Export`` or ``Convention``
pragma that specifies the desired foreign convention.

.. index:: Suppressing external name

Special treatment is given if the EXTERNAL is an explicit null
string or a static string expressions that evaluates to the null
string. In this case, no external name is generated. This form
still allows the specification of parameter mechanisms.

Pragma Extend_System
====================
.. index:: System, extending

.. index:: DEC Ada 83


Syntax:


::

  pragma Extend_System ([Name =>] IDENTIFIER);


This pragma is used to provide backwards compatibility with other
implementations that extend the facilities of package ``System``.  In
GNAT, ``System`` contains only the definitions that are present in
the Ada RM.  However, other implementations, notably the DEC Ada 83
implementation, provide many extensions to package ``System``.

For each such implementation accommodated by this pragma, GNAT provides a
package :samp:`Aux_{xxx}`, e.g., ``Aux_DEC`` for the DEC Ada 83
implementation, which provides the required additional definitions.  You
can use this package in two ways.  You can ``with`` it in the normal
way and access entities either by selection or using a ``use``
clause.  In this case no special processing is required.

However, if existing code contains references such as
:samp:`System.{xxx}` where *xxx* is an entity in the extended
definitions provided in package ``System``, you may use this pragma
to extend visibility in ``System`` in a non-standard way that
provides greater compatibility with the existing code.  Pragma
``Extend_System`` is a configuration pragma whose single argument is
the name of the package containing the extended definition
(e.g., ``Aux_DEC`` for the DEC Ada case).  A unit compiled under
control of this pragma will be processed using special visibility
processing that looks in package :samp:`System.Aux_{xxx}` where
:samp:`Aux_{xxx}` is the pragma argument for any entity referenced in
package ``System``, but not found in package ``System``.

You can use this pragma either to access a predefined ``System``
extension supplied with the compiler, for example ``Aux_DEC`` or
you can construct your own extension unit following the above
definition.  Note that such a package is a child of ``System``
and thus is considered part of the implementation.
To compile it you will have to use the *-gnatg* switch
for compiling System units, as explained in the
GNAT User's Guide.

Pragma Extensions_Allowed
=========================
.. index:: Ada Extensions

.. index:: GNAT Extensions


Syntax:

.. code-block:: ada

  pragma Extensions_Allowed (On | Off);


This configuration pragma enables or disables the implementation
extension mode (the use of Off as a parameter cancels the effect
of the *-gnatX* command switch).

In extension mode, the latest version of the Ada language is
implemented (currently Ada 2022), and in addition a number
of GNAT specific extensions are recognized as follows:

* Constrained attribute for generic objects

  The ``Constrained`` attribute is permitted for objects of
  generic types. The result indicates if the corresponding actual
  is constrained.

* ``Static`` aspect on intrinsic functions

  The Ada 202x ``Static`` aspect can be specified on Intrinsic imported
  functions and the compiler will evaluate some of these intrinsic statically,
  in particular the ``Shift_Left`` and ``Shift_Right`` intrinsics.

* ``'Reduce`` attribute

  This attribute part of the Ada 202x language definition is provided for
  now under -gnatX to confirm and potentially refine its usage and syntax.

* ``[]`` aggregates

  This new aggregate syntax for arrays and containers is provided under -gnatX
  to experiment and confirm this new language syntax.

* Additional ``when`` constructs

  In addition to the ``exit when CONDITION`` control structure, several
  additional constructs are allowed following this format. Including
  ``return when CONDITION``, ``goto when CONDITION``, and
  ``raise [with EXCEPTION_MESSAGE] when CONDITION.``

  Some examples:

  .. code-block:: ada

      return Result when Variable > 10;

      raise Program_Error with "Element is null" when Element = null;

      goto End_Of_Subprogram when Variable = -1;

* Casing on composite values (aka pattern matching)

  The selector for a case statement may be of a composite type, subject to
  some restrictions (described below). Aggregate syntax is used for choices
  of such a case statement; however, in cases where a "normal" aggregate would
  require a discrete value, a discrete subtype may be used instead; box
  notation can also be used to match all values.

  Consider this example:

  .. code-block:: ada

      type Rec is record
         F1, F2 : Integer;
      end record;

      procedure Caser_1 (X : Rec) is
      begin
         case X is
            when (F1 => Positive, F2 => Positive) =>
               Do_This;
            when (F1 => Natural, F2 => <>) | (F1 => <>, F2 => Natural) =>
               Do_That;
            when others =>
                Do_The_Other_Thing;
         end case;
      end Caser_1;

  If Caser_1 is called and both components of X are positive, then
  Do_This will be called; otherwise, if either component is nonnegative
  then Do_That will be called; otherwise, Do_The_Other_Thing will be called.

  If the set of values that match the choice(s) of an earlier alternative
  overlaps the corresponding set of a later alternative, then the first
  set shall be a proper subset of the second (and the later alternative
  will not be executed if the earlier alternative "matches"). All possible
  values of the composite type shall be covered. The composite type of the
  selector shall be an array or record type that is neither limited
  class-wide. Currently, a "when others =>" case choice is required; it is
  intended that this requirement will be relaxed at some point.

  If a subcomponent's subtype does not meet certain restrictions, then
  the only value that can be specified for that subcomponent in a case
  choice expression is a "box" component association (which matches all
  possible values for the subcomponent). This restriction applies if

  - the component subtype is not a record, array, or discrete type; or

  - the component subtype is subject to a non-static constraint or
    has a predicate; or

  - the component type is an enumeration type that is subject to an
    enumeration representation clause; or

  - the component type is a multidimensional array type or an
    array type with a nonstatic index subtype.

  Support for casing on arrays (and on records that contain arrays) is
  currently subject to some restrictions. Non-positional
  array aggregates are not supported as (or within) case choices. Likewise
  for array type and subtype names. The current implementation exceeds
  compile-time capacity limits in some annoyingly common scenarios; the
  message generated in such cases is usually "Capacity exceeded in compiling
  case statement with composite selector type".

  In addition, pattern bindings are supported. This is a mechanism
  for binding a name to a component of a matching value for use within
  an alternative of a case statement. For a component association
  that occurs within a case choice, the expression may be followed by
  "is <identifier>". In the special case of a "box" component association,
  the identifier may instead be provided within the box. Either of these
  indicates that the given identifer denotes (a constant view of) the matching
  subcomponent of the case selector. Binding is not yet supported for arrays
  or subcomponents thereof.

  Consider this example (which uses type Rec from the previous example):

  .. code-block:: ada

      procedure Caser_2 (X : Rec) is
      begin
         case X is
            when (F1 => Positive is Abc, F2 => Positive) =>
               Do_This (Abc)
            when (F1 => Natural is N1, F2 => <N2>) |
                 (F1 => <N2>, F2 => Natural is N1) =>
               Do_That (Param_1 => N1, Param_2 => N2);
            when others =>
               Do_The_Other_Thing;
         end case;
      end Caser_2;

  This example is the same as the previous one with respect to
  determining whether Do_This, Do_That, or Do_The_Other_Thing will
  be called. But for this version, Do_This takes a parameter and Do_That
  takes two parameters. If Do_This is called, the actual parameter in the
  call will be X.F1.

  If Do_That is called, the situation is more complex because there are two
  choices for that alternative. If Do_That is called because the first choice
  matched (i.e., because X.F1 is nonnegative and either X.F1 or X.F2 is zero
  or negative), then the actual parameters of the call will be (in order)
  X.F1 and X.F2. If Do_That is called because the second choice matched (and
  the first one did not), then the actual parameters will be reversed.

  Within the choice list for single alternative, each choice must
  define the same set of bindings and the component subtypes for
  for a given identifer must all statically match. Currently, the case
  of a binding for a nondiscrete component is not implemented.

* Fixed lower bounds for array types and subtypes

  Unconstrained array types and subtypes can be specified with a lower bound
  that is fixed to a certain value, by writing an index range that uses the
  syntax "<lower-bound-expression> .. <>". This guarantees that all objects
  of the type or subtype will have the specified lower bound.

  For example, a matrix type with fixed lower bounds of zero for each
  dimension can be declared by the following:

  .. code-block:: ada

      type Matrix is
        array (Natural range 0 .. <>, Natural range 0 .. <>) of Integer;

  Objects of type Matrix declared with an index constraint must have index
  ranges starting at zero:

  .. code-block:: ada

      M1 : Matrix (0 .. 9, 0 .. 19);
      M2 : Matrix (2 .. 11, 3 .. 22);  -- Warning about bounds; will raise CE

  Similarly, a subtype of String can be declared that specifies the lower
  bound of objects of that subtype to be 1:

   .. code-block:: ada

      subtype String_1 is String (1 .. <>);

  If a string slice is passed to a formal of subtype String_1 in a call to
  a subprogram S, the slice's bounds will "slide" so that the lower bound
  is 1. Within S, the lower bound of the formal is known to be 1, so, unlike
  a normal unconstrained String formal, there is no need to worry about
  accounting for other possible lower-bound values. Sliding of bounds also
  occurs in other contexts, such as for object declarations with an
  unconstrained subtype with fixed lower bound, as well as in subtype
  conversions.

  Use of this feature increases safety by simplifying code, and can also
  improve the efficiency of indexing operations, since the compiler statically
  knows the lower bound of unconstrained array formals when the formal's
  subtype has index ranges with static fixed lower bounds.

* Prefixed-view notation for calls to primitive subprograms of untagged types

  Since Ada 2005, calls to primitive subprograms of a tagged type that
  have a "prefixed view" (see RM 4.1.3(9.2)) have been allowed to be
  written using the form of a selected_component, with the first actual
  parameter given as the prefix and the name of the subprogram as a
  selector. This prefixed-view notation for calls is extended so as to
  also allow such syntax for calls to primitive subprograms of untagged
  types. The primitives of an untagged type T that have a prefixed view
  are those where the first formal parameter of the subprogram either
  is of type T or is an anonymous access parameter whose designated type
  is T. For a type that has a component that happens to have the same
  simple name as one of the type's primitive subprograms, where the
  component is visible at the point of a selected_component using that
  name, preference is given to the component in a selected_component
  (as is currently the case for tagged types with such component names).

* Expression defaults for generic formal functions

  The declaration of a generic formal function is allowed to specify
  an expression as a default, using the syntax of an expression function.

  Here is an example of this feature:

  .. code-block:: ada

      generic
         type T is private;
         with function Copy (Item : T) return T is (Item); -- Defaults to Item
      package Stacks is

         type Stack is limited private;

         procedure Push (S : in out Stack; X : T); -- Calls Copy on X

         function Pop (S : in out Stack) return T; -- Calls Copy to return item

      private
         -- ...
      end Stacks;

.. _Pragma-Extensions_Visible:

Pragma Extensions_Visible
=========================

Syntax:

.. code-block:: ada

  pragma Extensions_Visible [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect ``Extensions_Visible``
in the SPARK 2014 Reference Manual, section 6.1.7.

Pragma External
===============

Syntax:


::

  pragma External (
    [   Convention    =>] convention_IDENTIFIER,
    [   Entity        =>] LOCAL_NAME
    [, [External_Name =>] static_string_EXPRESSION ]
    [, [Link_Name     =>] static_string_EXPRESSION ]);


This pragma is identical in syntax and semantics to pragma
``Export`` as defined in the Ada Reference Manual.  It is
provided for compatibility with some Ada 83 compilers that
used this pragma for exactly the same purposes as pragma
``Export`` before the latter was standardized.

Pragma External_Name_Casing
===========================
.. index:: Dec Ada 83 casing compatibility

.. index:: External Names, casing

.. index:: Casing of External names


Syntax:


::

  pragma External_Name_Casing (
    Uppercase | Lowercase
    [, Uppercase | Lowercase | As_Is]);


This pragma provides control over the casing of external names associated
with Import and Export pragmas.  There are two cases to consider:



* Implicit external names

  Implicit external names are derived from identifiers.  The most common case
  arises when a standard Ada Import or Export pragma is used with only two
  arguments, as in:

  .. code-block:: ada

       pragma Import (C, C_Routine);

  Since Ada is a case-insensitive language, the spelling of the identifier in
  the Ada source program does not provide any information on the desired
  casing of the external name, and so a convention is needed.  In GNAT the
  default treatment is that such names are converted to all lower case
  letters.  This corresponds to the normal C style in many environments.
  The first argument of pragma ``External_Name_Casing`` can be used to
  control this treatment.  If ``Uppercase`` is specified, then the name
  will be forced to all uppercase letters.  If ``Lowercase`` is specified,
  then the normal default of all lower case letters will be used.

  This same implicit treatment is also used in the case of extended DEC Ada 83
  compatible Import and Export pragmas where an external name is explicitly
  specified using an identifier rather than a string.


* Explicit external names

  Explicit external names are given as string literals.  The most common case
  arises when a standard Ada Import or Export pragma is used with three
  arguments, as in:

  .. code-block:: ada

    pragma Import (C, C_Routine, "C_routine");

  In this case, the string literal normally provides the exact casing required
  for the external name.  The second argument of pragma
  ``External_Name_Casing`` may be used to modify this behavior.
  If ``Uppercase`` is specified, then the name
  will be forced to all uppercase letters.  If ``Lowercase`` is specified,
  then the name will be forced to all lowercase letters.  A specification of
  ``As_Is`` provides the normal default behavior in which the casing is
  taken from the string provided.

This pragma may appear anywhere that a pragma is valid. In particular, it
can be used as a configuration pragma in the :file:`gnat.adc` file, in which
case it applies to all subsequent compilations, or it can be used as a program
unit pragma, in which case it only applies to the current unit, or it can
be used more locally to control individual Import/Export pragmas.

It was primarily intended for use with OpenVMS systems, where many
compilers convert all symbols to upper case by default.  For interfacing to
such compilers (e.g., the DEC C compiler), it may be convenient to use
the pragma:

.. code-block:: ada

  pragma External_Name_Casing (Uppercase, Uppercase);


to enforce the upper casing of all external symbols.

Pragma Fast_Math
================

Syntax:


.. code-block:: ada

  pragma Fast_Math;


This is a configuration pragma which activates a mode in which speed is
considered more important for floating-point operations than absolutely
accurate adherence to the requirements of the standard. Currently the
following operations are affected:



*Complex Multiplication*
  The normal simple formula for complex multiplication can result in intermediate
  overflows for numbers near the end of the range. The Ada standard requires that
  this situation be detected and corrected by scaling, but in Fast_Math mode such
  cases will simply result in overflow. Note that to take advantage of this you
  must instantiate your own version of ``Ada.Numerics.Generic_Complex_Types``
  under control of the pragma, rather than use the preinstantiated versions.

.. _Pragma-Favor_Top_Level:

Pragma Favor_Top_Level
======================

Syntax:


.. code-block:: ada

  pragma Favor_Top_Level (type_NAME);


The argument of pragma ``Favor_Top_Level`` must be a named access-to-subprogram
type. This pragma is an efficiency hint to the compiler, regarding the use of
``'Access`` or ``'Unrestricted_Access`` on nested (non-library-level) subprograms.
The pragma means that nested subprograms are not used with this type, or are
rare, so that the generated code should be efficient in the top-level case.
When this pragma is used, dynamically generated trampolines may be used on some
targets for nested subprograms. See restriction ``No_Implicit_Dynamic_Code``.

Pragma Finalize_Storage_Only
============================

Syntax:


.. code-block:: ada

  pragma Finalize_Storage_Only (first_subtype_LOCAL_NAME);


The argument of pragma ``Finalize_Storage_Only`` must denote a local type which
is derived from ``Ada.Finalization.Controlled`` or ``Limited_Controlled``. The
pragma suppresses the call to ``Finalize`` for declared library-level objects
of the argument type. This is mostly useful for types where finalization is
only used to deal with storage reclamation since in most environments it is
not necessary to reclaim memory just before terminating execution, hence the
name. Note that this pragma does not suppress Finalize calls for library-level
heap-allocated objects (see pragma ``No_Heap_Finalization``).

Pragma Float_Representation
===========================

Syntax::

  pragma Float_Representation (FLOAT_REP[, float_type_LOCAL_NAME]);

  FLOAT_REP ::= VAX_Float | IEEE_Float


In the one argument form, this pragma is a configuration pragma which
allows control over the internal representation chosen for the predefined
floating point types declared in the packages ``Standard`` and
``System``. This pragma is only provided for compatibility and has no effect.

The two argument form specifies the representation to be used for
the specified floating-point type. The argument must
be ``IEEE_Float`` to specify the use of IEEE format, as follows:

*
  For a digits value of 6, 32-bit IEEE short format will be used.
*
  For a digits value of 15, 64-bit IEEE long format will be used.
*
  No other value of digits is permitted.

.. _Pragma-Ghost:

Pragma Ghost
============

Syntax:

.. code-block:: ada

  pragma Ghost [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect ``Ghost`` in the SPARK
2014 Reference Manual, section 6.9.

.. _Pragma-Global:

Pragma Global
=============

Syntax:

.. code-block:: ada

  pragma Global (GLOBAL_SPECIFICATION);

  GLOBAL_SPECIFICATION ::=
       null
    | (GLOBAL_LIST)
    | (MODED_GLOBAL_LIST {, MODED_GLOBAL_LIST})

  MODED_GLOBAL_LIST ::= MODE_SELECTOR => GLOBAL_LIST

  MODE_SELECTOR ::= In_Out | Input | Output | Proof_In
  GLOBAL_LIST   ::= GLOBAL_ITEM | (GLOBAL_ITEM {, GLOBAL_ITEM})
  GLOBAL_ITEM   ::= NAME

For the semantics of this pragma, see the entry for aspect ``Global`` in the
SPARK 2014 Reference Manual, section 6.1.4.

Pragma Ident
============

Syntax:


.. code-block:: ada

  pragma Ident (static_string_EXPRESSION);


This pragma is identical in effect to pragma ``Comment``. It is provided
for compatibility with other Ada compilers providing this pragma.

Pragma Ignore_Pragma
====================

Syntax:


.. code-block:: ada

  pragma Ignore_Pragma (pragma_IDENTIFIER);

This is a configuration pragma
that takes a single argument that is a simple identifier. Any subsequent
use of a pragma whose pragma identifier matches this argument will be
silently ignored. This may be useful when legacy code or code intended
for compilation with some other compiler contains pragmas that match the
name, but not the exact implementation, of a GNAT pragma. The use of this
pragma allows such pragmas to be ignored, which may be useful in CodePeer
mode, or during porting of legacy code.

Pragma Implementation_Defined
=============================

Syntax:


.. code-block:: ada

  pragma Implementation_Defined (local_NAME);


This pragma marks a previously declared entity as implementation-defined.
For an overloaded entity, applies to the most recent homonym.


.. code-block:: ada

  pragma Implementation_Defined;


The form with no arguments appears anywhere within a scope, most
typically a package spec, and indicates that all entities that are
defined within the package spec are Implementation_Defined.

This pragma is used within the GNAT runtime library to identify
implementation-defined entities introduced in language-defined units,
for the purpose of implementing the No_Implementation_Identifiers
restriction.

Pragma Implemented
==================

Syntax:


::

  pragma Implemented (procedure_LOCAL_NAME, implementation_kind);

  implementation_kind ::= By_Entry | By_Protected_Procedure | By_Any


This is an Ada 2012 representation pragma which applies to protected, task
and synchronized interface primitives. The use of pragma Implemented provides
a way to impose a static requirement on the overriding operation by adhering
to one of the three implementation kinds: entry, protected procedure or any of
the above. This pragma is available in all earlier versions of Ada as an
implementation-defined pragma.


.. code-block:: ada

  type Synch_Iface is synchronized interface;
  procedure Prim_Op (Obj : in out Iface) is abstract;
  pragma Implemented (Prim_Op, By_Protected_Procedure);

  protected type Prot_1 is new Synch_Iface with
     procedure Prim_Op;  --  Legal
  end Prot_1;

  protected type Prot_2 is new Synch_Iface with
     entry Prim_Op;      --  Illegal
  end Prot_2;

  task type Task_Typ is new Synch_Iface with
     entry Prim_Op;      --  Illegal
  end Task_Typ;


When applied to the procedure_or_entry_NAME of a requeue statement, pragma
Implemented determines the runtime behavior of the requeue. Implementation kind
By_Entry guarantees that the action of requeueing will proceed from an entry to
another entry. Implementation kind By_Protected_Procedure transforms the
requeue into a dispatching call, thus eliminating the chance of blocking. Kind
By_Any shares the behavior of By_Entry and By_Protected_Procedure depending on
the target's overriding subprogram kind.

Pragma Implicit_Packing
=======================
.. index:: Rational Profile

Syntax:


.. code-block:: ada

  pragma Implicit_Packing;


This is a configuration pragma that requests implicit packing for packed
arrays for which a size clause is given but no explicit pragma Pack or
specification of Component_Size is present. It also applies to records
where no record representation clause is present. Consider this example:


.. code-block:: ada

  type R is array (0 .. 7) of Boolean;
  for R'Size use 8;


In accordance with the recommendation in the RM (RM 13.3(53)), a Size clause
does not change the layout of a composite object. So the Size clause in the
above example is normally rejected, since the default layout of the array uses
8-bit components, and thus the array requires a minimum of 64 bits.

If this declaration is compiled in a region of code covered by an occurrence
of the configuration pragma Implicit_Packing, then the Size clause in this
and similar examples will cause implicit packing and thus be accepted. For
this implicit packing to occur, the type in question must be an array of small
components whose size is known at compile time, and the Size clause must
specify the exact size that corresponds to the number of elements in the array
multiplied by the size in bits of the component type (both single and
multi-dimensioned arrays can be controlled with this pragma).

.. index:: Array packing

Similarly, the following example shows the use in the record case


.. code-block:: ada

  type r is record
     a, b, c, d, e, f, g, h : boolean;
     chr                    : character;
  end record;
  for r'size use 16;


Without a pragma Pack, each Boolean field requires 8 bits, so the
minimum size is 72 bits, but with a pragma Pack, 16 bits would be
sufficient. The use of pragma Implicit_Packing allows this record
declaration to compile without an explicit pragma Pack.

Pragma Import_Function
======================

Syntax:


::

  pragma Import_Function (
       [Internal         =>] LOCAL_NAME,
    [, [External         =>] EXTERNAL_SYMBOL]
    [, [Parameter_Types  =>] PARAMETER_TYPES]
    [, [Result_Type      =>] SUBTYPE_MARK]
    [, [Mechanism        =>] MECHANISM]
    [, [Result_Mechanism =>] MECHANISM_NAME]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION

  PARAMETER_TYPES ::=
    null
  | TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

  TYPE_DESIGNATOR ::=
    subtype_NAME
  | subtype_Name ' Access

  MECHANISM ::=
    MECHANISM_NAME
  | (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

  MECHANISM_ASSOCIATION ::=
    [formal_parameter_NAME =>] MECHANISM_NAME

  MECHANISM_NAME ::=
    Value
  | Reference


This pragma is used in conjunction with a pragma ``Import`` to
specify additional information for an imported function.  The pragma
``Import`` (or equivalent pragma ``Interface``) must precede the
``Import_Function`` pragma and both must appear in the same
declarative part as the function specification.

The ``Internal`` argument must uniquely designate
the function to which the
pragma applies.  If more than one function name exists of this name in
the declarative part you must use the ``Parameter_Types`` and
``Result_Type`` parameters to achieve the required unique
designation.  Subtype marks in these parameters must exactly match the
subtypes in the corresponding function specification, using positional
notation to match parameters with subtype marks.
The form with an ``'Access`` attribute can be used to match an
anonymous access parameter.

You may optionally use the ``Mechanism`` and ``Result_Mechanism``
parameters to specify passing mechanisms for the
parameters and result.  If you specify a single mechanism name, it
applies to all parameters.  Otherwise you may specify a mechanism on a
parameter by parameter basis using either positional or named
notation.  If the mechanism is not specified, the default mechanism
is used.

Pragma Import_Object
====================

Syntax:


::

  pragma Import_Object (
       [Internal =>] LOCAL_NAME
    [, [External =>] EXTERNAL_SYMBOL]
    [, [Size     =>] EXTERNAL_SYMBOL]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION


This pragma designates an object as imported, and apart from the
extended rules for external symbols, is identical in effect to the use of
the normal ``Import`` pragma applied to an object.  Unlike the
subprogram case, you need not use a separate ``Import`` pragma,
although you may do so (and probably should do so from a portability
point of view).  ``size`` is syntax checked, but otherwise ignored by
GNAT.

Pragma Import_Procedure
=======================

Syntax:


::

  pragma Import_Procedure (
       [Internal        =>] LOCAL_NAME
    [, [External        =>] EXTERNAL_SYMBOL]
    [, [Parameter_Types =>] PARAMETER_TYPES]
    [, [Mechanism       =>] MECHANISM]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION

  PARAMETER_TYPES ::=
    null
  | TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

  TYPE_DESIGNATOR ::=
    subtype_NAME
  | subtype_Name ' Access

  MECHANISM ::=
    MECHANISM_NAME
  | (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

  MECHANISM_ASSOCIATION ::=
    [formal_parameter_NAME =>] MECHANISM_NAME

  MECHANISM_NAME ::= Value | Reference


This pragma is identical to ``Import_Function`` except that it
applies to a procedure rather than a function and the parameters
``Result_Type`` and ``Result_Mechanism`` are not permitted.

Pragma Import_Valued_Procedure
==============================

Syntax:


::

  pragma Import_Valued_Procedure (
       [Internal        =>] LOCAL_NAME
    [, [External        =>] EXTERNAL_SYMBOL]
    [, [Parameter_Types =>] PARAMETER_TYPES]
    [, [Mechanism       =>] MECHANISM]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION

  PARAMETER_TYPES ::=
    null
  | TYPE_DESIGNATOR {, TYPE_DESIGNATOR}

  TYPE_DESIGNATOR ::=
    subtype_NAME
  | subtype_Name ' Access

  MECHANISM ::=
    MECHANISM_NAME
  | (MECHANISM_ASSOCIATION {, MECHANISM_ASSOCIATION})

  MECHANISM_ASSOCIATION ::=
    [formal_parameter_NAME =>] MECHANISM_NAME

  MECHANISM_NAME ::= Value | Reference


This pragma is identical to ``Import_Procedure`` except that the
first parameter of ``LOCAL_NAME``, which must be present, must be of
mode ``out``, and externally the subprogram is treated as a function
with this parameter as the result of the function.  The purpose of this
capability is to allow the use of ``out`` and ``in out``
parameters in interfacing to external functions (which are not permitted
in Ada functions).  You may optionally use the ``Mechanism``
parameters to specify passing mechanisms for the parameters.
If you specify a single mechanism name, it applies to all parameters.
Otherwise you may specify a mechanism on a parameter by parameter
basis using either positional or named notation.  If the mechanism is not
specified, the default mechanism is used.

Note that it is important to use this pragma in conjunction with a separate
pragma Import that specifies the desired convention, since otherwise the
default convention is Ada, which is almost certainly not what is required.

Pragma Independent
==================

Syntax:


.. code-block:: ada

  pragma Independent (Local_NAME);


This pragma is standard in Ada 2012 mode (which also provides an aspect
of the same name). It is also available as an implementation-defined
pragma in all earlier versions. It specifies that the
designated object or all objects of the designated type must be
independently addressable. This means that separate tasks can safely
manipulate such objects. For example, if two components of a record are
independent, then two separate tasks may access these two components.
This may place
constraints on the representation of the object (for instance prohibiting
tight packing).

Pragma Independent_Components
=============================

Syntax:


.. code-block:: ada

  pragma Independent_Components (Local_NAME);


This pragma is standard in Ada 2012 mode (which also provides an aspect
of the same name). It is also available as an implementation-defined
pragma in all earlier versions. It specifies that the components of the
designated object, or the components of each object of the designated
type, must be
independently addressable. This means that separate tasks can safely
manipulate separate components in the composite object. This may place
constraints on the representation of the object (for instance prohibiting
tight packing).

.. _Pragma-Initial_Condition:

Pragma Initial_Condition
========================

Syntax:

.. code-block:: ada

  pragma Initial_Condition (boolean_EXPRESSION);

For the semantics of this pragma, see the entry for aspect ``Initial_Condition``
in the SPARK 2014 Reference Manual, section 7.1.6.

Pragma Initialize_Scalars
=========================
.. index:: debugging with Initialize_Scalars

Syntax:


.. code-block:: ada

  pragma Initialize_Scalars
    [ ( TYPE_VALUE_PAIR {, TYPE_VALUE_PAIR} ) ];

  TYPE_VALUE_PAIR ::=
    SCALAR_TYPE => static_EXPRESSION

  SCALAR_TYPE :=
    Short_Float
  | Float
  | Long_Float
  | Long_Long_Flat
  | Signed_8
  | Signed_16
  | Signed_32
  | Signed_64
  | Unsigned_8
  | Unsigned_16
  | Unsigned_32
  | Unsigned_64


This pragma is similar to ``Normalize_Scalars`` conceptually but has two
important differences.

First, there is no requirement for the pragma to be used uniformly in all units
of a partition. In particular, it is fine to use this just for some or all of
the application units of a partition, without needing to recompile the run-time
library. In the case where some units are compiled with the pragma, and some
without, then a declaration of a variable where the type is defined in package
Standard or is locally declared will always be subject to initialization, as
will any declaration of a scalar variable. For composite variables, whether the
variable is initialized may also depend on whether the package in which the
type of the variable is declared is compiled with the pragma.

The other important difference is that the programmer can control the value
used for initializing scalar objects. This effect can be achieved in several
different ways:

* At compile time, the programmer can specify the invalid value for a
  particular family of scalar types using the optional arguments of the pragma.

  The compile-time approach is intended to optimize the generated code for the
  pragma, by possibly using fast operations such as ``memset``. Note that such
  optimizations require using values where the bytes all have the same binary
  representation.

* At bind time, the programmer has several options:

  * Initialization with invalid values (similar to Normalize_Scalars, though
    for Initialize_Scalars it is not always possible to determine the invalid
    values in complex cases like signed component fields with nonstandard
    sizes).

  * Initialization with high values.

  * Initialization with low values.

  * Initialization with a specific bit pattern.

  See the GNAT User's Guide for binder options for specifying these cases.

  The bind-time approach is intended to provide fast turnaround for testing
  with different values, without having to recompile the program.

* At execution time, the programmer can specify the invalid values using an
  environment variable. See the GNAT User's Guide for details.

  The execution-time approach is intended to provide fast turnaround for
  testing with different values, without having to recompile and rebind the
  program.

Note that pragma ``Initialize_Scalars`` is particularly useful in conjunction
with the enhanced validity checking that is now provided in GNAT, which checks
for invalid values under more conditions. Using this feature (see description
of the *-gnatV* flag in the GNAT User's Guide) in conjunction with pragma
``Initialize_Scalars`` provides a powerful new tool to assist in the detection
of problems caused by uninitialized variables.

Note: the use of ``Initialize_Scalars`` has a fairly extensive effect on the
generated code. This may cause your code to be substantially larger. It may
also cause an increase in the amount of stack required, so it is probably a
good idea to turn on stack checking (see description of stack checking in the
GNAT User's Guide) when using this pragma.

.. _Pragma-Initializes:

Pragma Initializes
==================

Syntax:

.. code-block:: ada

  pragma Initializes (INITIALIZATION_LIST);

  INITIALIZATION_LIST ::=
       null
    | (INITIALIZATION_ITEM {, INITIALIZATION_ITEM})

  INITIALIZATION_ITEM ::= name [=> INPUT_LIST]

  INPUT_LIST ::=
       null
    |  INPUT
    | (INPUT {, INPUT})

  INPUT ::= name

For the semantics of this pragma, see the entry for aspect ``Initializes`` in the
SPARK 2014 Reference Manual, section 7.1.5.

.. _Pragma-Inline_Always:

Pragma Inline_Always
====================

Syntax:


::

  pragma Inline_Always (NAME [, NAME]);


Similar to pragma ``Inline`` except that inlining is unconditional.
Inline_Always instructs the compiler to inline every direct call to the
subprogram or else to emit a compilation error, independently of any
option, in particular *-gnatn* or *-gnatN* or the optimization level.
It is an error to take the address or access of ``NAME``. It is also an error to
apply this pragma to a primitive operation of a tagged type. Thanks to such
restrictions, the compiler is allowed to remove the out-of-line body of ``NAME``.

Pragma Inline_Generic
=====================

Syntax:


::

  pragma Inline_Generic (GNAME {, GNAME});

  GNAME ::= generic_unit_NAME | generic_instance_NAME


This pragma is provided for compatibility with Dec Ada 83. It has
no effect in GNAT (which always inlines generics), other
than to check that the given names are all names of generic units or
generic instances.

Pragma Interface
================

Syntax:


::

  pragma Interface (
       [Convention    =>] convention_identifier,
       [Entity        =>] local_NAME
    [, [External_Name =>] static_string_expression]
    [, [Link_Name     =>] static_string_expression]);


This pragma is identical in syntax and semantics to
the standard Ada pragma ``Import``.  It is provided for compatibility
with Ada 83.  The definition is upwards compatible both with pragma
``Interface`` as defined in the Ada 83 Reference Manual, and also
with some extended implementations of this pragma in certain Ada 83
implementations.  The only difference between pragma ``Interface``
and pragma ``Import`` is that there is special circuitry to allow
both pragmas to appear for the same subprogram entity (normally it
is illegal to have multiple ``Import`` pragmas). This is useful in
maintaining Ada 83/Ada 95 compatibility and is compatible with other
Ada 83 compilers.

Pragma Interface_Name
=====================

Syntax:


::

  pragma Interface_Name (
       [Entity        =>] LOCAL_NAME
    [, [External_Name =>] static_string_EXPRESSION]
    [, [Link_Name     =>] static_string_EXPRESSION]);


This pragma provides an alternative way of specifying the interface name
for an interfaced subprogram, and is provided for compatibility with Ada
83 compilers that use the pragma for this purpose.  You must provide at
least one of ``External_Name`` or ``Link_Name``.

Pragma Interrupt_Handler
========================

Syntax:


.. code-block:: ada

  pragma Interrupt_Handler (procedure_LOCAL_NAME);


This program unit pragma is supported for parameterless protected procedures
as described in Annex C of the Ada Reference Manual.

Pragma Interrupt_State
======================

Syntax:


::

  pragma Interrupt_State
   ([Name  =>] value,
    [State =>] SYSTEM | RUNTIME | USER);


Normally certain interrupts are reserved to the implementation.  Any attempt
to attach an interrupt causes Program_Error to be raised, as described in
RM C.3.2(22).  A typical example is the ``SIGINT`` interrupt used in
many systems for an :kbd:`Ctrl-C` interrupt.  Normally this interrupt is
reserved to the implementation, so that :kbd:`Ctrl-C` can be used to
interrupt execution.  Additionally, signals such as ``SIGSEGV``,
``SIGABRT``, ``SIGFPE`` and ``SIGILL`` are often mapped to specific
Ada exceptions, or used to implement run-time functions such as the
``abort`` statement and stack overflow checking.

Pragma ``Interrupt_State`` provides a general mechanism for overriding
such uses of interrupts.  It subsumes the functionality of pragma
``Unreserve_All_Interrupts``.  Pragma ``Interrupt_State`` is not
available on Windows.  On all other platforms than VxWorks,
it applies to signals; on VxWorks, it applies to vectored hardware interrupts
and may be used to mark interrupts required by the board support package
as reserved.

Interrupts can be in one of three states:

* System

  The interrupt is reserved (no Ada handler can be installed), and the
  Ada run-time may not install a handler. As a result you are guaranteed
  standard system default action if this interrupt is raised. This also allows
  installing a low level handler via C APIs such as sigaction(), outside
  of Ada control.

* Runtime

  The interrupt is reserved (no Ada handler can be installed). The run time
  is allowed to install a handler for internal control purposes, but is
  not required to do so.

* User

  The interrupt is unreserved.  The user may install an Ada handler via
  Ada.Interrupts and pragma Interrupt_Handler or Attach_Handler to provide
  some other action.

These states are the allowed values of the ``State`` parameter of the
pragma.  The ``Name`` parameter is a value of the type
``Ada.Interrupts.Interrupt_ID``.  Typically, it is a name declared in
``Ada.Interrupts.Names``.

This is a configuration pragma, and the binder will check that there
are no inconsistencies between different units in a partition in how a
given interrupt is specified. It may appear anywhere a pragma is legal.

The effect is to move the interrupt to the specified state.

By declaring interrupts to be SYSTEM, you guarantee the standard system
action, such as a core dump.

By declaring interrupts to be USER, you guarantee that you can install
a handler.

Note that certain signals on many operating systems cannot be caught and
handled by applications.  In such cases, the pragma is ignored.  See the
operating system documentation, or the value of the array ``Reserved``
declared in the spec of package ``System.OS_Interface``.

Overriding the default state of signals used by the Ada runtime may interfere
with an application's runtime behavior in the cases of the synchronous signals,
and in the case of the signal used to implement the ``abort`` statement.

.. _Pragma-Invariant:

Pragma Invariant
================

Syntax:


::

  pragma Invariant
    ([Entity =>]    private_type_LOCAL_NAME,
     [Check  =>]    EXPRESSION
     [,[Message =>] String_Expression]);


This pragma provides exactly the same capabilities as the Type_Invariant aspect
defined in AI05-0146-1, and in the Ada 2012 Reference Manual. The
Type_Invariant aspect is fully implemented in Ada 2012 mode, but since it
requires the use of the aspect syntax, which is not available except in 2012
mode, it is not possible to use the Type_Invariant aspect in earlier versions
of Ada. However the Invariant pragma may be used in any version of Ada. Also
note that the aspect Invariant is a synonym in GNAT for the aspect
Type_Invariant, but there is no pragma Type_Invariant.

The pragma must appear within the visible part of the package specification,
after the type to which its Entity argument appears. As with the Invariant
aspect, the Check expression is not analyzed until the end of the visible
part of the package, so it may contain forward references. The Message
argument, if present, provides the exception message used if the invariant
is violated. If no Message parameter is provided, a default message that
identifies the line on which the pragma appears is used.

It is permissible to have multiple Invariants for the same type entity, in
which case they are and'ed together. It is permissible to use this pragma
in Ada 2012 mode, but you cannot have both an invariant aspect and an
invariant pragma for the same entity.

For further details on the use of this pragma, see the Ada 2012 documentation
of the Type_Invariant aspect.

Pragma Keep_Names
=================

Syntax:


::

  pragma Keep_Names ([On =>] enumeration_first_subtype_LOCAL_NAME);


The ``LOCAL_NAME`` argument
must refer to an enumeration first subtype
in the current declarative part. The effect is to retain the enumeration
literal names for use by ``Image`` and ``Value`` even if a global
``Discard_Names`` pragma applies. This is useful when you want to
generally suppress enumeration literal names and for example you therefore
use a ``Discard_Names`` pragma in the :file:`gnat.adc` file, but you
want to retain the names for specific enumeration types.

Pragma License
==============
.. index:: License checking

Syntax:


.. code-block:: ada

  pragma License (Unrestricted | GPL | Modified_GPL | Restricted);


This pragma is provided to allow automated checking for appropriate license
conditions with respect to the standard and modified GPL.  A pragma
``License``, which is a configuration pragma that typically appears at
the start of a source file or in a separate :file:`gnat.adc` file, specifies
the licensing conditions of a unit as follows:

* Unrestricted
  This is used for a unit that can be freely used with no license restrictions.
  Examples of such units are public domain units, and units from the Ada
  Reference Manual.

* GPL
  This is used for a unit that is licensed under the unmodified GPL, and which
  therefore cannot be ``with``\ ed by a restricted unit.

* Modified_GPL
  This is used for a unit licensed under the GNAT modified GPL that includes
  a special exception paragraph that specifically permits the inclusion of
  the unit in programs without requiring the entire program to be released
  under the GPL.

* Restricted
  This is used for a unit that is restricted in that it is not permitted to
  depend on units that are licensed under the GPL.  Typical examples are
  proprietary code that is to be released under more restrictive license
  conditions.  Note that restricted units are permitted to ``with`` units
  which are licensed under the modified GPL (this is the whole point of the
  modified GPL).


Normally a unit with no ``License`` pragma is considered to have an
unknown license, and no checking is done.  However, standard GNAT headers
are recognized, and license information is derived from them as follows.

A GNAT license header starts with a line containing 78 hyphens.  The following
comment text is searched for the appearance of any of the following strings.

If the string 'GNU General Public License' is found, then the unit is assumed
to have GPL license, unless the string 'As a special exception' follows, in
which case the license is assumed to be modified GPL.

If one of the strings
'This specification is adapted from the Ada Semantic Interface' or
'This specification is derived from the Ada Reference Manual' is found
then the unit is assumed to be unrestricted.

These default actions means that a program with a restricted license pragma
will automatically get warnings if a GPL unit is inappropriately
``with``\ ed.  For example, the program:

.. code-block:: ada

  with Sem_Ch3;
  with GNAT.Sockets;
  procedure Secret_Stuff is
    ...
  end Secret_Stuff


if compiled with pragma ``License`` (``Restricted``) in a
:file:`gnat.adc` file will generate the warning::

  1.  with Sem_Ch3;
          |
     >>> license of withed unit "Sem_Ch3" is incompatible

  2.  with GNAT.Sockets;
  3.  procedure Secret_Stuff is


Here we get a warning on ``Sem_Ch3`` since it is part of the GNAT
compiler and is licensed under the
GPL, but no warning for ``GNAT.Sockets`` which is part of the GNAT
run time, and is therefore licensed under the modified GPL.

Pragma Link_With
================

Syntax:


::

  pragma Link_With (static_string_EXPRESSION {,static_string_EXPRESSION});


This pragma is provided for compatibility with certain Ada 83 compilers.
It has exactly the same effect as pragma ``Linker_Options`` except
that spaces occurring within one of the string expressions are treated
as separators. For example, in the following case:

.. code-block:: ada

  pragma Link_With ("-labc -ldef");


results in passing the strings ``-labc`` and ``-ldef`` as two
separate arguments to the linker. In addition pragma Link_With allows
multiple arguments, with the same effect as successive pragmas.

Pragma Linker_Alias
===================

Syntax:


::

  pragma Linker_Alias (
    [Entity =>] LOCAL_NAME,
    [Target =>] static_string_EXPRESSION);


``LOCAL_NAME`` must refer to an object that is declared at the library
level. This pragma establishes the given entity as a linker alias for the
given target. It is equivalent to ``__attribute__((alias))`` in GNU C
and causes ``LOCAL_NAME`` to be emitted as an alias for the symbol
``static_string_EXPRESSION`` in the object file, that is to say no space
is reserved for ``LOCAL_NAME`` by the assembler and it will be resolved
to the same address as ``static_string_EXPRESSION`` by the linker.

The actual linker name for the target must be used (e.g., the fully
encoded name with qualification in Ada, or the mangled name in C++),
or it must be declared using the C convention with ``pragma Import``
or ``pragma Export``.

Not all target machines support this pragma. On some of them it is accepted
only if ``pragma Weak_External`` has been applied to ``LOCAL_NAME``.


.. code-block:: ada

  --  Example of the use of pragma Linker_Alias

  package p is
    i : Integer := 1;
    pragma Export (C, i);

    new_name_for_i : Integer;
    pragma Linker_Alias (new_name_for_i, "i");
  end p;


Pragma Linker_Constructor
=========================

Syntax:


.. code-block:: ada

  pragma Linker_Constructor (procedure_LOCAL_NAME);


``procedure_LOCAL_NAME`` must refer to a parameterless procedure that
is declared at the library level. A procedure to which this pragma is
applied will be treated as an initialization routine by the linker.
It is equivalent to ``__attribute__((constructor))`` in GNU C and
causes ``procedure_LOCAL_NAME`` to be invoked before the entry point
of the executable is called (or immediately after the shared library is
loaded if the procedure is linked in a shared library), in particular
before the Ada run-time environment is set up.

Because of these specific contexts, the set of operations such a procedure
can perform is very limited and the type of objects it can manipulate is
essentially restricted to the elementary types. In particular, it must only
contain code to which pragma Restrictions (No_Elaboration_Code) applies.

This pragma is used by GNAT to implement auto-initialization of shared Stand
Alone Libraries, which provides a related capability without the restrictions
listed above. Where possible, the use of Stand Alone Libraries is preferable
to the use of this pragma.

Pragma Linker_Destructor
========================

Syntax:


.. code-block:: ada

  pragma Linker_Destructor (procedure_LOCAL_NAME);


``procedure_LOCAL_NAME`` must refer to a parameterless procedure that
is declared at the library level. A procedure to which this pragma is
applied will be treated as a finalization routine by the linker.
It is equivalent to ``__attribute__((destructor))`` in GNU C and
causes ``procedure_LOCAL_NAME`` to be invoked after the entry point
of the executable has exited (or immediately before the shared library
is unloaded if the procedure is linked in a shared library), in particular
after the Ada run-time environment is shut down.

See ``pragma Linker_Constructor`` for the set of restrictions that apply
because of these specific contexts.

.. _Pragma-Linker_Section:

Pragma Linker_Section
=====================

Syntax:


::

  pragma Linker_Section (
    [Entity  =>] LOCAL_NAME,
    [Section =>] static_string_EXPRESSION);


``LOCAL_NAME`` must refer to an object, type, or subprogram that is
declared at the library level. This pragma specifies the name of the
linker section for the given entity. It is equivalent to
``__attribute__((section))`` in GNU C and causes ``LOCAL_NAME`` to
be placed in the ``static_string_EXPRESSION`` section of the
executable (assuming the linker doesn't rename the section).
GNAT also provides an implementation defined aspect of the same name.

In the case of specifying this aspect for a type, the effect is to
specify the corresponding section for all library-level objects of
the type that do not have an explicit linker section set. Note that
this only applies to whole objects, not to components of composite objects.

In the case of a subprogram, the linker section applies to all previously
declared matching overloaded subprograms in the current declarative part
which do not already have a linker section assigned. The linker section
aspect is useful in this case for specifying different linker sections
for different elements of such an overloaded set.

Note that an empty string specifies that no linker section is specified.
This is not quite the same as omitting the pragma or aspect, since it
can be used to specify that one element of an overloaded set of subprograms
has the default linker section, or that one object of a type for which a
linker section is specified should has the default linker section.

The compiler normally places library-level entities in standard sections
depending on the class: procedures and functions generally go in the
``.text`` section, initialized variables in the ``.data`` section
and uninitialized variables in the ``.bss`` section.

Other, special sections may exist on given target machines to map special
hardware, for example I/O ports or flash memory. This pragma is a means to
defer the final layout of the executable to the linker, thus fully working
at the symbolic level with the compiler.

Some file formats do not support arbitrary sections so not all target
machines support this pragma. The use of this pragma may cause a program
execution to be erroneous if it is used to place an entity into an
inappropriate section (e.g., a modified variable into the ``.text``
section). See also ``pragma Persistent_BSS``.


.. code-block:: ada

  --  Example of the use of pragma Linker_Section

  package IO_Card is
    Port_A : Integer;
    pragma Volatile (Port_A);
    pragma Linker_Section (Port_A, ".bss.port_a");

    Port_B : Integer;
    pragma Volatile (Port_B);
    pragma Linker_Section (Port_B, ".bss.port_b");

    type Port_Type is new Integer with Linker_Section => ".bss";
    PA : Port_Type with Linker_Section => ".bss.PA";
    PB : Port_Type; --  ends up in linker section ".bss"

    procedure Q with Linker_Section => "Qsection";
  end IO_Card;

.. _Pragma-Lock_Free:

Pragma Lock_Free
================

Syntax:
This pragma may be specified for protected types or objects. It specifies that
the implementation of protected operations must be implemented without locks.
Compilation fails if the compiler cannot generate lock-free code for the
operations.

The current conditions required to support this pragma are:

* Protected type declarations may not contain entries
* Protected subprogram declarations may not have nonelementary parameters

In addition, each protected subprogram body must satisfy:

* May reference only one protected component
* May not reference nonconstant entities outside the protected subprogram
  scope
* May not contain address representation items, allocators, or quantified
  expressions
* May not contain delay, goto, loop, or procedure-call statements
* May not contain exported and imported entities
* May not dereferenced access values
* Function calls and attribute references must be static

If the Lock_Free aspect is specified to be True for a protected unit
and the Ceiling_Locking locking policy is in effect, then the run-time
actions associated with the Ceiling_Locking locking policy (described in
Ada RM D.3) are not performed when a protected operation of the protected
unit is executed.
  
Pragma Loop_Invariant
=====================

Syntax:


.. code-block:: ada

  pragma Loop_Invariant ( boolean_EXPRESSION );


The effect of this pragma is similar to that of pragma ``Assert``,
except that in an ``Assertion_Policy`` pragma, the identifier
``Loop_Invariant`` is used to control whether it is ignored or checked
(or disabled).

``Loop_Invariant`` can only appear as one of the items in the sequence
of statements of a loop body, or nested inside block statements that
appear in the sequence of statements of a loop body.
The intention is that it be used to
represent a "loop invariant" assertion, i.e. something that is true each
time through the loop, and which can be used to show that the loop is
achieving its purpose.

Multiple ``Loop_Invariant`` and ``Loop_Variant`` pragmas that
apply to the same loop should be grouped in the same sequence of
statements.

To aid in writing such invariants, the special attribute ``Loop_Entry``
may be used to refer to the value of an expression on entry to the loop. This
attribute can only be used within the expression of a ``Loop_Invariant``
pragma. For full details, see documentation of attribute ``Loop_Entry``.

Pragma Loop_Optimize
====================

Syntax:


::

  pragma Loop_Optimize (OPTIMIZATION_HINT {, OPTIMIZATION_HINT});

  OPTIMIZATION_HINT ::= Ivdep | No_Unroll | Unroll | No_Vector | Vector


This pragma must appear immediately within a loop statement.  It allows the
programmer to specify optimization hints for the enclosing loop.  The hints
are not mutually exclusive and can be freely mixed, but not all combinations
will yield a sensible outcome.

There are five supported optimization hints for a loop:

* Ivdep

  The programmer asserts that there are no loop-carried dependencies
  which would prevent consecutive iterations of the loop from being
  executed simultaneously.

* No_Unroll

  The loop must not be unrolled.  This is a strong hint: the compiler will not
  unroll a loop marked with this hint.

* Unroll

  The loop should be unrolled.  This is a weak hint: the compiler will try to
  apply unrolling to this loop preferably to other optimizations, notably
  vectorization, but there is no guarantee that the loop will be unrolled.

* No_Vector

  The loop must not be vectorized.  This is a strong hint: the compiler will not
  vectorize a loop marked with this hint.

* Vector

  The loop should be vectorized.  This is a weak hint: the compiler will try to
  apply vectorization to this loop preferably to other optimizations, notably
  unrolling, but there is no guarantee that the loop will be vectorized.


These hints do not remove the need to pass the appropriate switches to the
compiler in order to enable the relevant optimizations, that is to say
*-funroll-loops* for unrolling and *-ftree-vectorize* for
vectorization.

Pragma Loop_Variant
===================

Syntax:


::

  pragma Loop_Variant ( LOOP_VARIANT_ITEM {, LOOP_VARIANT_ITEM } );
  LOOP_VARIANT_ITEM ::= CHANGE_DIRECTION => discrete_EXPRESSION
  CHANGE_DIRECTION ::= Increases | Decreases


``Loop_Variant`` can only appear as one of the items in the sequence
of statements of a loop body, or nested inside block statements that
appear in the sequence of statements of a loop body.
It allows the specification of quantities which must always
decrease or increase in successive iterations of the loop. In its simplest
form, just one expression is specified, whose value must increase or decrease
on each iteration of the loop.

In a more complex form, multiple arguments can be given which are intepreted
in a nesting lexicographic manner. For example:

.. code-block:: ada

  pragma Loop_Variant (Increases => X, Decreases => Y);


specifies that each time through the loop either X increases, or X stays
the same and Y decreases. A ``Loop_Variant`` pragma ensures that the
loop is making progress. It can be useful in helping to show informally
or prove formally that the loop always terminates.

``Loop_Variant`` is an assertion whose effect can be controlled using
an ``Assertion_Policy`` with a check name of ``Loop_Variant``. The
policy can be ``Check`` to enable the loop variant check, ``Ignore``
to ignore the check (in which case the pragma has no effect on the program),
or ``Disable`` in which case the pragma is not even checked for correct
syntax.

Multiple ``Loop_Invariant`` and ``Loop_Variant`` pragmas that
apply to the same loop should be grouped in the same sequence of
statements.

The ``Loop_Entry`` attribute may be used within the expressions of the
``Loop_Variant`` pragma to refer to values on entry to the loop.

Pragma Machine_Attribute
========================

Syntax:


::

  pragma Machine_Attribute (
       [Entity         =>] LOCAL_NAME,
       [Attribute_Name =>] static_string_EXPRESSION
    [, [Info           =>] static_EXPRESSION {, static_EXPRESSION}] );


Machine-dependent attributes can be specified for types and/or
declarations.  This pragma is semantically equivalent to
:samp:`__attribute__(({attribute_name}))` (if ``info`` is not
specified) or :samp:`__attribute__(({attribute_name(info})))`
or :samp:`__attribute__(({attribute_name(info,...})))` in GNU C,
where *attribute_name* is recognized by the compiler middle-end
or the ``TARGET_ATTRIBUTE_TABLE`` machine specific macro.  Note
that a string literal for the optional parameter ``info`` or the
following ones is transformed by default into an identifier,
which may make this pragma unusable for some attributes.
For further information see :title:`GNU Compiler Collection (GCC) Internals`.

Pragma Main
===========

Syntax::

  pragma Main
   (MAIN_OPTION [, MAIN_OPTION]);

  MAIN_OPTION ::=
    [Stack_Size              =>] static_integer_EXPRESSION
  | [Task_Stack_Size_Default =>] static_integer_EXPRESSION
  | [Time_Slicing_Enabled    =>] static_boolean_EXPRESSION


This pragma is provided for compatibility with OpenVMS VAX Systems.  It has
no effect in GNAT, other than being syntax checked.

Pragma Main_Storage
===================

Syntax::

  pragma Main_Storage
    (MAIN_STORAGE_OPTION [, MAIN_STORAGE_OPTION]);

  MAIN_STORAGE_OPTION ::=
    [WORKING_STORAGE =>] static_SIMPLE_EXPRESSION
  | [TOP_GUARD       =>] static_SIMPLE_EXPRESSION


This pragma is provided for compatibility with OpenVMS VAX Systems.  It has
no effect in GNAT, other than being syntax checked.

.. _Pragma-Max_Queue_Length:

Pragma Max_Queue_Length
=======================

Syntax::

   pragma Max_Entry_Queue (static_integer_EXPRESSION);


This pragma is used to specify the maximum callers per entry queue for
individual protected entries and entry families. It accepts a single
integer (-1 or more) as a parameter and must appear after the declaration of an
entry.

A value of -1 represents no additional restriction on queue length.

Pragma No_Body
==============

Syntax:


.. code-block:: ada

  pragma No_Body;


There are a number of cases in which a package spec does not require a body,
and in fact a body is not permitted. GNAT will not permit the spec to be
compiled if there is a body around. The pragma No_Body allows you to provide
a body file, even in a case where no body is allowed. The body file must
contain only comments and a single No_Body pragma. This is recognized by
the compiler as indicating that no body is logically present.

This is particularly useful during maintenance when a package is modified in
such a way that a body needed before is no longer needed. The provision of a
dummy body with a No_Body pragma ensures that there is no interference from
earlier versions of the package body.

.. _Pragma-No_Caching:

Pragma No_Caching
=================

Syntax:

.. code-block:: ada

  pragma No_Caching [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect ``No_Caching`` in
the SPARK 2014 Reference Manual, section 7.1.2.

Pragma No_Component_Reordering
==============================

Syntax:


::

  pragma No_Component_Reordering [([Entity =>] type_LOCAL_NAME)];


``type_LOCAL_NAME`` must refer to a record type declaration in the current
declarative part. The effect is to preclude any reordering of components
for the layout of the record, i.e. the record is laid out by the compiler
in the order in which the components are declared textually. The form with
no argument is a configuration pragma which applies to all record types
declared in units to which the pragma applies and there is a requirement
that this pragma be used consistently within a partition.

.. _Pragma-No_Elaboration_Code_All:

Pragma No_Elaboration_Code_All
==============================

Syntax:


::

  pragma No_Elaboration_Code_All [(program_unit_NAME)];


This is a program unit pragma (there is also an equivalent aspect of the
same name) that establishes the restriction ``No_Elaboration_Code`` for
the current unit and any extended main source units (body and subunits).
It also has the effect of enforcing a transitive application of this
aspect, so that if any unit is implicitly or explicitly with'ed by the
current unit, it must also have the No_Elaboration_Code_All aspect set.
It may be applied to package or subprogram specs or their generic versions.

Pragma No_Heap_Finalization
===========================

Syntax:


::

  pragma No_Heap_Finalization [ (first_subtype_LOCAL_NAME) ];


Pragma ``No_Heap_Finalization`` may be used as a configuration pragma or as a
type-specific pragma.

In its configuration form, the pragma must appear within a configuration file
such as gnat.adc, without an argument. The pragma suppresses the call to
``Finalize`` for heap-allocated objects created through library-level named
access-to-object types in cases where the designated type requires finalization
actions.

In its type-specific form, the argument of the pragma must denote a
library-level named access-to-object type. The pragma suppresses the call to
``Finalize`` for heap-allocated objects created through the specific access type
in cases where the designated type requires finalization actions.

It is still possible to finalize such heap-allocated objects by explicitly
deallocating them.

A library-level named access-to-object type declared within a generic unit will
lose its ``No_Heap_Finalization`` pragma when the corresponding instance does not
appear at the library level.

.. _Pragma-No_Inline:

Pragma No_Inline
================

Syntax:


::

  pragma No_Inline (NAME {, NAME});


This pragma suppresses inlining for the callable entity or the instances of
the generic subprogram designated by ``NAME``, including inlining that
results from the use of pragma ``Inline``.  This pragma is always active,
in particular it is not subject to the use of option *-gnatn* or
*-gnatN*.  It is illegal to specify both pragma ``No_Inline`` and
pragma ``Inline_Always`` for the same ``NAME``.

Pragma No_Return
================

Syntax:


::

  pragma No_Return (procedure_LOCAL_NAME {, procedure_LOCAL_NAME});


Each ``procedure_LOCAL_NAME`` argument must refer to one or more procedure
declarations in the current declarative part.  A procedure to which this
pragma is applied may not contain any explicit ``return`` statements.
In addition, if the procedure contains any implicit returns from falling
off the end of a statement sequence, then execution of that implicit
return will cause Program_Error to be raised.

One use of this pragma is to identify procedures whose only purpose is to raise
an exception. Another use of this pragma is to suppress incorrect warnings
about missing returns in functions, where the last statement of a function
statement sequence is a call to such a procedure.

Note that in Ada 2005 mode, this pragma is part of the language. It is
available in all earlier versions of Ada as an implementation-defined
pragma.

Pragma No_Strict_Aliasing
=========================

Syntax:


::

  pragma No_Strict_Aliasing [([Entity =>] type_LOCAL_NAME)];


``type_LOCAL_NAME`` must refer to an access type
declaration in the current declarative part.  The effect is to inhibit
strict aliasing optimization for the given type.  The form with no
arguments is a configuration pragma which applies to all access types
declared in units to which the pragma applies. For a detailed
description of the strict aliasing optimization, and the situations
in which it must be suppressed, see the section on Optimization and Strict Aliasing
in the :title:`GNAT User's Guide`.

This pragma currently has no effects on access to unconstrained array types.

.. _Pragma-No_Tagged_Streams:

Pragma No_Tagged_Streams
========================

Syntax:


::

  pragma No_Tagged_Streams [([Entity =>] tagged_type_LOCAL_NAME)];


Normally when a tagged type is introduced using a full type declaration,
part of the processing includes generating stream access routines to be
used by stream attributes referencing the type (or one of its subtypes
or derived types). This can involve the generation of significant amounts
of code which is wasted space if stream routines are not needed for the
type in question.

The ``No_Tagged_Streams`` pragma causes the generation of these stream
routines to be skipped, and any attempt to use stream operations on
types subject to this pragma will be statically rejected as illegal.

There are two forms of the pragma. The form with no arguments must appear
in a declarative sequence or in the declarations of a package spec. This
pragma affects all subsequent root tagged types declared in the declaration
sequence, and specifies that no stream routines be generated. The form with
an argument (for which there is also a corresponding aspect) specifies a
single root tagged type for which stream routines are not to be generated.

Once the pragma has been given for a particular root tagged type, all subtypes
and derived types of this type inherit the pragma automatically, so the effect
applies to a complete hierarchy (this is necessary to deal with the class-wide
dispatching versions of the stream routines).

When pragmas ``Discard_Names`` and ``No_Tagged_Streams`` are simultaneously
applied to a tagged type its Expanded_Name and External_Tag are initialized
with empty strings. This is useful to avoid exposing entity names at binary
level but has a negative impact on the debuggability of tagged types.

Pragma Normalize_Scalars
========================

Syntax:


.. code-block:: ada

  pragma Normalize_Scalars;


This is a language defined pragma which is fully implemented in GNAT.  The
effect is to cause all scalar objects that are not otherwise initialized
to be initialized.  The initial values are implementation dependent and
are as follows:



*Standard.Character*
  Objects whose root type is Standard.Character are initialized to
  Character'Last unless the subtype range excludes NUL (in which case
  NUL is used). This choice will always generate an invalid value if
  one exists.


*Standard.Wide_Character*
  Objects whose root type is Standard.Wide_Character are initialized to
  Wide_Character'Last unless the subtype range excludes NUL (in which case
  NUL is used). This choice will always generate an invalid value if
  one exists.


*Standard.Wide_Wide_Character*
  Objects whose root type is Standard.Wide_Wide_Character are initialized to
  the invalid value 16#FFFF_FFFF# unless the subtype range excludes NUL (in
  which case NUL is used). This choice will always generate an invalid value if
  one exists.


*Integer types*
  Objects of an integer type are treated differently depending on whether
  negative values are present in the subtype. If no negative values are
  present, then all one bits is used as the initial value except in the
  special case where zero is excluded from the subtype, in which case
  all zero bits are used. This choice will always generate an invalid
  value if one exists.

  For subtypes with negative values present, the largest negative number
  is used, except in the unusual case where this largest negative number
  is in the subtype, and the largest positive number is not, in which case
  the largest positive value is used. This choice will always generate
  an invalid value if one exists.


*Floating-Point Types*
  Objects of all floating-point types are initialized to all 1-bits. For
  standard IEEE format, this corresponds to a NaN (not a number) which is
  indeed an invalid value.


*Fixed-Point Types*
  Objects of all fixed-point types are treated as described above for integers,
  with the rules applying to the underlying integer value used to represent
  the fixed-point value.


*Modular types*
  Objects of a modular type are initialized to all one bits, except in
  the special case where zero is excluded from the subtype, in which
  case all zero bits are used. This choice will always generate an
  invalid value if one exists.


*Enumeration types*
  Objects of an enumeration type are initialized to all one-bits, i.e., to
  the value ``2 ** typ'Size - 1`` unless the subtype excludes the literal
  whose Pos value is zero, in which case a code of zero is used. This choice
  will always generate an invalid value if one exists.

.. _Pragma_Obsolescent:

Pragma Obsolescent
==================

Syntax:


::

  pragma Obsolescent;

  pragma Obsolescent (
    [Message =>] static_string_EXPRESSION
  [,[Version =>] Ada_05]);

  pragma Obsolescent (
    [Entity  =>] NAME
  [,[Message =>] static_string_EXPRESSION
  [,[Version =>] Ada_05]]);


This pragma can occur immediately following a declaration of an entity,
including the case of a record component. If no Entity argument is present,
then this declaration is the one to which the pragma applies. If an Entity
parameter is present, it must either match the name of the entity in this
declaration, or alternatively, the pragma can immediately follow an enumeration
type declaration, where the Entity argument names one of the enumeration
literals.

This pragma is used to indicate that the named entity
is considered obsolescent and should not be used. Typically this is
used when an API must be modified by eventually removing or modifying
existing subprograms or other entities. The pragma can be used at an
intermediate stage when the entity is still present, but will be
removed later.

The effect of this pragma is to output a warning message on a reference to
an entity thus marked that the subprogram is obsolescent if the appropriate
warning option in the compiler is activated. If the ``Message`` parameter is
present, then a second warning message is given containing this text. In
addition, a reference to the entity is considered to be a violation of pragma
``Restrictions (No_Obsolescent_Features)``.

This pragma can also be used as a program unit pragma for a package,
in which case the entity name is the name of the package, and the
pragma indicates that the entire package is considered
obsolescent. In this case a client ``with``\ ing such a package
violates the restriction, and the ``with`` clause is
flagged with warnings if the warning option is set.

If the ``Version`` parameter is present (which must be exactly
the identifier ``Ada_05``, no other argument is allowed), then the
indication of obsolescence applies only when compiling in Ada 2005
mode. This is primarily intended for dealing with the situations
in the predefined library where subprograms or packages
have become defined as obsolescent in Ada 2005
(e.g., in ``Ada.Characters.Handling``), but may be used anywhere.

The following examples show typical uses of this pragma:


.. code-block:: ada

  package p is
     pragma Obsolescent (p, Message => "use pp instead of p");
  end p;

  package q is
     procedure q2;
     pragma Obsolescent ("use q2new instead");

     type R is new integer;
     pragma Obsolescent
       (Entity  => R,
        Message => "use RR in Ada 2005",
        Version => Ada_05);

     type M is record
        F1 : Integer;
        F2 : Integer;
        pragma Obsolescent;
        F3 : Integer;
     end record;

     type E is (a, bc, 'd', quack);
     pragma Obsolescent (Entity => bc)
     pragma Obsolescent (Entity => 'd')

     function "+"
       (a, b : character) return character;
     pragma Obsolescent (Entity => "+");
  end;


Note that, as for all pragmas, if you use a pragma argument identifier,
then all subsequent parameters must also use a pragma argument identifier.
So if you specify ``Entity =>`` for the ``Entity`` argument, and a ``Message``
argument is present, it must be preceded by ``Message =>``.

Pragma Optimize_Alignment
=========================
.. index:: Alignment, default settings

Syntax:


.. code-block:: ada

  pragma Optimize_Alignment (TIME | SPACE | OFF);


This is a configuration pragma which affects the choice of default alignments
for types and objects where no alignment is explicitly specified. There is a
time/space trade-off in the selection of these values. Large alignments result
in more efficient code, at the expense of larger data space, since sizes have
to be increased to match these alignments. Smaller alignments save space, but
the access code is slower. The normal choice of default alignments for types
and individual alignment promotions for objects (which is what you get if you
do not use this pragma, or if you use an argument of OFF), tries to balance
these two requirements.

Specifying SPACE causes smaller default alignments to be chosen in two cases.
First any packed record is given an alignment of 1. Second, if a size is given
for the type, then the alignment is chosen to avoid increasing this size. For
example, consider:


.. code-block:: ada

     type R is record
        X : Integer;
        Y : Character;
     end record;

     for R'Size use 5*8;


In the default mode, this type gets an alignment of 4, so that access to the
Integer field X are efficient. But this means that objects of the type end up
with a size of 8 bytes. This is a valid choice, since sizes of objects are
allowed to be bigger than the size of the type, but it can waste space if for
example fields of type R appear in an enclosing record. If the above type is
compiled in ``Optimize_Alignment (Space)`` mode, the alignment is set to 1.

However, there is one case in which SPACE is ignored. If a variable length
record (that is a discriminated record with a component which is an array
whose length depends on a discriminant), has a pragma Pack, then it is not
in general possible to set the alignment of such a record to one, so the
pragma is ignored in this case (with a warning).

Specifying SPACE also disables alignment promotions for standalone objects,
which occur when the compiler increases the alignment of a specific object
without changing the alignment of its type.

Specifying SPACE also disables component reordering in unpacked record types,
which can result in larger sizes in order to meet alignment requirements.

Specifying TIME causes larger default alignments to be chosen in the case of
small types with sizes that are not a power of 2. For example, consider:


.. code-block:: ada

     type R is record
        A : Character;
        B : Character;
        C : Boolean;
     end record;

     pragma Pack (R);
     for R'Size use 17;


The default alignment for this record is normally 1, but if this type is
compiled in ``Optimize_Alignment (Time)`` mode, then the alignment is set
to 4, which wastes space for objects of the type, since they are now 4 bytes
long, but results in more efficient access when the whole record is referenced.

As noted above, this is a configuration pragma, and there is a requirement
that all units in a partition be compiled with a consistent setting of the
optimization setting. This would normally be achieved by use of a configuration
pragma file containing the appropriate setting. The exception to this rule is
that units with an explicit configuration pragma in the same file as the source
unit are excluded from the consistency check, as are all predefined units. The
latter are compiled by default in pragma Optimize_Alignment (Off) mode if no
pragma appears at the start of the file.

Pragma Ordered
==============

Syntax:


.. code-block:: ada

  pragma Ordered (enumeration_first_subtype_LOCAL_NAME);


Most enumeration types are from a conceptual point of view unordered.
For example, consider:


.. code-block:: ada

  type Color is (Red, Blue, Green, Yellow);


By Ada semantics ``Blue > Red`` and ``Green > Blue``,
but really these relations make no sense; the enumeration type merely
specifies a set of possible colors, and the order is unimportant.

For unordered enumeration types, it is generally a good idea if
clients avoid comparisons (other than equality or inequality) and
explicit ranges. (A *client* is a unit where the type is referenced,
other than the unit where the type is declared, its body, and its subunits.)
For example, if code buried in some client says:


.. code-block:: ada

  if Current_Color < Yellow then ...
  if Current_Color in Blue .. Green then ...


then the client code is relying on the order, which is undesirable.
It makes the code hard to read and creates maintenance difficulties if
entries have to be added to the enumeration type. Instead,
the code in the client should list the possibilities, or an
appropriate subtype should be declared in the unit that declares
the original enumeration type. E.g., the following subtype could
be declared along with the type ``Color``:


.. code-block:: ada

  subtype RBG is Color range Red .. Green;


and then the client could write:


.. code-block:: ada

  if Current_Color in RBG then ...
  if Current_Color = Blue or Current_Color = Green then ...


However, some enumeration types are legitimately ordered from a conceptual
point of view. For example, if you declare:


.. code-block:: ada

  type Day is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);


then the ordering imposed by the language is reasonable, and
clients can depend on it, writing for example:


.. code-block:: ada

  if D in Mon .. Fri then ...
  if D < Wed then ...


The pragma *Ordered* is provided to mark enumeration types that
are conceptually ordered, alerting the reader that clients may depend
on the ordering. GNAT provides a pragma to mark enumerations as ordered
rather than one to mark them as unordered, since in our experience,
the great majority of enumeration types are conceptually unordered.

The types ``Boolean``, ``Character``, ``Wide_Character``,
and ``Wide_Wide_Character``
are considered to be ordered types, so each is declared with a
pragma ``Ordered`` in package ``Standard``.

Normally pragma ``Ordered`` serves only as documentation and a guide for
coding standards, but GNAT provides a warning switch *-gnatw.u* that
requests warnings for inappropriate uses (comparisons and explicit
subranges) for unordered types. If this switch is used, then any
enumeration type not marked with pragma ``Ordered`` will be considered
as unordered, and will generate warnings for inappropriate uses.

Note that generic types are not considered ordered or unordered (since the
template can be instantiated for both cases), so we never generate warnings
for the case of generic enumerated types.

For additional information please refer to the description of the
*-gnatw.u* switch in the GNAT User's Guide.

Pragma Overflow_Mode
====================

Syntax:


::

  pragma Overflow_Mode
   (  [General    =>] MODE
    [,[Assertions =>] MODE]);

  MODE ::= STRICT | MINIMIZED | ELIMINATED


This pragma sets the current overflow mode to the given setting. For details
of the meaning of these modes, please refer to the
'Overflow Check Handling in GNAT' appendix in the
GNAT User's Guide. If only the ``General`` parameter is present,
the given mode applies to all expressions. If both parameters are present,
the ``General`` mode applies to expressions outside assertions, and
the ``Eliminated`` mode applies to expressions within assertions.

The case of the ``MODE`` parameter is ignored,
so ``MINIMIZED``, ``Minimized`` and
``minimized`` all have the same effect.

The ``Overflow_Mode`` pragma has the same scoping and placement
rules as pragma ``Suppress``, so it can occur either as a
configuration pragma, specifying a default for the whole
program, or in a declarative scope, where it applies to the
remaining declarations and statements in that scope.

The pragma ``Suppress (Overflow_Check)`` suppresses
overflow checking, but does not affect the overflow mode.

The pragma ``Unsuppress (Overflow_Check)`` unsuppresses (enables)
overflow checking, but does not affect the overflow mode.

Pragma Overriding_Renamings
===========================
.. index:: Rational profile

.. index:: Rational compatibility

Syntax:


.. code-block:: ada

  pragma Overriding_Renamings;


This is a GNAT configuration pragma to simplify porting
legacy code accepted by the Rational
Ada compiler. In the presence of this pragma, a renaming declaration that
renames an inherited operation declared in the same scope is legal if selected
notation is used as in:


.. code-block:: ada

  pragma Overriding_Renamings;
  ...
  package R is
    function F (..);
    ...
    function F (..) renames R.F;
  end R;


even though
RM 8.3 (15) stipulates that an overridden operation is not visible within the
declaration of the overriding operation.

Pragma Partition_Elaboration_Policy
===================================

Syntax:


::

  pragma Partition_Elaboration_Policy (POLICY_IDENTIFIER);

  POLICY_IDENTIFIER ::= Concurrent | Sequential


This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma.
See Ada 2012 Reference Manual for details.

.. _Pragma-Part_Of:

Pragma Part_Of
==============

Syntax:

.. code-block:: ada

  pragma Part_Of (ABSTRACT_STATE);

  ABSTRACT_STATE ::= NAME

For the semantics of this pragma, see the entry for aspect ``Part_Of`` in the
SPARK 2014 Reference Manual, section 7.2.6.

Pragma Passive
==============

Syntax:


::

  pragma Passive [(Semaphore | No)];


Syntax checked, but otherwise ignored by GNAT.  This is recognized for
compatibility with DEC Ada 83 implementations, where it is used within a
task definition to request that a task be made passive.  If the argument
``Semaphore`` is present, or the argument is omitted, then DEC Ada 83
treats the pragma as an assertion that the containing task is passive
and that optimization of context switch with this task is permitted and
desired.  If the argument ``No`` is present, the task must not be
optimized.  GNAT does not attempt to optimize any tasks in this manner
(since protected objects are available in place of passive tasks).

For more information on the subject of passive tasks, see the section
'Passive Task Optimization' in the GNAT Users Guide.

.. _Pragma-Persistent_BSS:

Pragma Persistent_BSS
=====================

Syntax:


::

  pragma Persistent_BSS [(LOCAL_NAME)]


This pragma allows selected objects to be placed in the ``.persistent_bss``
section. On some targets the linker and loader provide for special
treatment of this section, allowing a program to be reloaded without
affecting the contents of this data (hence the name persistent).

There are two forms of usage. If an argument is given, it must be the
local name of a library-level object, with no explicit initialization
and whose type is potentially persistent. If no argument is given, then
the pragma is a configuration pragma, and applies to all library-level
objects with no explicit initialization of potentially persistent types.

A potentially persistent type is a scalar type, or an untagged,
non-discriminated record, all of whose components have no explicit
initialization and are themselves of a potentially persistent type,
or an array, all of whose constraints are static, and whose component
type is potentially persistent.

If this pragma is used on a target where this feature is not supported,
then the pragma will be ignored. See also ``pragma Linker_Section``.

Pragma Post
===========
.. index:: Post

.. index:: Checks, postconditions


Syntax:


.. code-block:: ada

  pragma Post (Boolean_Expression);


The ``Post`` pragma is intended to be an exact replacement for
the language-defined
``Post`` aspect, and shares its restrictions and semantics.
It must appear either immediately following the corresponding
subprogram declaration (only other pragmas may intervene), or
if there is no separate subprogram declaration, then it can
appear at the start of the declarations in a subprogram body
(preceded only by other pragmas).

Pragma Postcondition
====================
.. index:: Postcondition

.. index:: Checks, postconditions


Syntax:


::

  pragma Postcondition (
     [Check   =>] Boolean_Expression
   [,[Message =>] String_Expression]);


The ``Postcondition`` pragma allows specification of automatic
postcondition checks for subprograms. These checks are similar to
assertions, but are automatically inserted just prior to the return
statements of the subprogram with which they are associated (including
implicit returns at the end of procedure bodies and associated
exception handlers).

In addition, the boolean expression which is the condition which
must be true may contain references to function'Result in the case
of a function to refer to the returned value.

``Postcondition`` pragmas may appear either immediately following the
(separate) declaration of a subprogram, or at the start of the
declarations of a subprogram body. Only other pragmas may intervene
(that is appear between the subprogram declaration and its
postconditions, or appear before the postcondition in the
declaration sequence in a subprogram body). In the case of a
postcondition appearing after a subprogram declaration, the
formal arguments of the subprogram are visible, and can be
referenced in the postcondition expressions.

The postconditions are collected and automatically tested just
before any return (implicit or explicit) in the subprogram body.
A postcondition is only recognized if postconditions are active
at the time the pragma is encountered. The compiler switch *gnata*
turns on all postconditions by default, and pragma ``Check_Policy``
with an identifier of ``Postcondition`` can also be used to
control whether postconditions are active.

The general approach is that postconditions are placed in the spec
if they represent functional aspects which make sense to the client.
For example we might have:


.. code-block:: ada

     function Direction return Integer;
     pragma Postcondition
      (Direction'Result = +1
         or else
       Direction'Result = -1);


which serves to document that the result must be +1 or -1, and
will test that this is the case at run time if postcondition
checking is active.

Postconditions within the subprogram body can be used to
check that some internal aspect of the implementation,
not visible to the client, is operating as expected.
For instance if a square root routine keeps an internal
counter of the number of times it is called, then we
might have the following postcondition:


.. code-block:: ada

     Sqrt_Calls : Natural := 0;

     function Sqrt (Arg : Float) return Float is
       pragma Postcondition
         (Sqrt_Calls = Sqrt_Calls'Old + 1);
       ...
     end Sqrt


As this example, shows, the use of the ``Old`` attribute
is often useful in postconditions to refer to the state on
entry to the subprogram.

Note that postconditions are only checked on normal returns
from the subprogram. If an abnormal return results from
raising an exception, then the postconditions are not checked.

If a postcondition fails, then the exception
``System.Assertions.Assert_Failure`` is raised. If
a message argument was supplied, then the given string
will be used as the exception message. If no message
argument was supplied, then the default message has
the form "Postcondition failed at file_name:line". The
exception is raised in the context of the subprogram
body, so it is possible to catch postcondition failures
within the subprogram body itself.

Within a package spec, normal visibility rules
in Ada would prevent forward references within a
postcondition pragma to functions defined later in
the same package. This would introduce undesirable
ordering constraints. To avoid this problem, all
postcondition pragmas are analyzed at the end of
the package spec, allowing forward references.

The following example shows that this even allows
mutually recursive postconditions as in:


.. code-block:: ada

  package Parity_Functions is
     function Odd  (X : Natural) return Boolean;
     pragma Postcondition
       (Odd'Result =
          (x = 1
            or else
          (x /= 0 and then Even (X - 1))));

     function Even (X : Natural) return Boolean;
     pragma Postcondition
       (Even'Result =
          (x = 0
            or else
          (x /= 1 and then Odd (X - 1))));

  end Parity_Functions;


There are no restrictions on the complexity or form of
conditions used within ``Postcondition`` pragmas.
The following example shows that it is even possible
to verify performance behavior.


.. code-block:: ada

  package Sort is

     Performance : constant Float;
     --  Performance constant set by implementation
     --  to match target architecture behavior.

     procedure Treesort (Arg : String);
     --  Sorts characters of argument using N*logN sort
     pragma Postcondition
       (Float (Clock - Clock'Old) <=
          Float (Arg'Length) *
          log (Float (Arg'Length)) *
          Performance);
  end Sort;


Note: postcondition pragmas associated with subprograms that are
marked as Inline_Always, or those marked as Inline with front-end
inlining (-gnatN option set) are accepted and legality-checked
by the compiler, but are ignored at run-time even if postcondition
checking is enabled.

Note that pragma ``Postcondition`` differs from the language-defined
``Post`` aspect (and corresponding ``Post`` pragma) in allowing
multiple occurrences, allowing occurences in the body even if there
is a separate spec, and allowing a second string parameter, and the
use of the pragma identifier ``Check``. Historically, pragma
``Postcondition`` was implemented prior to the development of
Ada 2012, and has been retained in its original form for
compatibility purposes.

Pragma Post_Class
=================
.. index:: Post

.. index:: Checks, postconditions


Syntax:


.. code-block:: ada

  pragma Post_Class (Boolean_Expression);


The ``Post_Class`` pragma is intended to be an exact replacement for
the language-defined
``Post'Class`` aspect, and shares its restrictions and semantics.
It must appear either immediately following the corresponding
subprogram declaration (only other pragmas may intervene), or
if there is no separate subprogram declaration, then it can
appear at the start of the declarations in a subprogram body
(preceded only by other pragmas).

Note: This pragma is called ``Post_Class`` rather than
``Post'Class`` because the latter would not be strictly
conforming to the allowed syntax for pragmas. The motivation
for provinding pragmas equivalent to the aspects is to allow a program
to be written using the pragmas, and then compiled if necessary
using an Ada compiler that does not recognize the pragmas or
aspects, but is prepared to ignore the pragmas. The assertion
policy that controls this pragma is ``Post'Class``, not
``Post_Class``.

Pragma Pre
==========
.. index:: Pre

.. index:: Checks, preconditions


Syntax:


.. code-block:: ada

  pragma Pre (Boolean_Expression);


The ``Pre`` pragma is intended to be an exact replacement for
the language-defined
``Pre`` aspect, and shares its restrictions and semantics.
It must appear either immediately following the corresponding
subprogram declaration (only other pragmas may intervene), or
if there is no separate subprogram declaration, then it can
appear at the start of the declarations in a subprogram body
(preceded only by other pragmas).

Pragma Precondition
===================
.. index:: Preconditions

.. index:: Checks, preconditions


Syntax:


::

  pragma Precondition (
     [Check   =>] Boolean_Expression
   [,[Message =>] String_Expression]);


The ``Precondition`` pragma is similar to ``Postcondition``
except that the corresponding checks take place immediately upon
entry to the subprogram, and if a precondition fails, the exception
is raised in the context of the caller, and the attribute 'Result
cannot be used within the precondition expression.

Otherwise, the placement and visibility rules are identical to those
described for postconditions. The following is an example of use
within a package spec:


.. code-block:: ada

  package Math_Functions is
     ...
     function Sqrt (Arg : Float) return Float;
     pragma Precondition (Arg >= 0.0)
     ...
  end Math_Functions;


``Precondition`` pragmas may appear either immediately following the
(separate) declaration of a subprogram, or at the start of the
declarations of a subprogram body. Only other pragmas may intervene
(that is appear between the subprogram declaration and its
postconditions, or appear before the postcondition in the
declaration sequence in a subprogram body).

Note: precondition pragmas associated with subprograms that are
marked as Inline_Always, or those marked as Inline with front-end
inlining (-gnatN option set) are accepted and legality-checked
by the compiler, but are ignored at run-time even if precondition
checking is enabled.

Note that pragma ``Precondition`` differs from the language-defined
``Pre`` aspect (and corresponding ``Pre`` pragma) in allowing
multiple occurrences, allowing occurences in the body even if there
is a separate spec, and allowing a second string parameter, and the
use of the pragma identifier ``Check``. Historically, pragma
``Precondition`` was implemented prior to the development of
Ada 2012, and has been retained in its original form for
compatibility purposes.

.. _Pragma-Predicate:

Pragma Predicate
================

Syntax:


::

  pragma Predicate
    ([Entity =>] type_LOCAL_NAME,
     [Check  =>] EXPRESSION);


This pragma (available in all versions of Ada in GNAT) encompasses both
the ``Static_Predicate`` and ``Dynamic_Predicate`` aspects in
Ada 2012. A predicate is regarded as static if it has an allowed form
for ``Static_Predicate`` and is otherwise treated as a
``Dynamic_Predicate``. Otherwise, predicates specified by this
pragma behave exactly as described in the Ada 2012 reference manual.
For example, if we have


.. code-block:: ada

  type R is range 1 .. 10;
  subtype S is R;
  pragma Predicate (Entity => S, Check => S not in 4 .. 6);
  subtype Q is R
  pragma Predicate (Entity => Q, Check => F(Q) or G(Q));


the effect is identical to the following Ada 2012 code:


.. code-block:: ada

  type R is range 1 .. 10;
  subtype S is R with
    Static_Predicate => S not in 4 .. 6;
  subtype Q is R with
    Dynamic_Predicate => F(Q) or G(Q);


Note that there are no pragmas ``Dynamic_Predicate``
or ``Static_Predicate``. That is
because these pragmas would affect legality and semantics of
the program and thus do not have a neutral effect if ignored.
The motivation behind providing pragmas equivalent to
corresponding aspects is to allow a program to be written
using the pragmas, and then compiled with a compiler that
will ignore the pragmas. That doesn't work in the case of
static and dynamic predicates, since if the corresponding
pragmas are ignored, then the behavior of the program is
fundamentally changed (for example a membership test
``A in B`` would not take into account a predicate
defined for subtype B). When following this approach, the
use of predicates should be avoided.

Pragma Predicate_Failure
========================

Syntax:


::

  pragma Predicate_Failure
    ([Entity  =>] type_LOCAL_NAME,
     [Message =>] String_Expression);


The ``Predicate_Failure`` pragma is intended to be an exact replacement for
the language-defined
``Predicate_Failure`` aspect, and shares its restrictions and semantics.

Pragma Preelaborable_Initialization
===================================

Syntax:


.. code-block:: ada

  pragma Preelaborable_Initialization (DIRECT_NAME);


This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma.
See Ada 2012 Reference Manual for details.

Pragma Prefix_Exception_Messages
================================
.. index:: Prefix_Exception_Messages

.. index:: exception

.. index:: Exception_Message


Syntax:


.. code-block:: ada

  pragma Prefix_Exception_Messages;


This is an implementation-defined configuration pragma that affects the
behavior of raise statements with a message given as a static string
constant (typically a string literal). In such cases, the string will
be automatically prefixed by the name of the enclosing entity (giving
the package and subprogram containing the raise statement). This helps
to identify where messages are coming from, and this mode is automatic
for the run-time library.

The pragma has no effect if the message is computed with an expression other
than a static string constant, since the assumption in this case is that
the program computes exactly the string it wants. If you still want the
prefixing in this case, you can always call
``GNAT.Source_Info.Enclosing_Entity`` and prepend the string manually.

Pragma Pre_Class
================
.. index:: Pre_Class

.. index:: Checks, preconditions


Syntax:


.. code-block:: ada

  pragma Pre_Class (Boolean_Expression);


The ``Pre_Class`` pragma is intended to be an exact replacement for
the language-defined
``Pre'Class`` aspect, and shares its restrictions and semantics.
It must appear either immediately following the corresponding
subprogram declaration (only other pragmas may intervene), or
if there is no separate subprogram declaration, then it can
appear at the start of the declarations in a subprogram body
(preceded only by other pragmas).

Note: This pragma is called ``Pre_Class`` rather than
``Pre'Class`` because the latter would not be strictly
conforming to the allowed syntax for pragmas. The motivation
for providing pragmas equivalent to the aspects is to allow a program
to be written using the pragmas, and then compiled if necessary
using an Ada compiler that does not recognize the pragmas or
aspects, but is prepared to ignore the pragmas. The assertion
policy that controls this pragma is ``Pre'Class``, not
``Pre_Class``.

Pragma Priority_Specific_Dispatching
====================================

Syntax:


::

  pragma Priority_Specific_Dispatching (
     POLICY_IDENTIFIER,
     first_priority_EXPRESSION,
     last_priority_EXPRESSION)

  POLICY_IDENTIFIER ::=
     EDF_Across_Priorities            |
     FIFO_Within_Priorities           |
     Non_Preemptive_Within_Priorities |
     Round_Robin_Within_Priorities


This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma.
See Ada 2012 Reference Manual for details.

Pragma Profile
==============

Syntax:


.. code-block:: ada

  pragma Profile (Ravenscar | Restricted | Rational | Jorvik |
                  GNAT_Extended_Ravenscar | GNAT_Ravenscar_EDF );


This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma. This is a
configuration pragma that establishes a set of configuration pragmas
that depend on the argument. ``Ravenscar`` is standard in Ada 2005.
``Jorvik`` is standard in Ada 202x.
The other possibilities (``Restricted``, ``Rational``,
``GNAT_Extended_Ravenscar``, ``GNAT_Ravenscar_EDF``)
are implementation-defined.  ``GNAT_Extended_Ravenscar`` is an alias for ``Jorvik``.

The set of configuration pragmas is defined in the following sections.


* Pragma Profile (Ravenscar)

  The ``Ravenscar`` profile is standard in Ada 2005,
  but is available in all earlier
  versions of Ada as an implementation-defined pragma. This profile
  establishes the following set of configuration pragmas:

  * ``Task_Dispatching_Policy (FIFO_Within_Priorities)``

    [RM D.2.2] Tasks are dispatched following a preemptive
    priority-ordered scheduling policy.


  * ``Locking_Policy (Ceiling_Locking)``

    [RM D.3] While tasks and interrupts execute a protected action, they inherit
    the ceiling priority of the corresponding protected object.


  * ``Detect_Blocking``

    This pragma forces the detection of potentially blocking operations within a
    protected operation, and to raise Program_Error if that happens.

  plus the following set of restrictions:

  * ``Max_Entry_Queue_Length => 1``

    No task can be queued on a protected entry.

  * ``Max_Protected_Entries => 1``

  * ``Max_Task_Entries => 0``

    No rendezvous statements are allowed.

  * ``No_Abort_Statements``

  * ``No_Dynamic_Attachment``

  * ``No_Dynamic_Priorities``

  * ``No_Implicit_Heap_Allocations``

  * ``No_Local_Protected_Objects``

  * ``No_Local_Timing_Events``

  * ``No_Protected_Type_Allocators``

  * ``No_Relative_Delay``

  * ``No_Requeue_Statements``

  * ``No_Select_Statements``

  * ``No_Specific_Termination_Handlers``

  * ``No_Task_Allocators``

  * ``No_Task_Hierarchy``

  * ``No_Task_Termination``

  * ``Simple_Barriers``

  The Ravenscar profile also includes the following restrictions that specify
  that there are no semantic dependencies on the corresponding predefined
  packages:

  * ``No_Dependence => Ada.Asynchronous_Task_Control``

  * ``No_Dependence => Ada.Calendar``

  * ``No_Dependence => Ada.Execution_Time.Group_Budget``

  * ``No_Dependence => Ada.Execution_Time.Timers``

  * ``No_Dependence => Ada.Task_Attributes``

  * ``No_Dependence => System.Multiprocessors.Dispatching_Domains``

  This set of configuration pragmas and restrictions correspond to the
  definition of the 'Ravenscar Profile' for limited tasking, devised and
  published by the :title:`International Real-Time Ada Workshop, 1997`.
  A description is also available at
  `http://www-users.cs.york.ac.uk/~burns/ravenscar.ps <http://www-users.cs.york.ac.uk/~burns/ravenscar.ps>`_.

  The original definition of the profile was revised at subsequent IRTAW
  meetings. It has been included in the ISO
  :title:`Guide for the Use of the Ada Programming Language in High Integrity Systems`,
  and was made part of the Ada 2005 standard.
  The formal definition given by
  the Ada Rapporteur Group (ARG) can be found in two Ada Issues (AI-249 and
  AI-305) available at
  `http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00249.txt <http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00249.txt>`_ and
  `http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00305.txt <http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00305.txt>`_.

  The above set is a superset of the restrictions provided by pragma
  ``Profile (Restricted)``, it includes six additional restrictions
  (``Simple_Barriers``, ``No_Select_Statements``,
  ``No_Calendar``, ``No_Implicit_Heap_Allocations``,
  ``No_Relative_Delay`` and ``No_Task_Termination``).  This means
  that pragma ``Profile (Ravenscar)``, like the pragma
  ``Profile (Restricted)``,
  automatically causes the use of a simplified,
  more efficient version of the tasking run-time library.

* Pragma Profile (Jorvik)

  ``Jorvik`` is the new profile added to the Ada 202x draft standard,
  previously implemented under the name ``GNAT_Extended_Ravenscar``.

  The ``No_Implicit_Heap_Allocations`` restriction has been replaced
  by ``No_Implicit_Task_Allocations`` and
  ``No_Implicit_Protected_Object_Allocations``.

  The ``Simple_Barriers`` restriction has been replaced by
  ``Pure_Barriers``.

  The ``Max_Protected_Entries``, ``Max_Entry_Queue_Length``, and
  ``No_Relative_Delay`` restrictions have been removed.

  Details on the rationale for ``Jorvik`` and implications for use may be
  found in :title:`A New Ravenscar-Based Profile` by P. Rogers, J. Ruiz,
  T. Gingold and P. Bernardi, in :title:`Reliable Software Technologies --
  Ada Europe 2017`, Springer-Verlag Lecture Notes in Computer Science,
  Number 10300.


* Pragma Profile (GNAT_Ravenscar_EDF)

  This profile corresponds to the Ravenscar profile but using
  EDF_Across_Priority as the Task_Scheduling_Policy.

* Pragma Profile (Restricted)

  This profile corresponds to the GNAT restricted run time. It
  establishes the following set of restrictions:

  * ``No_Abort_Statements``
  * ``No_Entry_Queue``
  * ``No_Task_Hierarchy``
  * ``No_Task_Allocators``
  * ``No_Dynamic_Priorities``
  * ``No_Terminate_Alternatives``
  * ``No_Dynamic_Attachment``
  * ``No_Protected_Type_Allocators``
  * ``No_Local_Protected_Objects``
  * ``No_Requeue_Statements``
  * ``No_Task_Attributes_Package``
  * ``Max_Asynchronous_Select_Nesting =  0``
  * ``Max_Task_Entries =  0``
  * ``Max_Protected_Entries = 1``
  * ``Max_Select_Alternatives = 0``

  This set of restrictions causes the automatic selection of a simplified
  version of the run time that provides improved performance for the
  limited set of tasking functionality permitted by this set of restrictions.

* Pragma Profile (Rational)

  The Rational profile is intended to facilitate porting legacy code that
  compiles with the Rational APEX compiler, even when the code includes non-
  conforming Ada constructs.  The profile enables the following three pragmas:

  * ``pragma Implicit_Packing``
  * ``pragma Overriding_Renamings``
  * ``pragma Use_VADS_Size``


Pragma Profile_Warnings
=======================

Syntax:


.. code-block:: ada

  pragma Profile_Warnings (Ravenscar | Restricted | Rational);


This is an implementation-defined pragma that is similar in
effect to ``pragma Profile`` except that instead of
generating ``Restrictions`` pragmas, it generates
``Restriction_Warnings`` pragmas. The result is that
violations of the profile generate warning messages instead
of error messages.

Pragma Propagate_Exceptions
===========================
.. index:: Interfacing to C++


Syntax:


.. code-block:: ada

  pragma Propagate_Exceptions;


This pragma is now obsolete and, other than generating a warning if warnings
on obsolescent features are enabled, is ignored.
It is retained for compatibility
purposes. It used to be used in connection with optimization of
a now-obsolete mechanism for implementation of exceptions.

Pragma Provide_Shift_Operators
==============================
.. index:: Shift operators


Syntax:


.. code-block:: ada

  pragma Provide_Shift_Operators (integer_first_subtype_LOCAL_NAME);


This pragma can be applied to a first subtype local name that specifies
either an unsigned or signed type. It has the effect of providing the
five shift operators (Shift_Left, Shift_Right, Shift_Right_Arithmetic,
Rotate_Left and Rotate_Right) for the given type. It is similar to
including the function declarations for these five operators, together
with the pragma Import (Intrinsic, ...) statements.

Pragma Psect_Object
===================

Syntax:


::

  pragma Psect_Object (
       [Internal =>] LOCAL_NAME,
    [, [External =>] EXTERNAL_SYMBOL]
    [, [Size     =>] EXTERNAL_SYMBOL]);

  EXTERNAL_SYMBOL ::=
    IDENTIFIER
  | static_string_EXPRESSION


This pragma is identical in effect to pragma ``Common_Object``.

.. _Pragma-Pure_Function:

Pragma Pure_Function
====================

Syntax:


::

  pragma Pure_Function ([Entity =>] function_LOCAL_NAME);


This pragma appears in the same declarative part as a function
declaration (or a set of function declarations if more than one
overloaded declaration exists, in which case the pragma applies
to all entities).  It specifies that the function ``Entity`` is
to be considered pure for the purposes of code generation.  This means
that the compiler can assume that there are no side effects, and
in particular that two identical calls produce the same result in
the same context. It also means that the function can be used in
an address clause.

Note that, quite deliberately, there are no static checks to try
to ensure that this promise is met, so ``Pure_Function`` can be used
with functions that are conceptually pure, even if they do modify
global variables.  For example, a square root function that is
instrumented to count the number of times it is called is still
conceptually pure, and can still be optimized, even though it
modifies a global variable (the count).  Memo functions are another
example (where a table of previous calls is kept and consulted to
avoid re-computation).

Note also that the normal rules excluding optimization of subprograms
in pure units (when parameter types are descended from System.Address,
or when the full view of a parameter type is limited), do not apply
for the Pure_Function case. If you explicitly specify Pure_Function,
the compiler may optimize away calls with identical arguments, and
if that results in unexpected behavior, the proper action is not to
use the pragma for subprograms that are not (conceptually) pure.

Note: Most functions in a ``Pure`` package are automatically pure, and
there is no need to use pragma ``Pure_Function`` for such functions.  One
exception is any function that has at least one formal of type
``System.Address`` or a type derived from it.  Such functions are not
considered pure by default, since the compiler assumes that the
``Address`` parameter may be functioning as a pointer and that the
referenced data may change even if the address value does not.
Similarly, imported functions are not considered to be pure by default,
since there is no way of checking that they are in fact pure.  The use
of pragma ``Pure_Function`` for such a function will override these default
assumption, and cause the compiler to treat a designated subprogram as pure
in these cases.

Note: If pragma ``Pure_Function`` is applied to a renamed function, it
applies to the underlying renamed function.  This can be used to
disambiguate cases of overloading where some but not all functions
in a set of overloaded functions are to be designated as pure.

If pragma ``Pure_Function`` is applied to a library-level function, the
function is also considered pure from an optimization point of view, but the
unit is not a Pure unit in the categorization sense. So for example, a function
thus marked is free to ``with`` non-pure units.

Pragma Rational
===============

Syntax:


.. code-block:: ada

  pragma Rational;


This pragma is considered obsolescent, but is retained for
compatibility purposes. It is equivalent to:


.. code-block:: ada

  pragma Profile (Rational);


Pragma Ravenscar
================

Syntax:


.. code-block:: ada

  pragma Ravenscar;


This pragma is considered obsolescent, but is retained for
compatibility purposes. It is equivalent to:


.. code-block:: ada

  pragma Profile (Ravenscar);


which is the preferred method of setting the ``Ravenscar`` profile.

.. _Pragma-Refined_Depends:

Pragma Refined_Depends
======================

Syntax:

.. code-block:: ada

  pragma Refined_Depends (DEPENDENCY_RELATION);

  DEPENDENCY_RELATION ::=
       null
    | (DEPENDENCY_CLAUSE {, DEPENDENCY_CLAUSE})

  DEPENDENCY_CLAUSE ::=
      OUTPUT_LIST =>[+] INPUT_LIST
    | NULL_DEPENDENCY_CLAUSE

  NULL_DEPENDENCY_CLAUSE ::= null => INPUT_LIST

  OUTPUT_LIST ::= OUTPUT | (OUTPUT {, OUTPUT})

  INPUT_LIST ::= null | INPUT | (INPUT {, INPUT})

  OUTPUT ::= NAME | FUNCTION_RESULT
  INPUT  ::= NAME

  where FUNCTION_RESULT is a function Result attribute_reference

For the semantics of this pragma, see the entry for aspect ``Refined_Depends`` in
the SPARK 2014 Reference Manual, section 6.1.5.

.. _Pragma-Refined_Global:

Pragma Refined_Global
=====================

Syntax:

.. code-block:: ada

  pragma Refined_Global (GLOBAL_SPECIFICATION);

  GLOBAL_SPECIFICATION ::=
       null
    | (GLOBAL_LIST)
    | (MODED_GLOBAL_LIST {, MODED_GLOBAL_LIST})

  MODED_GLOBAL_LIST ::= MODE_SELECTOR => GLOBAL_LIST

  MODE_SELECTOR ::= In_Out | Input | Output | Proof_In
  GLOBAL_LIST   ::= GLOBAL_ITEM | (GLOBAL_ITEM {, GLOBAL_ITEM})
  GLOBAL_ITEM   ::= NAME

For the semantics of this pragma, see the entry for aspect ``Refined_Global`` in
the SPARK 2014 Reference Manual, section 6.1.4.

.. _Pragma-Refined_Post:

Pragma Refined_Post
===================

Syntax:

.. code-block:: ada

  pragma Refined_Post (boolean_EXPRESSION);

For the semantics of this pragma, see the entry for aspect ``Refined_Post`` in
the SPARK 2014 Reference Manual, section 7.2.7.

.. _Pragma-Refined_State:

Pragma Refined_State
====================

Syntax:

.. code-block:: ada

  pragma Refined_State (REFINEMENT_LIST);

  REFINEMENT_LIST ::=
    (REFINEMENT_CLAUSE {, REFINEMENT_CLAUSE})

  REFINEMENT_CLAUSE ::= state_NAME => CONSTITUENT_LIST

  CONSTITUENT_LIST ::=
       null
    |  CONSTITUENT
    | (CONSTITUENT {, CONSTITUENT})

  CONSTITUENT ::= object_NAME | state_NAME

For the semantics of this pragma, see the entry for aspect ``Refined_State`` in
the SPARK 2014 Reference Manual, section 7.2.2.

Pragma Relative_Deadline
========================

Syntax:


.. code-block:: ada

  pragma Relative_Deadline (time_span_EXPRESSION);


This pragma is standard in Ada 2005, but is available in all earlier
versions of Ada as an implementation-defined pragma.
See Ada 2012 Reference Manual for details.

.. _Pragma-Remote_Access_Type:

Pragma Remote_Access_Type
=========================

Syntax:


::

  pragma Remote_Access_Type ([Entity =>] formal_access_type_LOCAL_NAME);


This pragma appears in the formal part of a generic declaration.
It specifies an exception to the RM rule from E.2.2(17/2), which forbids
the use of a remote access to class-wide type as actual for a formal
access type.

When this pragma applies to a formal access type ``Entity``, that
type is treated as a remote access to class-wide type in the generic.
It must be a formal general access type, and its designated type must
be the class-wide type of a formal tagged limited private type from the
same generic declaration.

In the generic unit, the formal type is subject to all restrictions
pertaining to remote access to class-wide types. At instantiation, the
actual type must be a remote access to class-wide type.

Pragma Rename_Pragma
============================
.. index:: Pragmas, synonyms

Syntax:


::

  pragma Rename_Pragma (
           [New_Name =>] IDENTIFIER,
           [Renamed  =>] pragma_IDENTIFIER);

This pragma provides a mechanism for supplying new names for existing
pragmas. The ``New_Name`` identifier can subsequently be used as a synonym for
the Renamed pragma. For example, suppose you have code that was originally
developed on a compiler that supports Inline_Only as an implementation defined
pragma. And suppose the semantics of pragma Inline_Only are identical to (or at
least very similar to) the GNAT implementation defined pragma
Inline_Always. You could globally replace Inline_Only with Inline_Always.

However, to avoid that source modification, you could instead add a
configuration pragma:

.. code-block:: ada

  pragma Rename_Pragma (
           New_Name => Inline_Only,
           Renamed  => Inline_Always);


Then GNAT will treat "pragma Inline_Only ..." as if you had written
"pragma Inline_Always ...".

Pragma Inline_Only will not necessarily mean the same thing as the other Ada
compiler; it's up to you to make sure the semantics are close enough.

Pragma Restricted_Run_Time
==========================

Syntax:


.. code-block:: ada

  pragma Restricted_Run_Time;


This pragma is considered obsolescent, but is retained for
compatibility purposes. It is equivalent to:


.. code-block:: ada

  pragma Profile (Restricted);


which is the preferred method of setting the restricted run time
profile.

Pragma Restriction_Warnings
===========================

Syntax:


::

  pragma Restriction_Warnings
    (restriction_IDENTIFIER {, restriction_IDENTIFIER});


This pragma allows a series of restriction identifiers to be
specified (the list of allowed identifiers is the same as for
pragma ``Restrictions``). For each of these identifiers
the compiler checks for violations of the restriction, but
generates a warning message rather than an error message
if the restriction is violated.

One use of this is in situations where you want to know
about violations of a restriction, but you want to ignore some of
these violations. Consider this example, where you want to set
Ada_95 mode and enable style checks, but you want to know about
any other use of implementation pragmas:


.. code-block:: ada

  pragma Restriction_Warnings (No_Implementation_Pragmas);
  pragma Warnings (Off, "violation of No_Implementation_Pragmas");
  pragma Ada_95;
  pragma Style_Checks ("2bfhkM160");
  pragma Warnings (On, "violation of No_Implementation_Pragmas");


By including the above lines in a configuration pragmas file,
the Ada_95 and Style_Checks pragmas are accepted without
generating a warning, but any other use of implementation
defined pragmas will cause a warning to be generated.

Pragma Reviewable
=================

Syntax:


.. code-block:: ada

  pragma Reviewable;


This pragma is an RM-defined standard pragma, but has no effect on the
program being compiled, or on the code generated for the program.

To obtain the required output specified in RM H.3.1, the compiler must be
run with various special switches as follows:

* *Where compiler-generated run-time checks remain*

  The switch *-gnatGL*
  may be used to list the expanded code in pseudo-Ada form.
  Runtime checks show up in the listing either as explicit
  checks or operators marked with {} to indicate a check is present.


* *An identification of known exceptions at compile time*

  If the program is compiled with *-gnatwa*,
  the compiler warning messages will indicate all cases where the compiler
  detects that an exception is certain to occur at run time.


* *Possible reads of uninitialized variables*

  The compiler warns of many such cases, but its output is incomplete.

.. only:: PRO or GPL

  The CodePeer analysis tool
  may be used to obtain a comprehensive list of all
  possible points at which uninitialized data may be read.

.. only:: FSF

  A supplemental static analysis tool
  may be used to obtain a comprehensive list of all
  possible points at which uninitialized data may be read.


* *Where run-time support routines are implicitly invoked*

  In the output from *-gnatGL*,
  run-time calls are explicitly listed as calls to the relevant
  run-time routine.


* *Object code listing*

  This may be obtained either by using the *-S* switch,
  or the objdump utility.


* *Constructs known to be erroneous at compile time*

  These are identified by warnings issued by the compiler (use *-gnatwa*).


* *Stack usage information*

  Static stack usage data (maximum per-subprogram) can be obtained via the
  *-fstack-usage* switch to the compiler.
  Dynamic stack usage data (per task) can be obtained via the *-u* switch
  to gnatbind

.. only:: PRO or GPL

  The gnatstack utility
  can be used to provide additional information on stack usage.


* *Object code listing of entire partition*

  This can be obtained by compiling the partition with *-S*,
  or by applying objdump
  to all the object files that are part of the partition.


* *A description of the run-time model*

  The full sources of the run-time are available, and the documentation of
  these routines describes how these run-time routines interface to the
  underlying operating system facilities.


* *Control and data-flow information*

.. only:: PRO or GPL

  The CodePeer tool
  may be used to obtain complete control and data-flow information, as well as
  comprehensive messages identifying possible problems based on this
  information.

.. only:: FSF

  A supplemental static analysis tool
  may be used to obtain complete control and data-flow information, as well as
  comprehensive messages identifying possible problems based on this
  information.

.. _Pragma-Secondary_Stack_Size:

Pragma Secondary_Stack_Size
===========================

Syntax:

.. code-block:: ada

  pragma Secondary_Stack_Size (integer_EXPRESSION);

This pragma appears within the task definition of a single task declaration
or a task type declaration (like pragma ``Storage_Size``) and applies to all
task objects of that type. The argument specifies the size of the secondary
stack to be used by these task objects, and must be of an integer type. The
secondary stack is used to handle functions that return a variable-sized
result, for example a function returning an unconstrained String.

Note this pragma only applies to targets using fixed secondary stacks, like
VxWorks 653 and bare board targets, where a fixed block for the
secondary stack is allocated from the primary stack of the task. By default,
these targets assign a percentage of the primary stack for the secondary stack,
as defined by ``System.Parameter.Sec_Stack_Percentage``. With this pragma,
an ``integer_EXPRESSION`` of bytes is assigned from the primary stack instead.

For most targets, the pragma does not apply as the secondary stack grows on
demand: allocated as a chain of blocks in the heap. The default size of these
blocks can be modified via the :switch:`-D` binder option as described in
:title:`GNAT User's Guide`.

Note that no check is made to see if the secondary stack can fit inside the
primary stack.

Note the pragma cannot appear when the restriction ``No_Secondary_Stack``
is in effect.

Pragma Share_Generic
====================

Syntax:


::

  pragma Share_Generic (GNAME {, GNAME});

  GNAME ::= generic_unit_NAME | generic_instance_NAME


This pragma is provided for compatibility with Dec Ada 83. It has
no effect in GNAT (which does not implement shared generics), other
than to check that the given names are all names of generic units or
generic instances.

.. _Pragma-Shared:

Pragma Shared
=============

This pragma is provided for compatibility with Ada 83. The syntax and
semantics are identical to pragma Atomic.

Pragma Short_Circuit_And_Or
===========================

Syntax:


.. code-block:: ada

  pragma Short_Circuit_And_Or;


This configuration pragma causes any occurrence of the AND operator applied to
operands of type Standard.Boolean to be short-circuited (i.e. the AND operator
is treated as if it were AND THEN). Or is similarly treated as OR ELSE. This
may be useful in the context of certification protocols requiring the use of
short-circuited logical operators. If this configuration pragma occurs locally
within the file being compiled, it applies only to the file being compiled.
There is no requirement that all units in a partition use this option.

Pragma Short_Descriptors
========================

Syntax:


.. code-block:: ada

  pragma Short_Descriptors;


This pragma is provided for compatibility with other Ada implementations. It
is recognized but ignored by all current versions of GNAT.

.. _Pragma-Simple_Storage_Pool_Type:

Pragma Simple_Storage_Pool_Type
===============================
.. index:: Storage pool, simple

.. index:: Simple storage pool

Syntax:


.. code-block:: ada

  pragma Simple_Storage_Pool_Type (type_LOCAL_NAME);


A type can be established as a 'simple storage pool type' by applying
the representation pragma ``Simple_Storage_Pool_Type`` to the type.
A type named in the pragma must be a library-level immutably limited record
type or limited tagged type declared immediately within a package declaration.
The type can also be a limited private type whose full type is allowed as
a simple storage pool type.

For a simple storage pool type ``SSP``, nonabstract primitive subprograms
``Allocate``, ``Deallocate``, and ``Storage_Size`` can be declared that
are subtype conformant with the following subprogram declarations:


.. code-block:: ada

  procedure Allocate
    (Pool                     : in out SSP;
     Storage_Address          : out System.Address;
     Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
     Alignment                : System.Storage_Elements.Storage_Count);

  procedure Deallocate
    (Pool : in out SSP;
     Storage_Address          : System.Address;
     Size_In_Storage_Elements : System.Storage_Elements.Storage_Count;
     Alignment                : System.Storage_Elements.Storage_Count);

  function Storage_Size (Pool : SSP)
    return System.Storage_Elements.Storage_Count;


Procedure ``Allocate`` must be declared, whereas ``Deallocate`` and
``Storage_Size`` are optional. If ``Deallocate`` is not declared, then
applying an unchecked deallocation has no effect other than to set its actual
parameter to null. If ``Storage_Size`` is not declared, then the
``Storage_Size`` attribute applied to an access type associated with
a pool object of type SSP returns zero. Additional operations can be declared
for a simple storage pool type (such as for supporting a mark/release
storage-management discipline).

An object of a simple storage pool type can be associated with an access
type by specifying the attribute
:ref:`Simple_Storage_Pool <Attribute_Simple_Storage_Pool>`. For example:


.. code-block:: ada

  My_Pool : My_Simple_Storage_Pool_Type;

  type Acc is access My_Data_Type;

  for Acc'Simple_Storage_Pool use My_Pool;



See attribute :ref:`Simple_Storage_Pool <Attribute_Simple_Storage_Pool>`
for further details.

..  _Pragma_Source_File_Name:

Pragma Source_File_Name
=======================

Syntax:


::

  pragma Source_File_Name (
    [Unit_Name     =>] unit_NAME,
    Spec_File_Name =>  STRING_LITERAL,
    [Index => INTEGER_LITERAL]);

  pragma Source_File_Name (
    [Unit_Name     =>] unit_NAME,
    Body_File_Name =>  STRING_LITERAL,
    [Index => INTEGER_LITERAL]);


Use this to override the normal naming convention.  It is a configuration
pragma, and so has the usual applicability of configuration pragmas
(i.e., it applies to either an entire partition, or to all units in a
compilation, or to a single unit, depending on how it is used).
``unit_name`` is mapped to ``file_name_literal``.  The identifier for
the second argument is required, and indicates whether this is the file
name for the spec or for the body.

The optional Index argument should be used when a file contains multiple
units, and when you do not want to use ``gnatchop`` to separate then
into multiple files (which is the recommended procedure to limit the
number of recompilations that are needed when some sources change).
For instance, if the source file :file:`source.ada` contains


.. code-block:: ada

  package B is
  ...
  end B;

  with B;
  procedure A is
  begin
     ..
  end A;


you could use the following configuration pragmas:


.. code-block:: ada

  pragma Source_File_Name
    (B, Spec_File_Name => "source.ada", Index => 1);
  pragma Source_File_Name
    (A, Body_File_Name => "source.ada", Index => 2);


Note that the ``gnatname`` utility can also be used to generate those
configuration pragmas.

Another form of the ``Source_File_Name`` pragma allows
the specification of patterns defining alternative file naming schemes
to apply to all files.


::

  pragma Source_File_Name
    (  [Spec_File_Name  =>] STRING_LITERAL
     [,[Casing          =>] CASING_SPEC]
     [,[Dot_Replacement =>] STRING_LITERAL]);

  pragma Source_File_Name
    (  [Body_File_Name  =>] STRING_LITERAL
     [,[Casing          =>] CASING_SPEC]
     [,[Dot_Replacement =>] STRING_LITERAL]);

  pragma Source_File_Name
    (  [Subunit_File_Name =>] STRING_LITERAL
     [,[Casing            =>] CASING_SPEC]
     [,[Dot_Replacement   =>] STRING_LITERAL]);

  CASING_SPEC ::= Lowercase | Uppercase | Mixedcase


The first argument is a pattern that contains a single asterisk indicating
the point at which the unit name is to be inserted in the pattern string
to form the file name.  The second argument is optional.  If present it
specifies the casing of the unit name in the resulting file name string.
The default is lower case.  Finally the third argument allows for systematic
replacement of any dots in the unit name by the specified string literal.

Note that Source_File_Name pragmas should not be used if you are using
project files. The reason for this rule is that the project manager is not
aware of these pragmas, and so other tools that use the projet file would not
be aware of the intended naming conventions. If you are using project files,
file naming is controlled by Source_File_Name_Project pragmas, which are
usually supplied automatically by the project manager. A pragma
Source_File_Name cannot appear after a :ref:`Pragma_Source_File_Name_Project`.

For more details on the use of the ``Source_File_Name`` pragma, see the
sections on `Using Other File Names` and `Alternative File Naming Schemes`
in the :title:`GNAT User's Guide`.

..  _Pragma_Source_File_Name_Project:

Pragma Source_File_Name_Project
===============================

This pragma has the same syntax and semantics as pragma Source_File_Name.
It is only allowed as a stand-alone configuration pragma.
It cannot appear after a :ref:`Pragma_Source_File_Name`, and
most importantly, once pragma Source_File_Name_Project appears,
no further Source_File_Name pragmas are allowed.

The intention is that Source_File_Name_Project pragmas are always
generated by the Project Manager in a manner consistent with the naming
specified in a project file, and when naming is controlled in this manner,
it is not permissible to attempt to modify this naming scheme using
Source_File_Name or Source_File_Name_Project pragmas (which would not be
known to the project manager).

Pragma Source_Reference
=======================

Syntax:


.. code-block:: ada

  pragma Source_Reference (INTEGER_LITERAL, STRING_LITERAL);


This pragma must appear as the first line of a source file.
``integer_literal`` is the logical line number of the line following
the pragma line (for use in error messages and debugging
information).  ``string_literal`` is a static string constant that
specifies the file name to be used in error messages and debugging
information.  This is most notably used for the output of ``gnatchop``
with the *-r* switch, to make sure that the original unchopped
source file is the one referred to.

The second argument must be a string literal, it cannot be a static
string expression other than a string literal.  This is because its value
is needed for error messages issued by all phases of the compiler.

.. _Pragma-SPARK_Mode:

Pragma SPARK_Mode
=================

Syntax:


::

  pragma SPARK_Mode [(On | Off)] ;


In general a program can have some parts that are in SPARK 2014 (and
follow all the rules in the SPARK Reference Manual), and some parts
that are full Ada 2012.

The SPARK_Mode pragma is used to identify which parts are in SPARK
2014 (by default programs are in full Ada). The SPARK_Mode pragma can
be used in the following places:


*
  As a configuration pragma, in which case it sets the default mode for
  all units compiled with this pragma.

*
  Immediately following a library-level subprogram spec

*
  Immediately within a library-level package body

*
  Immediately following the ``private`` keyword of a library-level
  package spec

*
  Immediately following the ``begin`` keyword of a library-level
  package body

*
  Immediately within a library-level subprogram body


Normally a subprogram or package spec/body inherits the current mode
that is active at the point it is declared. But this can be overridden
by pragma within the spec or body as above.

The basic consistency rule is that you can't turn SPARK_Mode back
``On``, once you have explicitly (with a pragma) turned if
``Off``. So the following rules apply:

If a subprogram spec has SPARK_Mode ``Off``, then the body must
also have SPARK_Mode ``Off``.

For a package, we have four parts:

*
  the package public declarations
*
  the package private part
*
  the body of the package
*
  the elaboration code after ``begin``

For a package, the rule is that if you explicitly turn SPARK_Mode
``Off`` for any part, then all the following parts must have
SPARK_Mode ``Off``. Note that this may require repeating a pragma
SPARK_Mode (``Off``) in the body. For example, if we have a
configuration pragma SPARK_Mode (``On``) that turns the mode on by
default everywhere, and one particular package spec has pragma
SPARK_Mode (``Off``), then that pragma will need to be repeated in
the package body.

Pragma Static_Elaboration_Desired
=================================

Syntax:


.. code-block:: ada

  pragma Static_Elaboration_Desired;


This pragma is used to indicate that the compiler should attempt to initialize
statically the objects declared in the library unit to which the pragma applies,
when these objects are initialized (explicitly or implicitly) by an aggregate.
In the absence of this pragma, aggregates in object declarations are expanded
into assignments and loops, even when the aggregate components are static
constants. When the aggregate is present the compiler builds a static expression
that requires no run-time code, so that the initialized object can be placed in
read-only data space. If the components are not static, or the aggregate has
more that 100 components, the compiler emits a warning that the pragma cannot
be obeyed. (See also the restriction No_Implicit_Loops, which supports static
construction of larger aggregates with static components that include an others
choice.)

Pragma Stream_Convert
=====================

Syntax:


::

  pragma Stream_Convert (
    [Entity =>] type_LOCAL_NAME,
    [Read   =>] function_NAME,
    [Write  =>] function_NAME);


This pragma provides an efficient way of providing user-defined stream
attributes.  Not only is it simpler to use than specifying the attributes
directly, but more importantly, it allows the specification to be made in such
a way that the predefined unit Ada.Streams is not loaded unless it is actually
needed (i.e. unless the stream attributes are actually used); the use of
the Stream_Convert pragma adds no overhead at all, unless the stream
attributes are actually used on the designated type.

The first argument specifies the type for which stream functions are
provided.  The second parameter provides a function used to read values
of this type.  It must name a function whose argument type may be any
subtype, and whose returned type must be the type given as the first
argument to the pragma.

The meaning of the ``Read`` parameter is that if a stream attribute directly
or indirectly specifies reading of the type given as the first parameter,
then a value of the type given as the argument to the Read function is
read from the stream, and then the Read function is used to convert this
to the required target type.

Similarly the ``Write`` parameter specifies how to treat write attributes
that directly or indirectly apply to the type given as the first parameter.
It must have an input parameter of the type specified by the first parameter,
and the return type must be the same as the input type of the Read function.
The effect is to first call the Write function to convert to the given stream
type, and then write the result type to the stream.

The Read and Write functions must not be overloaded subprograms.  If necessary
renamings can be supplied to meet this requirement.
The usage of this attribute is best illustrated by a simple example, taken
from the GNAT implementation of package Ada.Strings.Unbounded:


.. code-block:: ada

  function To_Unbounded (S : String) return Unbounded_String
    renames To_Unbounded_String;

  pragma Stream_Convert
    (Unbounded_String, To_Unbounded, To_String);


The specifications of the referenced functions, as given in the Ada
Reference Manual are:


.. code-block:: ada

  function To_Unbounded_String (Source : String)
    return Unbounded_String;

  function To_String (Source : Unbounded_String)
    return String;


The effect is that if the value of an unbounded string is written to a stream,
then the representation of the item in the stream is in the same format that
would be used for ``Standard.String'Output``, and this same representation
is expected when a value of this type is read from the stream. Note that the
value written always includes the bounds, even for Unbounded_String'Write,
since Unbounded_String is not an array type.

Note that the ``Stream_Convert`` pragma is not effective in the case of
a derived type of a non-limited tagged type. If such a type is specified then
the pragma is silently ignored, and the default implementation of the stream
attributes is used instead.

Pragma Style_Checks
===================

Syntax:


::

  pragma Style_Checks (string_LITERAL | ALL_CHECKS |
                       On | Off [, LOCAL_NAME]);


This pragma is used in conjunction with compiler switches to control the
built in style checking provided by GNAT.  The compiler switches, if set,
provide an initial setting for the switches, and this pragma may be used
to modify these settings, or the settings may be provided entirely by
the use of the pragma.  This pragma can be used anywhere that a pragma
is legal, including use as a configuration pragma (including use in
the :file:`gnat.adc` file).

The form with a string literal specifies which style options are to be
activated.  These are additive, so they apply in addition to any previously
set style check options.  The codes for the options are the same as those
used in the *-gnaty* switch to *gcc* or *gnatmake*.
For example the following two methods can be used to enable
layout checking:

*

  ::

    pragma Style_Checks ("l");


*

  ::

    gcc -c -gnatyl ...


The form ``ALL_CHECKS`` activates all standard checks (its use is equivalent
to the use of the :switch:`gnaty` switch with no options.
See the :title:`GNAT User's Guide` for details.)

Note: the behavior is slightly different in GNAT mode (:switch:`-gnatg` used).
In this case, ``ALL_CHECKS`` implies the standard set of GNAT mode style check
options (i.e. equivalent to :switch:`-gnatyg`).

The forms with ``Off`` and ``On``
can be used to temporarily disable style checks
as shown in the following example:


.. code-block:: ada

  pragma Style_Checks ("k"); -- requires keywords in lower case
  pragma Style_Checks (Off); -- turn off style checks
  NULL;                      -- this will not generate an error message
  pragma Style_Checks (On);  -- turn style checks back on
  NULL;                      -- this will generate an error message


Finally the two argument form is allowed only if the first argument is
``On`` or ``Off``.  The effect is to turn of semantic style checks
for the specified entity, as shown in the following example:


.. code-block:: ada

  pragma Style_Checks ("r"); -- require consistency of identifier casing
  Arg : Integer;
  Rf1 : Integer := ARG;      -- incorrect, wrong case
  pragma Style_Checks (Off, Arg);
  Rf2 : Integer := ARG;      -- OK, no error


Pragma Subtitle
===============

Syntax:


::

  pragma Subtitle ([Subtitle =>] STRING_LITERAL);


This pragma is recognized for compatibility with other Ada compilers
but is ignored by GNAT.

Pragma Suppress
===============

Syntax:


::

  pragma Suppress (Identifier [, [On =>] Name]);


This is a standard pragma, and supports all the check names required in
the RM. It is included here because GNAT recognizes some additional check
names that are implementation defined (as permitted by the RM):


*
  ``Alignment_Check`` can be used to suppress alignment checks
  on addresses used in address clauses. Such checks can also be suppressed
  by suppressing range checks, but the specific use of ``Alignment_Check``
  allows suppression of alignment checks without suppressing other range checks.
  Note that ``Alignment_Check`` is suppressed by default on machines (such as
  the x86) with non-strict alignment.

*
  ``Atomic_Synchronization`` can be used to suppress the special memory
  synchronization instructions that are normally generated for access to
  ``Atomic`` variables to ensure correct synchronization between tasks
  that use such variables for synchronization purposes.

*
  ``Duplicated_Tag_Check`` Can be used to suppress the check that is generated
  for a duplicated tag value when a tagged type is declared.

*
  ``Container_Checks`` Can be used to suppress all checks within Ada.Containers
  and instances of its children, including Tampering_Check.

*
  ``Tampering_Check`` Can be used to suppress tampering check in the containers.

*
  ``Predicate_Check`` can be used to control whether predicate checks are
  active. It is applicable only to predicates for which the policy is
  ``Check``. Unlike ``Assertion_Policy``, which determines if a given
  predicate is ignored or checked for the whole program, the use of
  ``Suppress`` and ``Unsuppress`` with this check name allows a given
  predicate to be turned on and off at specific points in the program.

*
  ``Validity_Check`` can be used specifically to control validity checks.
  If ``Suppress`` is used to suppress validity checks, then no validity
  checks are performed, including those specified by the appropriate compiler
  switch or the ``Validity_Checks`` pragma.

*
  Additional check names previously introduced by use of the ``Check_Name``
  pragma are also allowed.


Note that pragma Suppress gives the compiler permission to omit
checks, but does not require the compiler to omit checks. The compiler
will generate checks if they are essentially free, even when they are
suppressed. In particular, if the compiler can prove that a certain
check will necessarily fail, it will generate code to do an
unconditional 'raise', even if checks are suppressed. The compiler
warns in this case.

Of course, run-time checks are omitted whenever the compiler can prove
that they will not fail, whether or not checks are suppressed.

Pragma Suppress_All
===================

Syntax:


.. code-block:: ada

  pragma Suppress_All;


This pragma can appear anywhere within a unit.
The effect is to apply ``Suppress (All_Checks)`` to the unit
in which it appears.  This pragma is implemented for compatibility with DEC
Ada 83 usage where it appears at the end of a unit, and for compatibility
with Rational Ada, where it appears as a program unit pragma.
The use of the standard Ada pragma ``Suppress (All_Checks)``
as a normal configuration pragma is the preferred usage in GNAT.

.. _Pragma-Suppress_Debug_Info:

Pragma Suppress_Debug_Info
==========================

Syntax:


::

  pragma Suppress_Debug_Info ([Entity =>] LOCAL_NAME);


This pragma can be used to suppress generation of debug information
for the specified entity. It is intended primarily for use in debugging
the debugger, and navigating around debugger problems.

Pragma Suppress_Exception_Locations
===================================

Syntax:


.. code-block:: ada

  pragma Suppress_Exception_Locations;


In normal mode, a raise statement for an exception by default generates
an exception message giving the file name and line number for the location
of the raise. This is useful for debugging and logging purposes, but this
entails extra space for the strings for the messages. The configuration
pragma ``Suppress_Exception_Locations`` can be used to suppress the
generation of these strings, with the result that space is saved, but the
exception message for such raises is null. This configuration pragma may
appear in a global configuration pragma file, or in a specific unit as
usual. It is not required that this pragma be used consistently within
a partition, so it is fine to have some units within a partition compiled
with this pragma and others compiled in normal mode without it.

.. _Pragma-Suppress_Initialization:

Pragma Suppress_Initialization
==============================
.. index:: Suppressing initialization

.. index:: Initialization, suppression of

Syntax:


::

  pragma Suppress_Initialization ([Entity =>] variable_or_subtype_Name);


Here variable_or_subtype_Name is the name introduced by a type declaration
or subtype declaration or the name of a variable introduced by an
object declaration.

In the case of a type or subtype
this pragma suppresses any implicit or explicit initialization
for all variables of the given type or subtype,
including initialization resulting from the use of pragmas
Normalize_Scalars or Initialize_Scalars.

This is considered a representation item, so it cannot be given after
the type is frozen. It applies to all subsequent object declarations,
and also any allocator that creates objects of the type.

If the pragma is given for the first subtype, then it is considered
to apply to the base type and all its subtypes. If the pragma is given
for other than a first subtype, then it applies only to the given subtype.
The pragma may not be given after the type is frozen.

Note that this includes eliminating initialization of discriminants
for discriminated types, and tags for tagged types. In these cases,
you will have to use some non-portable mechanism (e.g. address
overlays or unchecked conversion) to achieve required initialization
of these fields before accessing any object of the corresponding type.

For the variable case, implicit initialization for the named variable
is suppressed, just as though its subtype had been given in a pragma
Suppress_Initialization, as described above.

Pragma Task_Name
================

Syntax


.. code-block:: ada

  pragma Task_Name (string_EXPRESSION);


This pragma appears within a task definition (like pragma
``Priority``) and applies to the task in which it appears.  The
argument must be of type String, and provides a name to be used for
the task instance when the task is created.  Note that this expression
is not required to be static, and in particular, it can contain
references to task discriminants.  This facility can be used to
provide different names for different tasks as they are created,
as illustrated in the example below.

The task name is recorded internally in the run-time structures
and is accessible to tools like the debugger.  In addition the
routine ``Ada.Task_Identification.Image`` will return this
string, with a unique task address appended.


.. code-block:: ada

  --  Example of the use of pragma Task_Name

  with Ada.Task_Identification;
  use Ada.Task_Identification;
  with Text_IO; use Text_IO;
  procedure t3 is

     type Astring is access String;

     task type Task_Typ (Name : access String) is
        pragma Task_Name (Name.all);
     end Task_Typ;

     task body Task_Typ is
        Nam : constant String := Image (Current_Task);
     begin
        Put_Line ("-->" & Nam (1 .. 14) & "<--");
     end Task_Typ;

     type Ptr_Task is access Task_Typ;
     Task_Var : Ptr_Task;

  begin
     Task_Var :=
       new Task_Typ (new String'("This is task 1"));
     Task_Var :=
       new Task_Typ (new String'("This is task 2"));
  end;


Pragma Task_Storage
===================
Syntax:


::

  pragma Task_Storage (
    [Task_Type =>] LOCAL_NAME,
    [Top_Guard =>] static_integer_EXPRESSION);


This pragma specifies the length of the guard area for tasks.  The guard
area is an additional storage area allocated to a task.  A value of zero
means that either no guard area is created or a minimal guard area is
created, depending on the target.  This pragma can appear anywhere a
``Storage_Size`` attribute definition clause is allowed for a task
type.

.. _Pragma-Test_Case:

Pragma Test_Case
================
.. index:: Test cases


Syntax:


::

  pragma Test_Case (
     [Name     =>] static_string_Expression
    ,[Mode     =>] (Nominal | Robustness)
   [, Requires =>  Boolean_Expression]
   [, Ensures  =>  Boolean_Expression]);


The ``Test_Case`` pragma allows defining fine-grain specifications
for use by testing tools.
The compiler checks the validity of the ``Test_Case`` pragma, but its
presence does not lead to any modification of the code generated by the
compiler.

``Test_Case`` pragmas may only appear immediately following the
(separate) declaration of a subprogram in a package declaration, inside
a package spec unit. Only other pragmas may intervene (that is appear
between the subprogram declaration and a test case).

The compiler checks that boolean expressions given in ``Requires`` and
``Ensures`` are valid, where the rules for ``Requires`` are the
same as the rule for an expression in ``Precondition`` and the rules
for ``Ensures`` are the same as the rule for an expression in
``Postcondition``. In particular, attributes ``'Old`` and
``'Result`` can only be used within the ``Ensures``
expression. The following is an example of use within a package spec:


.. code-block:: ada

  package Math_Functions is
     ...
     function Sqrt (Arg : Float) return Float;
     pragma Test_Case (Name     => "Test 1",
                       Mode     => Nominal,
                       Requires => Arg < 10000.0,
                       Ensures  => Sqrt'Result < 10.0);
     ...
  end Math_Functions;


The meaning of a test case is that there is at least one context where
``Requires`` holds such that, if the associated subprogram is executed in
that context, then ``Ensures`` holds when the subprogram returns.
Mode ``Nominal`` indicates that the input context should also satisfy the
precondition of the subprogram, and the output context should also satisfy its
postcondition. Mode ``Robustness`` indicates that the precondition and
postcondition of the subprogram should be ignored for this test case.

.. _Pragma-Thread_Local_Storage:

Pragma Thread_Local_Storage
===========================
.. index:: Task specific storage

.. index:: TLS (Thread Local Storage)

.. index:: Task_Attributes

Syntax:


::

  pragma Thread_Local_Storage ([Entity =>] LOCAL_NAME);


This pragma specifies that the specified entity, which must be
a variable declared in a library-level package, is to be marked as
"Thread Local Storage" (``TLS``). On systems supporting this (which
include Windows, Solaris, GNU/Linux, and VxWorks 6), this causes each
thread (and hence each Ada task) to see a distinct copy of the variable.

The variable must not have default initialization, and if there is
an explicit initialization, it must be either ``null`` for an
access variable, a static expression for a scalar variable, or a fully
static aggregate for a composite type, that is to say, an aggregate all
of whose components are static, and which does not include packed or
discriminated components.

This provides a low-level mechanism similar to that provided by
the ``Ada.Task_Attributes`` package, but much more efficient
and is also useful in writing interface code that will interact
with foreign threads.

If this pragma is used on a system where ``TLS`` is not supported,
then an error message will be generated and the program will be rejected.

Pragma Time_Slice
=================

Syntax:


.. code-block:: ada

  pragma Time_Slice (static_duration_EXPRESSION);


For implementations of GNAT on operating systems where it is possible
to supply a time slice value, this pragma may be used for this purpose.
It is ignored if it is used in a system that does not allow this control,
or if it appears in other than the main program unit.

Pragma Title
============

Syntax:


::

  pragma Title (TITLING_OPTION [, TITLING OPTION]);

  TITLING_OPTION ::=
    [Title    =>] STRING_LITERAL,
  | [Subtitle =>] STRING_LITERAL


Syntax checked but otherwise ignored by GNAT.  This is a listing control
pragma used in DEC Ada 83 implementations to provide a title and/or
subtitle for the program listing.  The program listing generated by GNAT
does not have titles or subtitles.

Unlike other pragmas, the full flexibility of named notation is allowed
for this pragma, i.e., the parameters may be given in any order if named
notation is used, and named and positional notation can be mixed
following the normal rules for procedure calls in Ada.

Pragma Type_Invariant
=====================

Syntax:


::

  pragma Type_Invariant
    ([Entity =>] type_LOCAL_NAME,
     [Check  =>] EXPRESSION);


The ``Type_Invariant`` pragma is intended to be an exact
replacement for the language-defined ``Type_Invariant``
aspect, and shares its restrictions and semantics. It differs
from the language defined ``Invariant`` pragma in that it
does not permit a string parameter, and it is
controlled by the assertion identifier ``Type_Invariant``
rather than ``Invariant``.

.. _Pragma-Type_Invariant_Class:

Pragma Type_Invariant_Class
===========================

Syntax:


::

  pragma Type_Invariant_Class
    ([Entity =>] type_LOCAL_NAME,
     [Check  =>] EXPRESSION);


The ``Type_Invariant_Class`` pragma is intended to be an exact
replacement for the language-defined ``Type_Invariant'Class``
aspect, and shares its restrictions and semantics.

Note: This pragma is called ``Type_Invariant_Class`` rather than
``Type_Invariant'Class`` because the latter would not be strictly
conforming to the allowed syntax for pragmas. The motivation
for providing pragmas equivalent to the aspects is to allow a program
to be written using the pragmas, and then compiled if necessary
using an Ada compiler that does not recognize the pragmas or
aspects, but is prepared to ignore the pragmas. The assertion
policy that controls this pragma is ``Type_Invariant'Class``,
not ``Type_Invariant_Class``.

Pragma Unchecked_Union
======================
.. index:: Unions in C


Syntax:


.. code-block:: ada

  pragma Unchecked_Union (first_subtype_LOCAL_NAME);


This pragma is used to specify a representation of a record type that is
equivalent to a C union. It was introduced as a GNAT implementation defined
pragma in the GNAT Ada 95 mode. Ada 2005 includes an extended version of this
pragma, making it language defined, and GNAT fully implements this extended
version in all language modes (Ada 83, Ada 95, and Ada 2005). For full
details, consult the Ada 2012 Reference Manual, section B.3.3.

Pragma Unevaluated_Use_Of_Old
=============================
.. index:: Attribute Old

.. index:: Attribute Loop_Entry

.. index:: Unevaluated_Use_Of_Old


Syntax:


.. code-block:: ada

  pragma Unevaluated_Use_Of_Old (Error | Warn | Allow);


This pragma controls the processing of attributes Old and Loop_Entry.
If either of these attributes is used in a potentially unevaluated
expression  (e.g. the then or else parts of an if expression), then
normally this usage is considered illegal if the prefix of the attribute
is other than an entity name. The language requires this
behavior for Old, and GNAT copies the same rule for Loop_Entry.

The reason for this rule is that otherwise, we can have a situation
where we save the Old value, and this results in an exception, even
though we might not evaluate the attribute. Consider this example:


.. code-block:: ada

  package UnevalOld is
     K : Character;
     procedure U (A : String; C : Boolean)  -- ERROR
       with Post => (if C then A(1)'Old = K else True);
  end;


If procedure U is called with a string with a lower bound of 2, and
C false, then an exception would be raised trying to evaluate A(1)
on entry even though the value would not be actually used.

Although the rule guarantees against this possibility, it is sometimes
too restrictive. For example if we know that the string has a lower
bound of 1, then we will never raise an exception.
The pragma ``Unevaluated_Use_Of_Old`` can be
used to modify this behavior. If the argument is ``Error`` then an
error is given (this is the default RM behavior). If the argument is
``Warn`` then the usage is allowed as legal but with a warning
that an exception might be raised. If the argument is ``Allow``
then the usage is allowed as legal without generating a warning.

This pragma may appear as a configuration pragma, or in a declarative
part or package specification. In the latter case it applies to
uses up to the end of the corresponding statement sequence or
sequence of package declarations.

Pragma Unimplemented_Unit
=========================

Syntax:


.. code-block:: ada

  pragma Unimplemented_Unit;


If this pragma occurs in a unit that is processed by the compiler, GNAT
aborts with the message :samp:`xxx not implemented`, where
``xxx`` is the name of the current compilation unit.  This pragma is
intended to allow the compiler to handle unimplemented library units in
a clean manner.

The abort only happens if code is being generated.  Thus you can use
specs of unimplemented packages in syntax or semantic checking mode.

.. _Pragma-Universal_Aliasing:

Pragma Universal_Aliasing
=========================

Syntax:


::

  pragma Universal_Aliasing [([Entity =>] type_LOCAL_NAME)];


``type_LOCAL_NAME`` must refer to a type declaration in the current
declarative part.  The effect is to inhibit strict type-based aliasing
optimization for the given type.  In other words, the effect is as though
access types designating this type were subject to pragma No_Strict_Aliasing.
For a detailed description of the strict aliasing optimization, and the
situations in which it must be suppressed, see the section on
``Optimization and Strict Aliasing`` in the :title:`GNAT User's Guide`.

.. _Pragma-Unmodified:

Pragma Unmodified
=================
.. index:: Warnings, unmodified

Syntax:


::

  pragma Unmodified (LOCAL_NAME {, LOCAL_NAME});


This pragma signals that the assignable entities (variables,
``out`` parameters, ``in out`` parameters) whose names are listed are
deliberately not assigned in the current source unit. This
suppresses warnings about the
entities being referenced but not assigned, and in addition a warning will be
generated if one of these entities is in fact assigned in the
same unit as the pragma (or in the corresponding body, or one
of its subunits).

This is particularly useful for clearly signaling that a particular
parameter is not modified, even though the spec suggests that it might
be.

For the variable case, warnings are never given for unreferenced variables
whose name contains one of the substrings
``DISCARD, DUMMY, IGNORE, JUNK, UNUSE, TMP, TEMP`` in any casing. Such names
are typically to be used in cases where such warnings are expected.
Thus it is never necessary to use ``pragma Unmodified`` for such
variables, though it is harmless to do so.

.. _Pragma-Unreferenced:

Pragma Unreferenced
===================
.. index:: Warnings, unreferenced

Syntax:


::

  pragma Unreferenced (LOCAL_NAME {, LOCAL_NAME});
  pragma Unreferenced (library_unit_NAME {, library_unit_NAME});


This pragma signals that the entities whose names are listed are
deliberately not referenced in the current source unit after the
occurrence of the pragma. This
suppresses warnings about the
entities being unreferenced, and in addition a warning will be
generated if one of these entities is in fact subsequently referenced in the
same unit as the pragma (or in the corresponding body, or one
of its subunits).

This is particularly useful for clearly signaling that a particular
parameter is not referenced in some particular subprogram implementation
and that this is deliberate. It can also be useful in the case of
objects declared only for their initialization or finalization side
effects.

If ``LOCAL_NAME`` identifies more than one matching homonym in the
current scope, then the entity most recently declared is the one to which
the pragma applies. Note that in the case of accept formals, the pragma
Unreferenced may appear immediately after the keyword ``do`` which
allows the indication of whether or not accept formals are referenced
or not to be given individually for each accept statement.

The left hand side of an assignment does not count as a reference for the
purpose of this pragma. Thus it is fine to assign to an entity for which
pragma Unreferenced is given. However, use of an entity as an actual for
an out parameter does count as a reference unless warnings for unread output
parameters are enabled via :switch:`-gnatw.o`.

Note that if a warning is desired for all calls to a given subprogram,
regardless of whether they occur in the same unit as the subprogram
declaration, then this pragma should not be used (calls from another
unit would not be flagged); pragma Obsolescent can be used instead
for this purpose, see :ref:`Pragma_Obsolescent`.

The second form of pragma ``Unreferenced`` is used within a context
clause. In this case the arguments must be unit names of units previously
mentioned in ``with`` clauses (similar to the usage of pragma
``Elaborate_All``). The effect is to suppress warnings about unreferenced
units and unreferenced entities within these units.

For the variable case, warnings are never given for unreferenced variables
whose name contains one of the substrings
``DISCARD, DUMMY, IGNORE, JUNK, UNUSED`` in any casing. Such names
are typically to be used in cases where such warnings are expected.
Thus it is never necessary to use ``pragma Unreferenced`` for such
variables, though it is harmless to do so.

.. _Pragma-Unreferenced_Objects:

Pragma Unreferenced_Objects
===========================
.. index:: Warnings, unreferenced

Syntax:


::

  pragma Unreferenced_Objects (local_subtype_NAME {, local_subtype_NAME});


This pragma signals that for the types or subtypes whose names are
listed, objects which are declared with one of these types or subtypes may
not be referenced, and if no references appear, no warnings are given.

This is particularly useful for objects which are declared solely for their
initialization and finalization effect. Such variables are sometimes referred
to as RAII variables (Resource Acquisition Is Initialization). Using this
pragma on the relevant type (most typically a limited controlled type), the
compiler will automatically suppress unwanted warnings about these variables
not being referenced.

Pragma Unreserve_All_Interrupts
===============================

Syntax:


.. code-block:: ada

  pragma Unreserve_All_Interrupts;


Normally certain interrupts are reserved to the implementation.  Any attempt
to attach an interrupt causes Program_Error to be raised, as described in
RM C.3.2(22).  A typical example is the ``SIGINT`` interrupt used in
many systems for a :kbd:`Ctrl-C` interrupt.  Normally this interrupt is
reserved to the implementation, so that :kbd:`Ctrl-C` can be used to
interrupt execution.

If the pragma ``Unreserve_All_Interrupts`` appears anywhere in any unit in
a program, then all such interrupts are unreserved.  This allows the
program to handle these interrupts, but disables their standard
functions.  For example, if this pragma is used, then pressing
:kbd:`Ctrl-C` will not automatically interrupt execution.  However,
a program can then handle the ``SIGINT`` interrupt as it chooses.

For a full list of the interrupts handled in a specific implementation,
see the source code for the spec of ``Ada.Interrupts.Names`` in
file :file:`a-intnam.ads`.  This is a target dependent file that contains the
list of interrupts recognized for a given target.  The documentation in
this file also specifies what interrupts are affected by the use of
the ``Unreserve_All_Interrupts`` pragma.

For a more general facility for controlling what interrupts can be
handled, see pragma ``Interrupt_State``, which subsumes the functionality
of the ``Unreserve_All_Interrupts`` pragma.

Pragma Unsuppress
=================

Syntax:


::

  pragma Unsuppress (IDENTIFIER [, [On =>] NAME]);


This pragma undoes the effect of a previous pragma ``Suppress``.  If
there is no corresponding pragma ``Suppress`` in effect, it has no
effect.  The range of the effect is the same as for pragma
``Suppress``.  The meaning of the arguments is identical to that used
in pragma ``Suppress``.

One important application is to ensure that checks are on in cases where
code depends on the checks for its correct functioning, so that the code
will compile correctly even if the compiler switches are set to suppress
checks. For example, in a program that depends on external names of tagged
types and wants to ensure that the duplicated tag check occurs even if all
run-time checks are suppressed by a compiler switch, the following
configuration pragma will ensure this test is not suppressed:


.. code-block:: ada

  pragma Unsuppress (Duplicated_Tag_Check);


This pragma is standard in Ada 2005. It is available in all earlier versions
of Ada as an implementation-defined pragma.

Note that in addition to the checks defined in the Ada RM, GNAT recogizes a
number of implementation-defined check names. See the description of pragma
``Suppress`` for full details.

Pragma Use_VADS_Size
====================
.. index:: Size, VADS compatibility

.. index:: Rational profile


Syntax:


.. code-block:: ada

  pragma Use_VADS_Size;


This is a configuration pragma.  In a unit to which it applies, any use
of the 'Size attribute is automatically interpreted as a use of the
'VADS_Size attribute.  Note that this may result in incorrect semantic
processing of valid Ada 95 or Ada 2005 programs.  This is intended to aid in
the handling of existing code which depends on the interpretation of Size
as implemented in the VADS compiler.  See description of the VADS_Size
attribute for further details.

.. _Pragma-Unused:

Pragma Unused
=============
.. index:: Warnings, unused

Syntax:


::

  pragma Unused (LOCAL_NAME {, LOCAL_NAME});


This pragma signals that the assignable entities (variables,
``out`` parameters, and ``in out`` parameters) whose names are listed
deliberately do not get assigned or referenced in the current source unit
after the occurrence of the pragma in the current source unit. This
suppresses warnings about the entities that are unreferenced and/or not
assigned, and, in addition, a warning will be generated if one of these
entities gets assigned or subsequently referenced in the same unit as the
pragma (in the corresponding body or one of its subunits).

This is particularly useful for clearly signaling that a particular
parameter is not modified or referenced, even though the spec suggests
that it might be.

For the variable case, warnings are never given for unreferenced
variables whose name contains one of the substrings
``DISCARD, DUMMY, IGNORE, JUNK, UNUSED`` in any casing. Such names
are typically to be used in cases where such warnings are expected.
Thus it is never necessary to use ``pragma Unused`` for such
variables, though it is harmless to do so.

Pragma Validity_Checks
======================

Syntax:


.. code-block:: ada

  pragma Validity_Checks (string_LITERAL | ALL_CHECKS | On | Off);


This pragma is used in conjunction with compiler switches to control the
built-in validity checking provided by GNAT.  The compiler switches, if set
provide an initial setting for the switches, and this pragma may be used
to modify these settings, or the settings may be provided entirely by
the use of the pragma.  This pragma can be used anywhere that a pragma
is legal, including use as a configuration pragma (including use in
the :file:`gnat.adc` file).

The form with a string literal specifies which validity options are to be
activated.  The validity checks are first set to include only the default
reference manual settings, and then a string of letters in the string
specifies the exact set of options required.  The form of this string
is exactly as described for the *-gnatVx* compiler switch (see the
GNAT User's Guide for details).  For example the following two
methods can be used to enable validity checking for mode ``in`` and
``in out`` subprogram parameters:

*

  .. code-block:: ada

    pragma Validity_Checks ("im");


*

  .. code-block:: sh

    $ gcc -c -gnatVim ...


The form ALL_CHECKS activates all standard checks (its use is equivalent
to the use of the :switch:`gnatVa` switch).

The forms with ``Off`` and ``On`` can be used to temporarily disable
validity checks as shown in the following example:


.. code-block:: ada

  pragma Validity_Checks ("c"); -- validity checks for copies
  pragma Validity_Checks (Off); -- turn off validity checks
  A := B;                       -- B will not be validity checked
  pragma Validity_Checks (On);  -- turn validity checks back on
  A := C;                       -- C will be validity checked

.. _Pragma-Volatile:

Pragma Volatile
===============

Syntax:


.. code-block:: ada

  pragma Volatile (LOCAL_NAME);


This pragma is defined by the Ada Reference Manual, and the GNAT
implementation is fully conformant with this definition.  The reason it
is mentioned in this section is that a pragma of the same name was supplied
in some Ada 83 compilers, including DEC Ada 83.  The Ada 95 / Ada 2005
implementation of pragma Volatile is upwards compatible with the
implementation in DEC Ada 83.

.. _Pragma-Volatile_Full_Access:

Pragma Volatile_Full_Access
===========================

Syntax:


.. code-block:: ada

  pragma Volatile_Full_Access (LOCAL_NAME);


This is similar in effect to pragma Volatile, except that any reference to the
object is guaranteed to be done only with instructions that read or write all
the bits of the object. Furthermore, if the object is of a composite type,
then any reference to a subcomponent of the object is guaranteed to read
and/or write all the bits of the object.

The intention is that this be suitable for use with memory-mapped I/O devices
on some machines. Note that there are two important respects in which this is
different from ``pragma Atomic``. First a reference to a ``Volatile_Full_Access``
object is not a sequential action in the RM 9.10 sense and, therefore, does
not create a synchronization point. Second, in the case of ``pragma Atomic``,
there is no guarantee that all the bits will be accessed if the reference
is not to the whole object; the compiler is allowed (and generally will)
access only part of the object in this case.

.. _Pragma-Volatile_Function:

Pragma Volatile_Function
========================

Syntax:

.. code-block:: ada

  pragma Volatile_Function [ (static_boolean_EXPRESSION) ];

For the semantics of this pragma, see the entry for aspect ``Volatile_Function``
in the SPARK 2014 Reference Manual, section 7.1.2.

Pragma Warning_As_Error
=======================

Syntax:


.. code-block:: ada

  pragma Warning_As_Error (static_string_EXPRESSION);


This configuration pragma allows the programmer to specify a set
of warnings that will be treated as errors. Any warning that
matches the pattern given by the pragma argument will be treated
as an error. This gives more precise control than -gnatwe,
which treats warnings as errors.

This pragma can apply to regular warnings (messages enabled by -gnatw)
and to style warnings (messages that start with "(style)",
enabled by -gnaty).

The pattern may contain asterisks, which match zero or more characters
in the message. For example, you can use ``pragma Warning_As_Error
("bits of*unused")`` to treat the warning message ``warning: 960 bits of
"a" unused`` as an error. All characters other than asterisk are treated
as literal characters in the match. The match is case insensitive; for
example XYZ matches xyz.

Note that the pattern matches if it occurs anywhere within the warning
message string (it is not necessary to put an asterisk at the start and
the end of the message, since this is implied).

Another possibility for the static_string_EXPRESSION which works whether
or not error tags are enabled (*-gnatw.d*) is to use a single
*-gnatw* tag string, enclosed in brackets,
as shown in the example below, to treat one category of warnings as errors.
Note that if you want to treat multiple categories of warnings as errors,
you can use multiple pragma Warning_As_Error.

The above use of patterns to match the message applies only to warning
messages generated by the front end. This pragma can also be applied to
warnings provided by the back end and mentioned in :ref:`Pragma_Warnings`.
By using a single full *-Wxxx* switch in the pragma, such warnings
can also be treated as errors.

The pragma can appear either in a global configuration pragma file
(e.g. :file:`gnat.adc`), or at the start of a file. Given a global
configuration pragma file containing:


.. code-block:: ada

  pragma Warning_As_Error ("[-gnatwj]");


which will treat all obsolescent feature warnings as errors, the
following program compiles as shown (compile options here are
*-gnatwa.d -gnatl -gnatj55*).


::

       1. pragma Warning_As_Error ("*never assigned*");
       2. function Warnerr return String is
       3.    X : Integer;
             |
          >>> error: variable "X" is never read and
              never assigned [-gnatwv] [warning-as-error]

       4.    Y : Integer;
             |
          >>> warning: variable "Y" is assigned but
              never read [-gnatwu]

       5. begin
       6.    Y := 0;
       7.    return %ABC%;
                    |
          >>> error: use of "%" is an obsolescent
              feature (RM J.2(4)), use """ instead
              [-gnatwj] [warning-as-error]

       8. end;

   8 lines: No errors, 3 warnings (2 treated as errors)


Note that this pragma does not affect the set of warnings issued in
any way, it merely changes the effect of a matching warning if one
is produced as a result of other warnings options. As shown in this
example, if the pragma results in a warning being treated as an error,
the tag is changed from "warning:" to "error:" and the string
"[warning-as-error]" is appended to the end of the message.

.. _Pragma_Warnings:

Pragma Warnings
===============

Syntax:


.. code-block:: ada

  pragma Warnings ([TOOL_NAME,] DETAILS [, REASON]);

  DETAILS ::= On | Off
  DETAILS ::= On | Off, local_NAME
  DETAILS ::= static_string_EXPRESSION
  DETAILS ::= On | Off, static_string_EXPRESSION

  TOOL_NAME ::= GNAT | GNATprove

  REASON ::= Reason => STRING_LITERAL {& STRING_LITERAL}

Note: in Ada 83 mode, a string literal may be used in place of a static string
expression (which does not exist in Ada 83).

Note if the second argument of ``DETAILS`` is a ``local_NAME`` then the
second form is always understood. If the intention is to use
the fourth form, then you can write ``NAME & ""`` to force the
intepretation as a *static_string_EXPRESSION*.

Note: if the first argument is a valid ``TOOL_NAME``, it will be interpreted
that way. The use of the ``TOOL_NAME`` argument is relevant only to users
of SPARK and GNATprove, see last part of this section for details.

Normally warnings are enabled, with the output being controlled by
the command line switch.  Warnings (``Off``) turns off generation of
warnings until a Warnings (``On``) is encountered or the end of the
current unit.  If generation of warnings is turned off using this
pragma, then some or all of the warning messages are suppressed,
regardless of the setting of the command line switches.

The ``Reason`` parameter may optionally appear as the last argument
in any of the forms of this pragma. It is intended purely for the
purposes of documenting the reason for the ``Warnings`` pragma.
The compiler will check that the argument is a static string but
otherwise ignore this argument. Other tools may provide specialized
processing for this string.

The form with a single argument (or two arguments if Reason present),
where the first argument is ``ON`` or ``OFF``
may be used as a configuration pragma.

If the ``LOCAL_NAME`` parameter is present, warnings are suppressed for
the specified entity.  This suppression is effective from the point where
it occurs till the end of the extended scope of the variable (similar to
the scope of ``Suppress``). This form cannot be used as a configuration
pragma.

In the case where the first argument is other than ``ON`` or
``OFF``,
the third form with a single static_string_EXPRESSION argument (and possible
reason) provides more precise
control over which warnings are active. The string is a list of letters
specifying which warnings are to be activated and which deactivated. The
code for these letters is the same as the string used in the command
line switch controlling warnings. For a brief summary, use the gnatmake
command with no arguments, which will generate usage information containing
the list of warnings switches supported. For
full details see the section on ``Warning Message Control`` in the
:title:`GNAT User's Guide`.
This form can also be used as a configuration pragma.

The warnings controlled by the :switch:`-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 :switch:`-W` switch. Such warnings can be
identified by the appearance of a string of the form ``[-W{xxx}]`` in the
message which designates the :switch:`-W{xxx}` switch that controls the message.
The form with a single *static_string_EXPRESSION* argument also works for these
warnings, but the string must be a single full :switch:`-W{xxx}` switch in this
case. The above reference lists a few examples of these additional warnings.

The specified warnings will be in effect until the end of the program
or another pragma ``Warnings`` is encountered. The effect of the pragma is
cumulative. Initially the set of warnings is the standard default set
as possibly modified by compiler switches. Then each pragma Warning
modifies this set of warnings as specified. This form of the pragma may
also be used as a configuration pragma.

The fourth form, with an ``On|Off`` parameter and a string, is used to
control individual messages, based on their text. The string argument
is a pattern that is used to match against the text of individual
warning messages (not including the initial "warning: " tag).

The pattern may contain asterisks, which match zero or more characters in
the message. For example, you can use
``pragma Warnings (Off, "bits of*unused")`` to suppress the warning
message ``warning: 960 bits of "a" unused``. No other regular
expression notations are permitted. All characters other than asterisk in
these three specific cases are treated as literal characters in the match.
The match is case insensitive, for example XYZ matches xyz.

Note that the pattern matches if it occurs anywhere within the warning
message string (it is not necessary to put an asterisk at the start and
the end of the message, since this is implied).

The above use of patterns to match the message applies only to warning
messages generated by the front end. This form of the pragma with a string
argument can also be used to control warnings provided by the back end and
mentioned above. By using a single full :switch:`-W{xxx}` switch in the pragma,
such warnings can be turned on and off.

There are two ways to use the pragma in this form. The OFF form can be used
as a configuration pragma. The effect is to suppress all warnings (if any)
that match the pattern string throughout the compilation (or match the
-W switch in the back end case).

The second usage is to suppress a warning locally, and in this case, two
pragmas must appear in sequence:


.. code-block:: ada

  pragma Warnings (Off, Pattern);
  ... code where given warning is to be suppressed
  pragma Warnings (On, Pattern);


In this usage, the pattern string must match in the Off and On
pragmas, and (if *-gnatw.w* is given) at least one matching
warning must be suppressed.

Note: if the ON form is not found, then the effect of the OFF form extends
until the end of the file (pragma Warnings is purely textual, so its effect
does not stop at the end of the enclosing scope).

Note: to write a string that will match any warning, use the string
``"***"``. It will not work to use a single asterisk or two
asterisks since this looks like an operator name. This form with three
asterisks is similar in effect to specifying ``pragma Warnings (Off)`` except (if :switch:`-gnatw.w` is given) that a matching
``pragma Warnings (On, "***")`` will be required. This can be
helpful in avoiding forgetting to turn warnings back on.

Note: the debug flag :switch:`-gnatd.i` can be
used to cause the compiler to entirely ignore all WARNINGS pragmas. This can
be useful in checking whether obsolete pragmas in existing programs are hiding
real problems.

Note: pragma Warnings does not affect the processing of style messages. See
separate entry for pragma Style_Checks for control of style messages.

Users of the formal verification tool GNATprove for the SPARK subset of Ada may
use the version of the pragma with a ``TOOL_NAME`` parameter.

If present, ``TOOL_NAME`` is the name of a tool, currently either ``GNAT`` for the
compiler or ``GNATprove`` for the formal verification tool. A given tool only
takes into account pragma Warnings that do not specify a tool name, or that
specify the matching tool name. This makes it possible to disable warnings
selectively for each tool, and as a consequence to detect useless pragma
Warnings with switch :switch:`-gnatw.w`.

Pragma Weak_External
====================

Syntax:


.. code-block:: ada

  pragma Weak_External ([Entity =>] LOCAL_NAME);


``LOCAL_NAME`` must refer to an object that is declared at the library
level. This pragma specifies that the given entity should be marked as a
weak symbol for the linker. It is equivalent to ``__attribute__((weak))``
in GNU C and causes ``LOCAL_NAME`` to be emitted as a weak symbol instead
of a regular symbol, that is to say a symbol that does not have to be
resolved by the linker if used in conjunction with a pragma Import.

When a weak symbol is not resolved by the linker, its address is set to
zero. This is useful in writing interfaces to external modules that may
or may not be linked in the final executable, for example depending on
configuration settings.

If a program references at run time an entity to which this pragma has been
applied, and the corresponding symbol was not resolved at link time, then
the execution of the program is erroneous. It is not erroneous to take the
Address of such an entity, for example to guard potential references,
as shown in the example below.

Some file formats do not support weak symbols so not all target machines
support this pragma.


.. code-block:: ada

  --  Example of the use of pragma Weak_External

  package External_Module is
    key : Integer;
    pragma Import (C, key);
    pragma Weak_External (key);
    function Present return boolean;
  end External_Module;

  with System; use System;
  package body External_Module is
    function Present return boolean is
    begin
      return key'Address /= System.Null_Address;
    end Present;
  end External_Module;


Pragma Wide_Character_Encoding
==============================

Syntax:


.. code-block:: ada

  pragma Wide_Character_Encoding (IDENTIFIER | CHARACTER_LITERAL);


This pragma specifies the wide character encoding to be used in program
source text appearing subsequently. It is a configuration pragma, but may
also be used at any point that a pragma is allowed, and it is permissible
to have more than one such pragma in a file, allowing multiple encodings
to appear within the same file.

However, note that the pragma cannot immediately precede the relevant
wide character, because then the previous encoding will still be in
effect, causing "illegal character" errors.

The argument can be an identifier or a character literal. In the identifier
case, it is one of ``HEX``, ``UPPER``, ``SHIFT_JIS``,
``EUC``, ``UTF8``, or ``BRACKETS``. In the character literal
case it is correspondingly one of the characters :kbd:`h`, :kbd:`u`,
:kbd:`s`, :kbd:`e`, :kbd:`8`, or :kbd:`b`.

Note that when the pragma is used within a file, it affects only the
encoding within that file, and does not affect withed units, specs,
or subunits.
