| .. 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 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 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 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_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 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 | All); |
| |
| |
| This configuration pragma enables (via the "On" or "All" argument) or disables |
| (via the "Off" argument) the implementation extension mode; the pragma takes |
| precedence over the *-gnatX* and *-gnatX0* command switches. |
| |
| If an argument of "All" is specified, the latest version of the Ada language |
| is implemented (currently Ada 2022) and, in addition, a number |
| of GNAT specific extensions are recognized. These extensions are listed |
| below. An argument of "On" has the same effect except that only |
| some, not all, of the listed extensions are enabled; those extensions |
| are identified below. |
| |
| * 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. |
| |
| An Extensions_Allowed pragma argument of "On" enables this extension. |
| |
| * ``[]`` 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. |
| |
| An Extensions_Allowed pragma argument of "On" enables this extension. |
| |
| * 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. |
| |
| An Extensions_Allowed pragma argument of "On" enables this extension. |
| |
| * 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). |
| |
| An Extensions_Allowed pragma argument of "On" enables this extension. |
| |
| * 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 interpreted |
| 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,
|