# K.2 Language-Defined Attributes

This Reference Manual output has not been verified, and may contain omissions or errors. Report any problems on the tracking issue

This subclause summarizes the definitions given elsewhere of the language-defined attributes. Attributes are properties of entities that can be queried by an Ada program.

P'Access

- For a
`prefix`

P that denotes a subprogram: 3 - P'Access yields an access value that designates the subprogram denoted by P. The type of P'Access is an access-to-subprogram type (
*S*), as determined by the expected type. See 3.10.2. 4

X'Access- For a
`prefix`

X that denotes an aliased view of an object: 5 - X'Access yields an access value that designates the object denoted by X. The type of X'Access is an access-to-object type, as determined by the expected type. The expected type shall be a general access type. See 3.10.2.

X'Address- For a
`prefix`

X that denotes an object, program unit, or label: 7 - Denotes the address of the first of the storage elements allocated to X. For a program unit or label, this value refers to the machine code associated with the corresponding body or
`statement`

. The value of this attribute is of type System.Address. See 13.3. 8

S'Adjacent- For every subtype S of a floating point type
*T*: 9 - S'Adjacent denotes a function with the following specification:

function S'Adjacent (X, Towards : T)
return T

11
- If
*Towards*=*X*, the function yields*X*; otherwise, it yields the machine number of the type*T*adjacent to*X*in the direction of*Towards*, if that machine number exists. If the result would be outside the base range of S, Constraint_Error is raised. When*T*'Signed_Zeros is True, a zero result has the sign of*X*. When*Towards*is zero, its sign has no bearing on the result. See A.5.3. 12

S'Aft- For every fixed point subtype S:
- S'Aft yields the number of decimal digits needed after the decimal point to accommodate the
*delta*of the subtype S, unless the*delta*of the subtype S is greater than 0.1, in which case the attribute yields the value one. (S'Aft is the smallest positive integer N for which (10**N)*S'Delta is greater than or equal to one.) The value of this attribute is of the type*universal_integer*. See 3.5.10. 13.1/2

S'Alignment- For every subtype S:
- The value of this attribute is of type
*universal_integer*, and nonnegative. 13.3/2 - For an object X of subtype S, if S'Alignment is not zero, then X'Alignment is a nonzero integral multiple of S'Alignment unless specified otherwise by a representation item. See 13.3.

X'Alignment- For a
`prefix`

X that denotes an object: 15/2 - The value of this attribute is of type
*universal_integer*, and nonnegative; zero means that the object is not necessarily aligned on a storage element boundary. If X'Alignment is not zero, then X is aligned on a storage unit boundary and X'Address is an integral multiple of X'Alignment (that is, the Address modulo the Alignment is zero). 16/2 *This paragraph was deleted.*See 13.3. 17

S'Base- For every scalar subtype S:
- S'Base denotes an unconstrained subtype of the type of S. This unconstrained subtype is called the
*base subtype*of the type. See 3.5. 19

S'Bit_Order- For every specific record subtype S:
- Denotes the bit ordering for the type of S. The value of this attribute is of type System.Bit_Order. See 13.5.3.

P'Body_Version- For a
`prefix`

P that statically denotes a program unit: 22 - Yields a value of the predefined type String that identifies the version of the compilation unit that contains the body (but not any subunits) of the program unit. See E.3.

T'Callable- For a
`prefix`

T that is of a task type (after any implicit dereference): 24 - Yields the value True when the task denoted by T is
*callable*, and False otherwise; See 9.9. 25

E'Caller- For a
`prefix`

E that denotes an`entry_declaration`

: 26/3 - Yields a value of the type Task_Id that identifies the task whose call is now being serviced. Use of this attribute is allowed only inside an
`accept_statement`

, or`entry_body`

after the`entry_barrier`

, corresponding to the`entry_declaration`

denoted by E. See C.7.1. 27

S'Ceiling- For every subtype S of a floating point type
*T*: 28 - S'Ceiling denotes a function with the following specification:

function S'Ceiling (X : T)
return T

30/5
- The function yields the value ⌈
*X*⌉, that is, the smallest (most negative) integral value greater than or equal to*X*. When*X*is zero, the result has the sign of*X*; a zero result otherwise has a negative sign when S'Signed_Zeros is True. See A.5.3. 31

S'Class- For every subtype S of a tagged type
*T*(specific or class-wide): 32 - S'Class denotes a subtype of the class-wide type (called
*T*'Class in this document) for the class rooted at*T*(or if S already denotes a class-wide subtype, then S'Class is the same as S). 33 - S'Class is unconstrained. However, if S is constrained, then the values of S'Class are only those that when converted to the type
*T*belong to S. See 3.9. 34

S'Class- For every subtype S of an untagged private type whose full view is tagged:
- Denotes the class-wide subtype corresponding to the full view of S. This attribute is allowed only from the beginning of the private part in which the full view is declared, until the declaration of the full view. After the full view, the Class attribute of the full view can be used. See 7.3.1.

X'Component_Size- For a
`prefix`

X that denotes an array subtype or array object (after any implicit dereference): 37 - Denotes the size in bits of components of the type of X. The value of this attribute is of type
*universal_integer*. See 13.3. 38

S'Compose- For every subtype S of a floating point type
*T*: 39 - S'Compose denotes a function with the following specification:

function S'Compose (Fraction : T;
Exponent : universal_integer)
return T

