]> gcc.gnu.org Git - gcc.git/blame - gcc/ada/doc/gnat_rm/implementation_defined_aspects.rst
[Ada] Rename Ada 202* to Ada 2022
[gcc.git] / gcc / ada / doc / gnat_rm / implementation_defined_aspects.rst
CommitLineData
cb2d884d
AC
1.. _Implementation_Defined_Aspects:
2
3******************************
4Implementation Defined Aspects
5******************************
6
7Ada defines (throughout the Ada 2012 reference manual, summarized
8in Annex K) a set of aspects that can be specified for certain entities.
9These language defined aspects are implemented in GNAT in Ada 2012 mode
10and work as described in the Ada 2012 Reference Manual.
11
12In addition, Ada 2012 allows implementations to define additional aspects
13whose meaning is defined by the implementation. GNAT provides
14a number of these implementation-defined aspects which can be used
15to extend and enhance the functionality of the compiler. This section of
16the GNAT reference manual describes these additional aspects.
17
18Note that any program using these aspects may not be portable to
19other compilers (although GNAT implements this set of aspects on all
20platforms). Therefore if portability to other compilers is an important
21consideration, you should minimize the use of these aspects.
22
23Note that for many of these aspects, the effect is essentially similar
24to the use of a pragma or attribute specification with the same name
25applied to the entity. For example, if we write:
26
27
28.. code-block:: ada
29
30 type R is range 1 .. 100
31 with Value_Size => 10;
32
33
34then the effect is the same as:
35
36.. code-block:: ada
37
38 type R is range 1 .. 100;
39 for R'Value_Size use 10;
40
41
42and if we write:
43
44.. code-block:: ada
45
46 type R is new Integer
47 with Shared => True;
48
49
50then the effect is the same as:
51
52.. code-block:: ada
53
54 type R is new Integer;
55 pragma Shared (R);
56
57
58In the documentation below, such cases are simply marked
59as being boolean aspects equivalent to the corresponding pragma
60or attribute definition clause.
61
62Aspect Abstract_State
63=====================
64
65.. index:: Abstract_State
66
c25f170d 67This aspect is equivalent to :ref:`pragma Abstract_State<Pragma-Abstract_State>`.
cb2d884d 68
9c533e7d
AC
69Aspect Annotate
70===============
71
cb2d884d
AC
72.. index:: Annotate
73
74There are three forms of this aspect (where ID is an identifier,
c25f170d
AC
75and ARG is a general expression),
76corresponding to :ref:`pragma Annotate<Pragma-Annotate>`.
cb2d884d
AC
77
78
79
80*Annotate => ID*
08705a15 81 Equivalent to ``pragma Annotate (ID, Entity => Name);``
cb2d884d
AC
82
83
84*Annotate => (ID)*
08705a15 85 Equivalent to ``pragma Annotate (ID, Entity => Name);``
cb2d884d
AC
86
87
88*Annotate => (ID ,ID {, ARG})*
08705a15 89 Equivalent to ``pragma Annotate (ID, ID {, ARG}, Entity => Name);``
cb2d884d
AC
90
91Aspect Async_Readers
92====================
93.. index:: Async_Readers
94
c25f170d 95This boolean aspect is equivalent to :ref:`pragma Async_Readers<Pragma-Async_Readers>`.
cb2d884d
AC
96
97Aspect Async_Writers
98====================
99.. index:: Async_Writers
100
c25f170d 101This boolean aspect is equivalent to :ref:`pragma Async_Writers<Pragma-Async_Writers>`.
cb2d884d 102
abcb651b
AC
103Aspect Constant_After_Elaboration
104=================================
105.. index:: Constant_After_Elaboration
106
c25f170d 107This aspect is equivalent to :ref:`pragma Constant_After_Elaboration<Pragma-Constant_After_Elaboration>`.
abcb651b 108
cb2d884d
AC
109Aspect Contract_Cases
110=====================
111.. index:: Contract_Cases
112
c25f170d 113This aspect is equivalent to :ref:`pragma Contract_Cases<Pragma-Contract_Cases>`, the sequence
cb2d884d
AC
114of clauses being enclosed in parentheses so that syntactically it is an
115aggregate.
116
117Aspect Depends
118==============
119.. index:: Depends
120
c25f170d 121This aspect is equivalent to :ref:`pragma Depends<Pragma-Depends>`.
cb2d884d 122
abcb651b
AC
123Aspect Default_Initial_Condition
124================================
125.. index:: Default_Initial_Condition
126
c25f170d 127This aspect is equivalent to :ref:`pragma Default_Initial_Condition<Pragma-Default_Initial_Condition>`.
abcb651b 128
cb2d884d
AC
129Aspect Dimension
130================
131.. index:: Dimension
132
08705a15 133The ``Dimension`` aspect is used to specify the dimensions of a given
cb2d884d
AC
134subtype of a dimensioned numeric type. The aspect also specifies a symbol
135used when doing formatted output of dimensioned quantities. The syntax is::
136
137 with Dimension =>
138 ([Symbol =>] SYMBOL, DIMENSION_VALUE {, DIMENSION_Value})
139
140 SYMBOL ::= STRING_LITERAL | CHARACTER_LITERAL
141
142 DIMENSION_VALUE ::=
143 RATIONAL
144 | others => RATIONAL
145 | DISCRETE_CHOICE_LIST => RATIONAL
146
147 RATIONAL ::= [-] NUMERIC_LITERAL [/ NUMERIC_LITERAL]
148
149
150This aspect can only be applied to a subtype whose parent type has
08705a15 151a ``Dimension_System`` aspect. The aspect must specify values for
cb2d884d
AC
152all dimensions of the system. The rational values are the powers of the
153corresponding dimensions that are used by the compiler to verify that
154physical (numeric) computations are dimensionally consistent. For example,
155the computation of a force must result in dimensions (L => 1, M => 1, T => -2).
156For further examples of the usage
08705a15 157of this aspect, see package ``System.Dim.Mks``.
cb2d884d
AC
158Note that when the dimensioned type is an integer type, then any
159dimension value must be an integer literal.
160
161Aspect Dimension_System
162=======================
163.. index:: Dimension_System
164
08705a15 165The ``Dimension_System`` aspect is used to define a system of
cb2d884d 166dimensions that will be used in subsequent subtype declarations with
08705a15 167``Dimension`` aspects that reference this system. The syntax is::
cb2d884d
AC
168
169 with Dimension_System => (DIMENSION {, DIMENSION});
170
171 DIMENSION ::= ([Unit_Name =>] IDENTIFIER,
172 [Unit_Symbol =>] SYMBOL,
173 [Dim_Symbol =>] SYMBOL)
174
175 SYMBOL ::= CHARACTER_LITERAL | STRING_LITERAL
176
177
178This aspect is applied to a type, which must be a numeric derived type
179(typically a floating-point type), that
08705a15 180will represent values within the dimension system. Each ``DIMENSION``
cb2d884d 181corresponds to one particular dimension. A maximum of 7 dimensions may
08705a15
AC
182be specified. ``Unit_Name`` is the name of the dimension (for example
183``Meter``). ``Unit_Symbol`` is the shorthand used for quantities
184of this dimension (for example ``m`` for ``Meter``).
185``Dim_Symbol`` gives
cb2d884d 186the identification within the dimension system (typically this is a
08705a15
AC
187single letter, e.g. ``L`` standing for length for unit name ``Meter``).
188The ``Unit_Symbol`` is used in formatted output of dimensioned quantities.
189The ``Dim_Symbol`` is used in error messages when numeric operations have
cb2d884d
AC
190inconsistent dimensions.
191
192GNAT provides the standard definition of the International MKS system in
08705a15 193the run-time package ``System.Dim.Mks``. You can easily define
cb2d884d
AC
194similar packages for cgs units or British units, and define conversion factors
195between values in different systems. The MKS system is characterized by the
196following aspect:
197
198.. code-block:: ada
199
200 type Mks_Type is new Long_Long_Float with
201 Dimension_System => (
202 (Unit_Name => Meter, Unit_Symbol => 'm', Dim_Symbol => 'L'),
203 (Unit_Name => Kilogram, Unit_Symbol => "kg", Dim_Symbol => 'M'),
204 (Unit_Name => Second, Unit_Symbol => 's', Dim_Symbol => 'T'),
205 (Unit_Name => Ampere, Unit_Symbol => 'A', Dim_Symbol => 'I'),
206 (Unit_Name => Kelvin, Unit_Symbol => 'K', Dim_Symbol => '@'),
207 (Unit_Name => Mole, Unit_Symbol => "mol", Dim_Symbol => 'N'),
208 (Unit_Name => Candela, Unit_Symbol => "cd", Dim_Symbol => 'J'));
209
210
08705a15 211Note that in the above type definition, we use the ``at`` symbol (``@``) to
cb2d884d
AC
212represent a theta character (avoiding the use of extended Latin-1
213characters in this context).
214
215See section 'Performing Dimensionality Analysis in GNAT' in the GNAT Users
216Guide for detailed examples of use of the dimension system.
217
74e9ae98
AC
218Aspect Disable_Controlled
219=========================
220.. index:: Disable_Controlled
221
08705a15
AC
222The aspect ``Disable_Controlled`` is defined for controlled record types. If
223active, this aspect causes suppression of all related calls to ``Initialize``,
224``Adjust``, and ``Finalize``. The intended use is for conditional compilation,
74e9ae98
AC
225where for example you might want a record to be controlled or not depending on
226whether some run-time check is enabled or suppressed.
227
cb2d884d
AC
228Aspect Effective_Reads
229======================
230.. index:: Effective_Reads
231
c25f170d 232This aspect is equivalent to :ref:`pragma Effective_Reads<Pragma-Effective_Reads>`.
cb2d884d
AC
233
234Aspect Effective_Writes
235=======================
236.. index:: Effective_Writes
237
c25f170d 238This aspect is equivalent to :ref:`pragma Effective_Writes<Pragma-Effective_Writes>`.
cb2d884d 239
abcb651b
AC
240Aspect Extensions_Visible
241=========================
242.. index:: Extensions_Visible
243
c25f170d 244This aspect is equivalent to :ref:`pragma Extensions_Visible<Pragma-Extensions_Visible>`.
abcb651b 245
cb2d884d
AC
246Aspect Favor_Top_Level
247======================
248.. index:: Favor_Top_Level
249
c25f170d 250This boolean aspect is equivalent to :ref:`pragma Favor_Top_Level<Pragma-Favor_Top_Level>`.
cb2d884d 251
abcb651b
AC
252Aspect Ghost
253=============
254.. index:: Ghost
255
c25f170d 256This aspect is equivalent to :ref:`pragma Ghost<Pragma-Ghost>`.
abcb651b 257
cb2d884d
AC
258Aspect Global
259=============
260.. index:: Global
261
c25f170d 262This aspect is equivalent to :ref:`pragma Global<Pragma-Global>`.
cb2d884d
AC
263
264Aspect Initial_Condition
265========================
266.. index:: Initial_Condition
267
c25f170d 268This aspect is equivalent to :ref:`pragma Initial_Condition<Pragma-Initial_Condition>`.
cb2d884d
AC
269
270Aspect Initializes
271==================
272.. index:: Initializes
273
c25f170d 274This aspect is equivalent to :ref:`pragma Initializes<Pragma-Initializes>`.
cb2d884d
AC
275
276Aspect Inline_Always
277====================
278.. index:: Inline_Always
279
c25f170d 280This boolean aspect is equivalent to :ref:`pragma Inline_Always<Pragma-Inline_Always>`.
cb2d884d
AC
281
282Aspect Invariant
283================
284.. index:: Invariant
285
c25f170d 286This aspect is equivalent to :ref:`pragma Invariant<Pragma-Invariant>`. It is a
08705a15
AC
287synonym for the language defined aspect ``Type_Invariant`` except
288that it is separately controllable using pragma ``Assertion_Policy``.
cb2d884d
AC
289
290Aspect Invariant'Class
291======================
292.. index:: Invariant'Class
293
c25f170d 294This aspect is equivalent to :ref:`pragma Type_Invariant_Class<Pragma-Type_Invariant_Class>`. It is a
08705a15
AC
295synonym for the language defined aspect ``Type_Invariant'Class`` except
296that it is separately controllable using pragma ``Assertion_Policy``.
cb2d884d
AC
297
298Aspect Iterable
299===============
300.. index:: Iterable
301
302This aspect provides a light-weight mechanism for loops and quantified
303expressions over container types, without the overhead imposed by the tampering
304checks of standard Ada 2012 iterators. The value of the aspect is an aggregate
f5c31a46
BB
305with six named components, of which the last three are optional: ``First``,
306``Next``, ``Has_Element``, ``Element``, ``Last``, and ``Previous``.
2e60feb5
PMR
307When only the first three components are specified, only the
308``for .. in`` form of iteration over cursors is available. When ``Element``
309is specified, both this form and the ``for .. of`` form of iteration over
310elements are available. If the last two components are specified, reverse
311iterations over the container can be specified (analogous to what can be done
f5c31a46 312over predefined containers that support the ``Reverse_Iterator`` interface).
2e60feb5 313The following is a typical example of use:
cb2d884d
AC
314
315.. code-block:: ada
316
317 type List is private with
318 Iterable => (First => First_Cursor,
319 Next => Advance,
320 Has_Element => Cursor_Has_Element,
321 [Element => Get_Element]);
322
08705a15
AC
323* The value denoted by ``First`` must denote a primitive operation of the
324 container type that returns a ``Cursor``, which must a be a type declared in
cb2d884d
AC
325 the container package or visible from it. For example:
326
327.. code-block:: ada
328
329 function First_Cursor (Cont : Container) return Cursor;
330
08705a15 331* The value of ``Next`` is a primitive operation of the container type that takes
cb2d884d
AC
332 both a container and a cursor and yields a cursor. For example:
333
334.. code-block:: ada
335
336 function Advance (Cont : Container; Position : Cursor) return Cursor;
337
08705a15 338* The value of ``Has_Element`` is a primitive operation of the container type
cb2d884d
AC
339 that takes both a container and a cursor and yields a boolean. For example:
340
341.. code-block:: ada
342
343 function Cursor_Has_Element (Cont : Container; Position : Cursor) return Boolean;
344
08705a15
AC
345* The value of ``Element`` is a primitive operation of the container type that
346 takes both a container and a cursor and yields an ``Element_Type``, which must
cb2d884d
AC
347 be a type declared in the container package or visible from it. For example:
348
349.. code-block:: ada
350
351 function Get_Element (Cont : Container; Position : Cursor) return Element_Type;
352
353This aspect is used in the GNAT-defined formal container packages.
354
355Aspect Linker_Section
356=====================
357.. index:: Linker_Section
358
c25f170d 359This aspect is equivalent to :ref:`pragma Linker_Section<Pragma-Linker_Section>`.
cb2d884d
AC
360
361Aspect Lock_Free
362================
363.. index:: Lock_Free
364
c25f170d 365This boolean aspect is equivalent to :ref:`pragma Lock_Free<Pragma-Lock_Free>`.
cb2d884d 366
33c51287
AC
367Aspect Max_Queue_Length
368=======================
33c51287
AC
369.. index:: Max_Queue_Length
370
371This aspect is equivalent to :ref:`pragma Max_Queue_Length<Pragma-Max_Queue_Length>`.
372
9dfc6c55
YM
373Aspect No_Caching
374=================
375.. index:: No_Caching
376
377This boolean aspect is equivalent to :ref:`pragma No_Caching<Pragma-No_Caching>`.
378
cb2d884d
AC
379Aspect No_Elaboration_Code_All
380==============================
381.. index:: No_Elaboration_Code_All
382
c25f170d
AC
383This aspect is equivalent to :ref:`pragma No_Elaboration_Code_All<Pragma-No_Elaboration_Code_All>`
384for a program unit.
cb2d884d 385
08705a15
AC
386Aspect No_Inline
387================
388.. index:: No_Inline
389
390This boolean aspect is equivalent to :ref:`pragma No_Inline<Pragma-No_Inline>`.
391
cb2d884d
AC
392Aspect No_Tagged_Streams
393========================
394.. index:: No_Tagged_Streams
395
c25f170d 396This aspect is equivalent to :ref:`pragma No_Tagged_Streams<Pragma-No_Tagged_Streams>` with an
cb2d884d
AC
397argument specifying a root tagged type (thus this aspect can only be
398applied to such a type).
399
400Aspect Object_Size
401==================
402.. index:: Object_Size
403
c25f170d 404This aspect is equivalent to :ref:`attribute Object_Size<Attribute-Object_Size>`.
cb2d884d
AC
405
406Aspect Obsolescent
407==================
408.. index:: Obsolsecent
409
c25f170d 410This aspect is equivalent to :ref:`pragma Obsolescent<Pragma_Obsolescent>`. Note that the
cb2d884d
AC
411evaluation of this aspect happens at the point of occurrence, it is not
412delayed until the freeze point.
413
414Aspect Part_Of
415==============
416.. index:: Part_Of
417
c25f170d 418This aspect is equivalent to :ref:`pragma Part_Of<Pragma-Part_Of>`.
cb2d884d
AC
419
420Aspect Persistent_BSS
421=====================
422.. index:: Persistent_BSS
423
c25f170d 424This boolean aspect is equivalent to :ref:`pragma Persistent_BSS<Pragma-Persistent_BSS>`.
cb2d884d
AC
425
426Aspect Predicate
427================
428.. index:: Predicate
429
c25f170d 430This aspect is equivalent to :ref:`pragma Predicate<Pragma-Predicate>`. It is thus
08705a15
AC
431similar to the language defined aspects ``Dynamic_Predicate``
432and ``Static_Predicate`` except that whether the resulting
cb2d884d
AC
433predicate is static or dynamic is controlled by the form of the
434expression. It is also separately controllable using pragma
08705a15 435``Assertion_Policy``.
cb2d884d
AC
436
437Aspect Pure_Function
438====================
439.. index:: Pure_Function
440
c25f170d 441This boolean aspect is equivalent to :ref:`pragma Pure_Function<Pragma-Pure_Function>`.
cb2d884d
AC
442
443Aspect Refined_Depends
444======================
445.. index:: Refined_Depends
446
c25f170d 447This aspect is equivalent to :ref:`pragma Refined_Depends<Pragma-Refined_Depends>`.
cb2d884d
AC
448
449Aspect Refined_Global
450=====================
451.. index:: Refined_Global
452
c25f170d 453This aspect is equivalent to :ref:`pragma Refined_Global<Pragma-Refined_Global>`.
cb2d884d
AC
454
455Aspect Refined_Post
456===================
457.. index:: Refined_Post
458
c25f170d 459This aspect is equivalent to :ref:`pragma Refined_Post<Pragma-Refined_Post>`.
cb2d884d
AC
460
461Aspect Refined_State
462====================
463.. index:: Refined_State
464
c25f170d 465This aspect is equivalent to :ref:`pragma Refined_State<Pragma-Refined_State>`.
cb2d884d 466
6ba3247d
PT
467Aspect Relaxed_Initialization
468=============================
469.. index:: Refined_Initialization
470
471For the syntax and semantics of this aspect, see the SPARK 2014 Reference
472Manual, section 6.10.
473
cb2d884d
AC
474Aspect Remote_Access_Type
475=========================
476.. index:: Remote_Access_Type
477
c25f170d 478This aspect is equivalent to :ref:`pragma Remote_Access_Type<Pragma-Remote_Access_Type>`.
cb2d884d 479
33c51287
AC
480Aspect Secondary_Stack_Size
481===========================
482
483.. index:: Secondary_Stack_Size
484
485This aspect is equivalent to :ref:`pragma Secondary_Stack_Size<Pragma-Secondary_Stack_Size>`.
486
487
cb2d884d
AC
488Aspect Scalar_Storage_Order
489===========================
490.. index:: Scalar_Storage_Order
491
c25f170d 492This aspect is equivalent to a :ref:`attribute Scalar_Storage_Order<Attribute-Scalar_Storage_Order>`.
cb2d884d
AC
493
494Aspect Shared
495=============
496.. index:: Shared
497
c25f170d 498This boolean aspect is equivalent to :ref:`pragma Shared<Pragma-Shared>`
08705a15 499and is thus a synonym for aspect ``Atomic``.
cb2d884d
AC
500
501Aspect Simple_Storage_Pool
502==========================
503.. index:: Simple_Storage_Pool
504
c25f170d 505This aspect is equivalent to :ref:`attribute Simple_Storage_Pool<Attribute_Simple_Storage_Pool>`.
cb2d884d
AC
506
507Aspect Simple_Storage_Pool_Type
508===============================
509.. index:: Simple_Storage_Pool_Type
510
c25f170d 511This boolean aspect is equivalent to :ref:`pragma Simple_Storage_Pool_Type<Pragma-Simple_Storage_Pool_Type>`.
cb2d884d
AC
512
513Aspect SPARK_Mode
514=================
515.. index:: SPARK_Mode
516
c25f170d 517This aspect is equivalent to :ref:`pragma SPARK_Mode<Pragma-SPARK_Mode>` and
cb2d884d
AC
518may be specified for either or both of the specification and body
519of a subprogram or package.
520
521Aspect Suppress_Debug_Info
522==========================
523.. index:: Suppress_Debug_Info
524
c25f170d 525This boolean aspect is equivalent to :ref:`pragma Suppress_Debug_Info<Pragma-Suppress_Debug_Info>`.
cb2d884d
AC
526
527Aspect Suppress_Initialization
528==============================
529.. index:: Suppress_Initialization
530
c25f170d 531This boolean aspect is equivalent to :ref:`pragma Suppress_Initialization<Pragma-Suppress_Initialization>`.
cb2d884d
AC
532
533Aspect Test_Case
534================
535.. index:: Test_Case
536
c25f170d 537This aspect is equivalent to :ref:`pragma Test_Case<Pragma-Test_Case>`.
cb2d884d
AC
538
539Aspect Thread_Local_Storage
540===========================
541.. index:: Thread_Local_Storage
542
c25f170d 543This boolean aspect is equivalent to :ref:`pragma Thread_Local_Storage<Pragma-Thread_Local_Storage>`.
cb2d884d
AC
544
545Aspect Universal_Aliasing
546=========================
547.. index:: Universal_Aliasing
548
c25f170d 549This boolean aspect is equivalent to :ref:`pragma Universal_Aliasing<Pragma-Universal_Aliasing>`.
cb2d884d
AC
550
551Aspect Universal_Data
552=====================
553.. index:: Universal_Data
554
c25f170d 555This aspect is equivalent to :ref:`pragma Universal_Data<Pragma-Universal_Data>`.
cb2d884d
AC
556
557Aspect Unmodified
558=================
559.. index:: Unmodified
560
c25f170d 561This boolean aspect is equivalent to :ref:`pragma Unmodified<Pragma-Unmodified>`.
cb2d884d
AC
562
563Aspect Unreferenced
564===================
565.. index:: Unreferenced
566
71400efc
AC
567This boolean aspect is equivalent to :ref:`pragma Unreferenced<Pragma-Unreferenced>`.
568
81e68a19 569When using the ``-gnat2022`` switch, this aspect is also supported on formal
71400efc
AC
570parameters, which is in particular the only form possible for expression
571functions.
cb2d884d
AC
572
573Aspect Unreferenced_Objects
574===========================
575.. index:: Unreferenced_Objects
576
c25f170d 577This boolean aspect is equivalent to :ref:`pragma Unreferenced_Objects<Pragma-Unreferenced_Objects>`.
cb2d884d
AC
578
579Aspect Value_Size
580=================
581.. index:: Value_Size
582
c25f170d 583This aspect is equivalent to :ref:`attribute Value_Size<Attribute-Value_Size>`.
cb2d884d 584
74e9ae98
AC
585Aspect Volatile_Full_Access
586===========================
587.. index:: Volatile_Full_Access
588
c25f170d 589This boolean aspect is equivalent to :ref:`pragma Volatile_Full_Access<Pragma-Volatile_Full_Access>`.
74e9ae98 590
abcb651b
AC
591Aspect Volatile_Function
592===========================
593.. index:: Volatile_Function
594
c25f170d 595This boolean aspect is equivalent to :ref:`pragma Volatile_Function<Pragma-Volatile_Function>`.
abcb651b 596
cb2d884d
AC
597Aspect Warnings
598===============
599.. index:: Warnings
600
c25f170d 601This aspect is equivalent to the two argument form of :ref:`pragma Warnings<Pragma_Warnings>`,
08705a15 602where the first argument is ``ON`` or ``OFF`` and the second argument
cb2d884d 603is the entity.
This page took 1.96797 seconds and 5 git commands to generate.