41
- Let
*v*be the value*Fraction*·*T*'Machine_Radix*Exponent*–*k*, where*k*is the normalized exponent of*Fraction*. If*v*is a machine number of the type*T*, or if |*v*| ≥*T*'Model_Small, the function yields*v*; otherwise, it yields either one of the machine numbers of the type*T*adjacent to*v*. Constraint_Error is optionally raised if*v*is outside the base range of S. A zero result has the sign of*Fraction*when S'Signed_Zeros is True. See A.5.3. 42

A'Constrained- For a
`prefix`

A that is of a discriminated type (after any implicit dereference): 43/5 - Yields the value True if A denotes a constant, a value, a tagged object, or a constrained variable, and False otherwise. The value of this attribute is of the predefined type Boolean. See 3.7.2.

S'Copy_Sign- For every subtype S of a floating point type
*T*: 45 - S'Copy_Sign denotes a function with the following specification:

function S'Copy_Sign (Value, Sign : T)
return T

47
- If the value of
*Value*is nonzero, the function yields a result whose magnitude is that of*Value*and whose sign is that of*Sign*; otherwise, it yields the value zero. Constraint_Error is optionally raised if the result is outside the base range of S. A zero result has the sign of*Sign*when S'Signed_Zeros is True. See A.5.3. 48

E'Count- For a
`prefix`

E that denotes an entry of a task or protected unit: 49 - Yields the number of calls presently queued on the entry E of the current instance of the unit. The value of this attribute is of the type
*universal_integer*. See 9.9. 50/1

S'Definite- For a
`prefix`

S that denotes a formal indefinite subtype: 51/3 - S'Definite yields True if the actual subtype corresponding to S is definite; otherwise, it yields False. The value of this attribute is of the predefined type Boolean. See 12.5.1.

S'Delta- For every fixed point subtype S:
- S'Delta denotes the
*delta*of the fixed point subtype S. The value of this attribute is of the type*universal_real*. See 3.5.10. 54

S'Denorm- For every subtype S of a floating point type
*T*: 55 - Yields the value True if every value expressible in the form

±*mantissa*·*T*'Machine_Radix*T*'Machine_Emin

where*mantissa*is a nonzero*T*'Machine_Mantissa-digit fraction in the number base*T*'Machine_Radix, the first digit of which is zero, is a machine number (see 3.5.7) of the type*T*; yields the value False otherwise. The value of this attribute is of the predefined type Boolean. See A.5.3. 56

S'Digits- For every floating point subtype S:
- S'Digits denotes the requested decimal precision for the subtype S. The value of this attribute is of the type
*universal_integer*. See 3.5.8. 58

S'Digits- For every decimal fixed point subtype S:
- S'Digits denotes the
*digits*of the decimal fixed point subtype S, which corresponds to the number of decimal digits that are representable in objects of the subtype. The value of this attribute is of the type*universal_integer*. See 3.5.10. 59.1/5

S'Enum_Rep- For every discrete subtype S:
- S'Enum_Rep denotes a function with the following specification:

function S'Enum_Rep (Arg : S'Base) return universal_integer

59.4/5
- This function returns the representation value of the value of Arg, as a value of type
*universal_integer*. The*representation value*is the internal code specified in an enumeration representation clause, if any, for the type corresponding to the value of Arg, and otherwise is the position number of the value. See 13.4. 59.5/5

S'Enum_Val- For every discrete subtype S:
- S'Enum_Val denotes a function with the following specification:

function S'Enum_Val (Arg : universal_integer) return S'Base

59.8/5
- This function returns a value of the type of S whose representation value equals the value of Arg. For the evaluation of a call on S'Enum_Val, if there is no value in the base range of its type with the given representation value, Constraint_Error is raised. See 13.4.

S'Exponent- For every subtype S of a floating point type
*T*: 61 - S'Exponent denotes a function with the following specification:

function S'Exponent (X : T)
return universal_integer

63
- The function yields the normalized exponent of
*X*. See A.5.3. 64

S'External_Tag- For every subtype S of a tagged type
*T*(specific or class-wide): 65 - S'External_Tag denotes an external string representation for S'Tag; it is of the predefined type String. External_Tag may be specified for a specific tagged type via an
`attribute_definition_clause`

; the expression of such a clause shall be static. The default external tag representation is implementation defined. See 13.13.2. See 13.3. 66/1

A'First- For a
`prefix`

A that is of an array type (after any implicit dereference), or denotes a constrained array subtype: 67 - A'First denotes the lower bound of the first index range; its type is the corresponding index type. See 3.6.2.

S'First- For every scalar subtype S:
- S'First denotes the lower bound of the range of S. The value of this attribute is of the type of S. See 3.5.

A'First(N)- For a
`prefix`

A that is of an array type (after any implicit dereference), or denotes a constrained array subtype: 71 - A'First(N) denotes the lower bound of the N-th index range; its type is the corresponding index type. See 3.6.2.

R.C'First_Bit- For a component C of a composite, non-array object R:
- If the nondefault bit ordering applies to the composite type, and if a
`component_clause`

specifies the placement of C, denotes the value given for the`first_bit`

of the`component_clause`

; otherwise, denotes the offset, from the start of the first of the storage elements occupied by C, of the first bit occupied by C. This offset is measured in bits. The first bit of a storage element is numbered zero. The value of this attribute is of the type*universal_integer*. See 13.5.2. 73.1/4

S'First_Valid- For every static discrete subtype S for which there exists at least one value belonging to S that satisfies the predicates of S:
- S'First_Valid denotes the smallest value that belongs to S and satisfies the predicates of S. The value of this attribute is of the type of S. See 3.5.5.

S'Floor- For every subtype S of a floating point type
*T*: 75 - S'Floor denotes a function with the following specification:

function S'Floor (X : T)
return T

77/5
- The function yields the value ⌊
*X*⌋, that is, the largest (most positive) integral value less than or equal to*X*. When*X*is zero, the result has the sign of*X*; a zero result otherwise has a positive sign. See A.5.3. 78

S'Fore- For every fixed point subtype S:
- S'Fore yields the minimum number of characters needed before the decimal point for the decimal representation of any value of the subtype S, assuming that the representation does not include an exponent, but includes a one-character prefix that is either a minus sign or a space. (This minimum number does not include superfluous zeros or underlines, and is at least 2.) The value of this attribute is of the type
*universal_integer*. See 3.5.10. 80

S'Fraction- For every subtype S of a floating point type
*T*: 81 - S'Fraction denotes a function with the following specification:

function S'Fraction (X : T)
return T

83
- The function yields the value
*X*·*T*'Machine_Radix–*k*, where*k*is the normalized exponent of*X*. A zero result, which can only occur when*X*is zero, has the sign of*X*. See A.5.3. 83.1/3

X'Has_Same_Storage- For a
`prefix`

X that denotes an object: 83.2/4 - X'Has_Same_Storage denotes a function with the following specification:

function X'Has_Same_Storage (Arg : any_type)
return Boolean

83.4/4
- The actual parameter shall be a name that denotes an object. The object denoted by the actual parameter can be of any type. This function evaluates the names of the objects involved. It returns True if the representation of the object denoted by the actual parameter occupies exactly the same bits as the representation of the object denoted by X and the objects occupy at least one bit; otherwise, it returns False. See 13.3.

E'Identity- For a
`prefix`

E that denotes an exception: 85 - E'Identity returns the unique identity of the exception. The type of this attribute is Exception_Id. See 11.4.1.

T'Identity- For a
`prefix`

T that is of a task type (after any implicit dereference): 87 - Yields a value of the type Task_Id that identifies the task denoted by T. See C.7.1.

S'Image- For every subtype S of a type T:
- S'Image denotes a function with the following specification:

function S'Image(Arg : S'Base)
return String

91/5
- S'Image calls S'Put_Image passing
*Arg*(which will typically store a sequence of character values in a text buffer) and then returns the result of retrieving the contents of that buffer with function Get. See 4.10. 91.1/5

X'Image- For a
`prefix`

X of a type T other than*universal_real*or*universal_fixed*: 91.2/5 - X'Image denotes the result of calling function S'Image with
*Arg*being X, where S is the nominal subtype of X. See 4.10. 91.3/5

E'Index- For a
`prefix`

E that denotes an entry declaration of an entry family: 91.4/5 - Within a precondition or postcondition expression for entry family E, denotes the value of the entry index for the call of E. The nominal subtype of this attribute is the entry index subtype. See 6.1.1.

S'Class'Input- For every subtype S'Class of a class-wide type
*T*'Class: 93 - S'Class'Input denotes a function with the following specification:

function S'Class'Input(
Stream : not null access Ada.Streams.Root_Stream_Type'Class)
return T'Class

95/5
- First reads the external tag from
*Stream*and determines the corresponding internal tag (by calling Tags.Descendant_Tag(String'Input(*Stream*), S'Tag) which can raise Tag_Error — see 3.9) and then dispatches to the subprogram denoted by the Input attribute of the specific type identified by the internal tag; returns that result. If the specific type identified by the internal tag is abstract, Constraint_Error is raised. See 13.13.2. 96

S'Input- For every subtype S of a specific type
*T*: 97 - S'Input denotes a function with the following specification:

function S'Input(
Stream : not null access Ada.Streams.Root_Stream_Type'Class)
return T

99
- S'Input reads and returns one value from
*Stream*, using any bounds or discriminants written by a corresponding S'Output to determine how much to read. See 13.13.2. 100/1

A'Last- For a
`prefix`

A that is of an array type (after any implicit dereference), or denotes a constrained array subtype: 101 - A'Last denotes the upper bound of the first index range; its type is the corresponding index type. See 3.6.2.

S'Last- For every scalar subtype S:
- S'Last denotes the upper bound of the range of S. The value of this attribute is of the type of S. See 3.5.

A'Last(N)- For a
`prefix`

A that is of an array type (after any implicit dereference), or denotes a constrained array subtype: 105 - A'Last(N) denotes the upper bound of the N-th index range; its type is the corresponding index type. See 3.6.2.

R.C'Last_Bit- For a component C of a composite, non-array object R:
- If the nondefault bit ordering applies to the composite type, and if a
`component_clause`

specifies the placement of C, denotes the value given for the`last_bit`

of the`component_clause`

; otherwise, denotes the offset, from the start of the first of the storage elements occupied by C, of the last bit occupied by C. This offset is measured in bits. The value of this attribute is of the type*universal_integer*. See 13.5.2. 107.1/4

S'Last_Valid- For every static discrete subtype S for which there exists at least one value belonging to S that satisfies the predicates of S:
- S'Last_Valid denotes the largest value that belongs to S and satisfies the predicates of S. The value of this attribute is of the type of S. See 3.5.5.

S'Leading_Part- For every subtype S of a floating point type
*T*: 109 - S'Leading_Part denotes a function with the following specification:

function S'Leading_Part (X : T;
Radix_Digits : universal_integer)
return T

111
- Let
*v*be the value*T*'Machine_Radix*k*–*Radix_Digits*, where*k*is the normalized exponent of*X*. The function yields the value

- ⌊
*X*/*v*⌋ ·*v*, when*X*is nonnegative and*Radix_Digits*is positive; 113 - ⌈
*X*/*v*⌉ ·*v*, when*X*is negative and*Radix_Digits*is positive.

- Constraint_Error is raised when
*Radix_Digits*is zero or negative. A zero result, which can only occur when*X*is zero, has the sign of*X*. See A.5.3. 115/1

A'Length- For a
`prefix`

A that is of an array type (after any implicit dereference), or denotes a constrained array subtype: 116 - A'Length denotes the number of values of the first index range (zero for a null range); its type is
*universal_integer*. See 3.6.2. 117/1

A'Length(N)- For a
`prefix`

A that is of an array type (after any implicit dereference), or denotes a constrained array subtype: 118 - A'Length(N) denotes the number of values of the N-th index range (zero for a null range); its type is
*universal_integer*. See 3.6.2. 119

S'Machine- For every subtype S of a floating point type
*T*: 120 - S'Machine denotes a function with the following specification:

function S'Machine (X : T)
return T

122
- If
*X*is a machine number of the type*T*, the function yields*X*; otherwise, it yields the value obtained by rounding or truncating*X*to either one of the adjacent machine numbers of the type*T*. Constraint_Error is raised if rounding or truncating*X*to the precision of the machine numbers results in a value outside the base range of S. A zero result has the sign of*X*when S'Signed_Zeros is True. See A.5.3. 123

S'Machine_Emax- For every subtype S of a floating point type
*T*: 124 - Yields the largest (most positive) value of
*exponent*such that every value expressible in the canonical form (for the type*T*), having a*mantissa*of*T*'Machine_Mantissa digits, is a machine number (see 3.5.7) of the type*T*. This attribute yields a value of the type*universal_integer*. See A.5.3. 125

S'Machine_Emin- For every subtype S of a floating point type
*T*: 126 - Yields the smallest (most negative) value of
*exponent*such that every value expressible in the canonical form (for the type*T*), having a*mantissa*of*T*'Machine_Mantissa digits, is a machine number (see 3.5.7) of the type*T*. This attribute yields a value of the type*universal_integer*. See A.5.3. 127

S'Machine_Mantissa- For every subtype S of a floating point type
*T*: 128 - Yields the largest value of
*p*such that every value expressible in the canonical form (for the type*T*), having a*p*-digit*mantissa*and an*exponent*between*T*'Machine_Emin and*T*'Machine_Emax, is a machine number (see 3.5.7) of the type*T*. This attribute yields a value of the type*universal_integer*. See A.5.3. 129

S'Machine_Overflows- For every subtype S of a floating point type
*T*: 130 - Yields the value True if overflow and divide-by-zero are detected and reported by raising Constraint_Error for every predefined operation that yields a result of the type
*T*; yields the value False otherwise. The value of this attribute is of the predefined type Boolean. See A.5.3. 131

S'Machine_Overflows- For every subtype S of a fixed point type
*T*: 132 - Yields the value True if overflow and divide-by-zero are detected and reported by raising Constraint_Error for every predefined operation that yields a result of the type
*T*; yields the value False otherwise. The value of this attribute is of the predefined type Boolean. See A.5.4. 133

S'Machine_Radix- For every subtype S of a floating point type
*T*: 134 - Yields the radix of the hardware representation of the type
*T*. The value of this attribute is of the type*universal_integer*. See A.5.3. 135

S'Machine_Radix- For every subtype S of a fixed point type
*T*: 136 - Yields the radix of the hardware representation of the type
*T*. The value of this attribute is of the type*universal_integer*. See A.5.4. 136.1/2

S'Machine_Rounding- For every subtype S of a floating point type
*T*: 136.2/2 - S'Machine_Rounding denotes a function with the following specification:

function S'Machine_Rounding (X : T)
return T

136.4/2
- The function yields the integral value nearest to
*X*. If*X*lies exactly halfway between two integers, one of those integers is returned, but which of them is returned is unspecified. A zero result has the sign of*X*when S'Signed_Zeros is True. This function provides access to the rounding behavior which is most efficient on the target processor. See A.5.3. 137

S'Machine_Rounds- For every subtype S of a floating point type
*T*: 138 - Yields the value True if rounding is performed on inexact results of every predefined operation that yields a result of the type
*T*; yields the value False otherwise. The value of this attribute is of the predefined type Boolean. See A.5.3. 139

S'Machine_Rounds- For every subtype S of a fixed point type
*T*: 140 - Yields the value True if rounding is performed on inexact results of every predefined operation that yields a result of the type
*T*; yields the value False otherwise. The value of this attribute is of the predefined type Boolean. See A.5.4. 141

S'Max- For every scalar subtype S:
- S'Max denotes a function with the following specification:

function S'Max(Left, Right : S'Base)
return S'Base

144
- The function returns the greater of the values of the two parameters. See 3.5.

S'Max_Alignment_For_Allocation- For every subtype S:
- Denotes the maximum value for Alignment that can be requested by the implementation via Allocate for an access type whose designated subtype is S. The value of this attribute is of type
*universal_integer*. See 13.11.1. 145

S'Max_Size_In_Storage_Elements- For every subtype S:
- Denotes the maximum value for Size_In_Storage_Elements that can be requested by the implementation via Allocate for an access type whose designated subtype is S. The value of this attribute is of type
*universal_integer*. See 13.11.1. 147

S'Min- For every scalar subtype S:
- S'Min denotes a function with the following specification:

function S'Min(Left, Right : S'Base)
return S'Base

150
- The function returns the lesser of the values of the two parameters. See 3.5.

S'Mod- For every modular subtype S:
- S'Mod denotes a function with the following specification:

function S'Mod (Arg : universal_integer)
return S'Base

150.4/2
- This function returns
*Arg***mod**S'Modulus, as a value of the type of S. See 3.5.4. 151

S'Model- For every subtype S of a floating point type
*T*: 152 - S'Model denotes a function with the following specification:

function S'Model (X : T)
return T

154
- If the Numerics Annex is not supported, the meaning of this attribute is implementation defined; see G.2.2 for the definition that applies to implementations supporting the Numerics Annex. See A.5.3.

S'Model_Emin- For every subtype S of a floating point type
*T*: 156 - If the Numerics Annex is not supported, this attribute yields an implementation defined value that is greater than or equal to the value of
*T*'Machine_Emin. See G.2.2 for further requirements that apply to implementations supporting the Numerics Annex. The value of this attribute is of the type*universal_integer*. See A.5.3. 157

S'Model_Epsilon- For every subtype S of a floating point type
*T*: 158 - Yields the value
*T*'Machine_Radix1 –*T*'Model_Mantissa. The value of this attribute is of the type*universal_real*. See A.5.3. 159

S'Model_Mantissa- For every subtype S of a floating point type
*T*: 160 - If the Numerics Annex is not supported, this attribute yields an implementation defined value that is greater than or equal to ⌈
*d*· log(10) / log(*T*'Machine_Radix)⌉ + 1, where*d*is the requested decimal precision of*T*, and less than or equal to the value of*T*'Machine_Mantissa. See G.2.2 for further requirements that apply to implementations supporting the Numerics Annex. The value of this attribute is of the type*universal_integer*. See A.5.3. 161

S'Model_Small- For every subtype S of a floating point type
*T*: 162 - Yields the value
*T*'Machine_Radix*T*'Model_Emin – 1. The value of this attribute is of the type*universal_real*. See A.5.3. 163

S'Modulus- For every modular subtype S:
- S'Modulus yields the modulus of the type of S, as a value of the type
*universal_integer*. See 3.5.4. 164.1/5

S'Object_Size- For every subtype S:
- If S is definite, denotes the size (in bits) of a stand-alone aliased object, or a component of subtype S in the absence of an
`aspect_specification`

or representation item that specifies the size of the object or component. If S is indefinite, the meaning is implementation-defined. The value of this attribute is of the type*universal_integer*. See 13.3. 164.3/3

X'Old- For a
`prefix`

X that denotes an object of a nonlimited type: 164.4/5 - Each X'Old in a postcondition expression that is enabled, other than those that occur in subexpressions that are determined to be unevaluated, denotes a constant that is implicitly declared at the beginning of the subprogram body, entry body, or accept statement. See 6.1.1.

S'Class'Output- For every subtype S'Class of a class-wide type
*T*'Class: 166 - S'Class'Output denotes a procedure with the following specification:

procedure S'Class'Output(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in T'Class)

168/2
- First writes the external tag of
*Item*to*Stream*(by calling String'Output(*Stream*, Tags.External_Tag(*Item*'Tag)) — see 3.9) and then dispatches to the subprogram denoted by the Output attribute of the specific type identified by the tag. Tag_Error is raised if the tag of Item identifies a type declared at an accessibility level deeper than that of S. See 13.13.2. 169

S'Output- For every subtype S of a specific type
*T*: 170 - S'Output denotes a procedure with the following specification:

procedure S'Output(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in T)

172
- S'Output writes the value of
*Item*to*Stream*, including any bounds or discriminants. See 13.13.2. 172.1/3

X'Overlaps_Storage- For a
`prefix`

X that denotes an object: 172.2/3 - X'Overlaps_Storage denotes a function with the following specification:

function X'Overlaps_Storage (Arg : any_type)
return Boolean

172.4/3
- The actual parameter shall be a name that denotes an object. The object denoted by the actual parameter can be of any type. This function evaluates the names of the objects involved and returns True if the representation of the object denoted by the actual parameter shares at least one bit with the representation of the object denoted by X; otherwise, it returns False. See 13.3.

X'Parallel_Reduce(Reducer, Initial_Value)- For a
`prefix`

X of an array type (after any implicit dereference), or that denotes an iterable container object (see 5.5.1): 172.6/5 - X'Parallel_Reduce is a reduction expression that yields a result equivalent to replacing the attribute
`identifier`

with Reduce and the`prefix`

of the attribute with the`value_sequence`

:

[parallel for Item of X => Item]

172.8/5
- See 4.5.10.

D'Partition_Id- For a
`prefix`

D that denotes a library-level declaration, excepting a declaration of or within a declared-pure library unit: 174 - Denotes a value of the type
*universal_integer*that identifies the partition in which D was elaborated. If D denotes the declaration of a remote call interface library unit (see E.2.3) the given partition is the one where the body of D was elaborated. See E.1. 175

S'Pos- For every discrete subtype S:
- S'Pos denotes a function with the following specification:

function S'Pos(Arg : S'Base)
return universal_integer

178
- This function returns the position number of the value of
*Arg*, as a value of type*universal_integer*. See 3.5.5. 179

R.C'Position- For a component C of a composite, non-array object R:
- If the nondefault bit ordering applies to the composite type, and if a
`component_clause`

specifies the placement of C, denotes the value given for the`position`

of the`component_clause`

; otherwise, denotes the same value as R.C'Address – R'Address. The value of this attribute is of the type*universal_integer*. See 13.5.2. 181

S'Pred- For every scalar subtype S:
- S'Pred denotes a function with the following specification:

function S'Pred(Arg : S'Base)
return S'Base

184
- For an enumeration type, the function returns the value whose position number is one less than that of the value of
*Arg*; Constraint_Error is raised if there is no such value of the type. For an integer type, the function returns the result of subtracting one from the value of*Arg*. For a fixed point type, the function returns the result of subtracting*small*from the value of*Arg*. For a floating point type, the function returns the machine number (as defined in 3.5.7) immediately below the value of*Arg*; Constraint_Error is raised if there is no such machine number. See 3.5. 184.1/5

S'Preelaborable_Initialization- For a nonformal composite subtype S declared within the visible part of a package or a generic package, or a generic formal private subtype or formal derived subtype:
- This attribute is of Boolean type, and its value reflects whether the type of S has preelaborable initialization. See 10.2.1.

P'Priority- For a
`prefix`

P that denotes a protected object: 184.4/2 - Denotes a non-aliased component of the protected object P. This component is of type System.Any_Priority and its value is the priority of P. P'Priority denotes a variable if and only if P denotes a variable. A reference to this attribute shall appear only within the body of P. See D.5.2.

S'Put_Image- For every subtype S of a type T other than
*universal_real*or*universal_fixed*: 184.6/5 - S'Put_Image denotes a procedure with the following specification:

procedure S'Put_Image
(Buffer : in out
Ada.Strings.Text_Buffers.Root_Buffer_Type'Class;
Arg : in T);

184.8/5
- The default implementation of S'Put_Image writes (using Wide_Wide_Put) an
*image*of the value of*Arg*. See 4.10. 185/1

A'Range- For a
`prefix`

A that is of an array type (after any implicit dereference), or denotes a constrained array subtype: 186 - A'Range is equivalent to the range A'First .. A'Last, except that the
`prefix`

A is only evaluated once. See 3.6.2. 187

S'Range- For every scalar subtype S:
- S'Range is equivalent to the
`range`

S'First .. S'Last. See 3.5. 189/1

A'Range(N)- For a
`prefix`

A that is of an array type (after any implicit dereference), or denotes a constrained array subtype: 190 - A'Range(N) is equivalent to the range A'First(N) .. A'Last(N), except that the
`prefix`

A is only evaluated once. See 3.6.2. 191

S'Class'Read- For every subtype S'Class of a class-wide type
*T*'Class: 192 - S'Class'Read denotes a procedure with the following specification:

procedure S'Class'Read(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : out T'Class)

194
- Dispatches to the subprogram denoted by the Read attribute of the specific type identified by the tag of Item. See 13.13.2.

S'Read- For every subtype S of a specific type
*T*: 196 - S'Read denotes a procedure with the following specification:

procedure S'Read(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : out T)

198
- S'Read reads the value of
*Item*from*Stream*. See 13.13.2. 198.1/5

V'Reduce(Reducer, Initial_Value)- For a
`value_sequence`

V: 198.2/5 - This attribute represents a
*reduction expression*, and is in the form of a`reduction_attribute_reference`

. See 4.5.10. 198.3/5

X'Reduce(Reducer, Initial_Value)- For a
`prefix`

X of an array type (after any implicit dereference), or that denotes an iterable container object (see 5.5.1): 198.4/5 - X'Reduce is a reduction expression that yields a result equivalent to replacing the
`prefix`

of the attribute with the`value_sequence`

:

[for Item of X => Item]

198.6/5
- See 4.5.10.

P'Relative_Deadline- For a
`prefix`

P that denotes a protected object: 198.8/5 - Denotes a non-aliased component of the protected object P. This component is of type Ada.Real_Time.Time_Span and its value is the relative deadline of P. P'Relative_Deadline denotes a variable if and only if P denotes a variable. A reference to this attribute shall appear only within the body of P. See D.5.2.

S'Remainder- For every subtype S of a floating point type
*T*: 200 - S'Remainder denotes a function with the following specification:

function S'Remainder (X, Y : T)
return T

202
- For nonzero
*Y*, let*v*be the value*X*–*n*·*Y*, where*n*is the integer nearest to the exact value of*X*/*Y*; if |*n*–*X*/*Y*| = 1/2, then*n*is chosen to be even. If*v*is a machine number of the type*T*, the function yields*v*; otherwise, it yields zero. Constraint_Error is raised if*Y*is zero. A zero result has the sign of*X*when S'Signed_Zeros is True. See A.5.3. 202.1/3

F'Result- For a
`prefix`

F that denotes a function declaration or an access-to-function type: 202.2/5 - Within a postcondition expression for F, denotes the return object of the function call for which the postcondition expression is evaluated. The type of this attribute is that of the result subtype of the function or access-to-function type except within a Post'Class postcondition expression for a function with a controlling result or with a controlling access result; in those cases the type of the attribute is described above as part of the Name Resolution Rules for Post'Class. See 6.1.1.

S'Round- For every decimal fixed point subtype S:
- S'Round denotes a function with the following specification:

function S'Round(X : universal_real)
return S'Base

206
- The function returns the value obtained by rounding X (away from 0, if X is midway between two values of the type of S). See 3.5.10.

S'Rounding- For every subtype S of a floating point type
*T*: 208 - S'Rounding denotes a function with the following specification:

function S'Rounding (X : T)
return T

210
- The function yields the integral value nearest to
*X*, rounding away from zero if*X*lies exactly halfway between two integers. A zero result has the sign of*X*when S'Signed_Zeros is True. See A.5.3. 211

S'Safe_First- For every subtype S of a floating point type
*T*: 212 - Yields the lower bound of the safe range (see 3.5.7) of the type
*T*. If the Numerics Annex is not supported, the value of this attribute is implementation defined; see G.2.2 for the definition that applies to implementations supporting the Numerics Annex. The value of this attribute is of the type*universal_real*. See A.5.3. 213

S'Safe_Last- For every subtype S of a floating point type
*T*: 214 - Yields the upper bound of the safe range (see 3.5.7) of the type
*T*. If the Numerics Annex is not supported, the value of this attribute is implementation defined; see G.2.2 for the definition that applies to implementations supporting the Numerics Annex. The value of this attribute is of the type*universal_real*. See A.5.3. 215

S'Scale- For every decimal fixed point subtype S:
- S'Scale denotes the
*scale*of the subtype S, defined as the value N such that S'Delta = 10.0**(–N). The scale indicates the position of the point relative to the rightmost significant digits of values of subtype S. The value of this attribute is of the type*universal_integer*. See 3.5.10. 217

S'Scaling- For every subtype S of a floating point type
*T*: 218 - S'Scaling denotes a function with the following specification:

function S'Scaling (X : T;
Adjustment : universal_integer)
return T

220
- Let
*v*be the value*X*·*T*'Machine_Radix*Adjustment*. If*v*is a machine number of the type*T*, or if |*v*| ≥*T*'Model_Small, the function yields*v*; otherwise, it yields either one of the machine numbers of the type*T*adjacent to*v*. Constraint_Error is optionally raised if*v*is outside the base range of S. A zero result has the sign of*X*when S'Signed_Zeros is True. See A.5.3. 221

S'Signed_Zeros- For every subtype S of a floating point type
*T*: 222 - Yields the value True if the hardware representation for the type
*T*has the capability of representing both positively and negatively signed zeros, these being generated and used by the predefined operations of the type*T*as specified in IEC 559:1989; yields the value False otherwise. The value of this attribute is of the predefined type Boolean. See A.5.3. 223

S'Size- For every subtype S:
- If S is definite, denotes the size (in bits) that the implementation would choose for the following objects of subtype S:

- A record component of subtype S when the record type is packed.
- The formal parameter of an instance of Unchecked_Conversion that converts from subtype S to some other subtype.

- If S is indefinite, the meaning is implementation defined. The value of this attribute is of the type
*universal_integer*. See 13.3. 228/1

X'Size- For a
`prefix`

X that denotes an object: 229 - Denotes the size in bits of the representation of the object. The value of this attribute is of the type
*universal_integer*. See 13.3. 230

S'Small- For every fixed point subtype S:
- S'Small denotes the
*small*of the type of S. The value of this attribute is of the type*universal_real*. See 3.5.10. 232

S'Storage_Pool- For every access-to-object subtype S:
- Denotes the storage pool of the type of S. The type of this attribute is Root_Storage_Pool'Class. See 13.11.

S'Storage_Size- For every access-to-object subtype S:
- Yields the result of calling Storage_Size(S'Storage_Pool), which is intended to be a measure of the number of storage elements reserved for the pool. The type of this attribute is
*universal_integer*. See 13.11. 236/1

T'Storage_Size- For a
`prefix`

T that denotes a task object (after any implicit dereference): 237 - Denotes the number of storage elements reserved for the task. The value of this attribute is of the type
*universal_integer*. The Storage_Size includes the size of the task's stack, if any. The language does not specify whether or not it includes other storage associated with the task (such as the “task control block” used by some implementations.) See 13.3. 237.1/2

S'Stream_Size- For every subtype S of an elementary type
*T*: 237.2/3 - Denotes the number of bits read from or written to a stream by the default implementations of S'Read and S'Write. Hence, the number of stream elements required per item of elementary type
*T*is:

T'Stream_Size / Ada.Streams.Stream_Element'Size

237.4/2
- The value of this attribute is of type
*universal_integer*and is a multiple of Stream_Element'Size. See 13.13.2. 238

S'Succ- For every scalar subtype S:
- S'Succ denotes a function with the following specification:

function S'Succ(Arg : S'Base)
return S'Base

241
- For an enumeration type, the function returns the value whose position number is one more than that of the value of
*Arg*; Constraint_Error is raised if there is no such value of the type. For an integer type, the function returns the result of adding one to the value of*Arg*. For a fixed point type, the function returns the result of adding*small*to the value of*Arg*. For a floating point type, the function returns the machine number (as defined in 3.5.7) immediately above the value of*Arg*; Constraint_Error is raised if there is no such machine number. See 3.5. 242

S'Tag- For every subtype S of a tagged type
*T*(specific or class-wide): 243 - S'Tag denotes the tag of the type
*T*(or if*T*is class-wide, the tag of the root type of the corresponding class). The value of this attribute is of type Tag. See 3.9. 244

X'Tag- For a
`prefix`

X that is of a class-wide tagged type (after any implicit dereference): 245 - X'Tag denotes the tag of X. The value of this attribute is of type Tag. See 3.9.

T'Terminated- For a
`prefix`

T that is of a task type (after any implicit dereference): 247 - Yields the value True if the task denoted by T is terminated, and False otherwise. The value of this attribute is of the predefined type Boolean. See 9.9.

S'Truncation- For every subtype S of a floating point type
*T*: 249 - S'Truncation denotes a function with the following specification:

function S'Truncation (X : T)
return T

251
- The function yields the value ⌈
*X*⌉ when*X*is negative, and ⌊*X*⌋ otherwise. A zero result has the sign of*X*when S'Signed_Zeros is True. See A.5.3. 252

S'Unbiased_Rounding- For every subtype S of a floating point type
*T*: 253 - S'Unbiased_Rounding denotes a function with the following specification:

function S'Unbiased_Rounding (X : T)
return T

255
- The function yields the integral value nearest to
*X*, rounding toward the even integer if*X*lies exactly halfway between two integers. A zero result has the sign of*X*when S'Signed_Zeros is True. See A.5.3. 256

X'Unchecked_Access- For a
`prefix`

X that denotes an aliased view of an object: 257 - All rules and semantics that apply to X'Access (see 3.10.2) apply also to X'Unchecked_Access, except that, for the purposes of accessibility rules and checks, it is as if X were declared immediately within a library package. See 13.10.

S'Val- For every discrete subtype S:
- S'Val denotes a function with the following specification:

function S'Val(Arg : universal_integer)
return S'Base

261
- This function returns a value of the type of S whose position number equals the value of
*Arg*. See 3.5.5. 262

X'Valid- For a
`prefix`

X that denotes a scalar object (after any implicit dereference): 263/4 - Yields True if and only if the object denoted by X is normal, has a valid representation, and then, if the preceding conditions hold, the value of X also satisfies the predicates of the nominal subtype of X. The value of this attribute is of the predefined type Boolean. See 13.9.2.

S'Value- For every scalar subtype S:
- S'Value denotes a function with the following specification:

function S'Value(Arg : String)
return S'Base

267
- This function returns a value given an image of the value as a String, ignoring any leading or trailing spaces. See 3.5.

P'Version- For a
`prefix`

P that statically denotes a program unit: 269 - Yields a value of the predefined type String that identifies the version of the compilation unit that contains the declaration of the program unit. See E.3.

S'Wide_Image- For every subtype S of a type T:
- S'Wide_Image denotes a function with the following specification:

function S'Wide_Image(Arg : S'Base)
return Wide_String

273/5
- S'Wide_Image calls S'Put_Image passing
*Arg*(which will typically store a sequence of character values in a text buffer) and then returns the result of retrieving the contents of that buffer with function Wide_Get. See 4.10. 273.1/5

X'Wide_Image- For a
`prefix`

X of a type T other than*universal_real*or*universal_fixed*: 273.2/5 - X'Wide_Image denotes the result of calling function S'Wide_Image with
*Arg*being X, where S is the nominal subtype of X. See 4.10. 274

S'Wide_Value- For every scalar subtype S:
- S'Wide_Value denotes a function with the following specification:

function S'Wide_Value(Arg : Wide_String)
return S'Base

277
- This function returns a value given an image of the value as a Wide_String, ignoring any leading or trailing spaces. See 3.5.

S'Wide_Wide_Image- For every subtype S of a type T:
- S'Wide_Wide_Image denotes a function with the following specification:

function S'Wide_Wide_Image(Arg : S'Base)
return Wide_Wide_String

277.4/5
- S'Wide_Wide_Image calls S'Put_Image passing
*Arg*(which will typically store a sequence of character values in a text buffer) and then returns the result of retrieving the contents of that buffer with function Wide_Wide_Get. See 4.10. 277.5/5

X'Wide_Wide_Image- For a
`prefix`

X of a type T other than*universal_real*or*universal_fixed*: 277.6/5 - X'Wide_Wide_Image denotes the result of calling function S'Wide_Wide_Image with
*Arg*being X, where S is the nominal subtype of X. See 4.10. 277.7/2

S'Wide_Wide_Value- For every scalar subtype S:
- S'Wide_Wide_Value denotes a function with the following specification:

function S'Wide_Wide_Value(Arg : Wide_Wide_String)
return S'Base

277.10/2
- This function returns a value given an image of the value as a Wide_Wide_String, ignoring any leading or trailing spaces. See 3.5.

S'Wide_Wide_Width- For every scalar subtype S:
- S'Wide_Wide_Width denotes the maximum length of a Wide_Wide_String returned by S'Wide_Wide_Image over all values of the subtype S, assuming a default implementation of S'Put_Image. It denotes zero for a subtype that has a null range. Its type is
*universal_integer*. See 3.5. 278

S'Wide_Width- For every scalar subtype S:
- S'Wide_Width denotes the maximum length of a Wide_String returned by S'Wide_Image over all values of the subtype S, assuming a default implementation of S'Put_Image. It denotes zero for a subtype that has a null range. Its type is
*universal_integer*. See 3.5. 280

S'Width- For every scalar subtype S:
- S'Width denotes the maximum length of a String returned by S'Image over all values of the subtype S, assuming a default implementation of S'Put_Image. It denotes zero for a subtype that has a null range. Its type is
*universal_integer*. See 3.5. 282

S'Class'Write- For every subtype S'Class of a class-wide type
*T*'Class: 283 - S'Class'Write denotes a procedure with the following specification:

procedure S'Class'Write(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in T'Class)

285
- Dispatches to the subprogram denoted by the Write attribute of the specific type identified by the tag of Item. See 13.13.2.

S'Write- For every subtype S of a specific type
*T*: 287 - S'Write denotes a procedure with the following specification:

procedure S'Write(
Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in T)

289
- S'Write writes the value of
*Item*to*Stream*. See 13.13.2.