{*AI05-0229-1*}
{*AI05-0299-1*}
This subclause annex
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:

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.

X'Access

For a prefix
X that denotes an aliased view of an object:

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 prefix
X that denotes an object, program unit, or label:

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.

S'Adjacent

For every subtype S of a floating point type *T*:

S'Adjacent
denotes a function with the following specification:

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.

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.

S'Alignment

For every subtype S:

The value of this
attribute is of type *universal_integer*, and nonnegative.

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

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 The Address
of an object that is allocated under control of the implementation
is an integral multiple of X'Alignment the
Alignment of the object (that is, the Address modulo the Alignment
is zero).The offset of a record component is a
multiple of the Alignment of the component. For an object that is not
allocated under control of the implementation (that is, one that is imported,
that is allocated by a user-defined allocator, whose Address has been
specified, or is designated by an access value returned by an instance
of Unchecked_Conversion), the implementation may assume that the Address
is an integral multiple of its Alignment. The implementation shall not
assume a stricter alignment.

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.

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

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):

Yields the value True when the task denoted
by T is *callable*, and False otherwise; See 9.9.

E'Caller

For a prefix
E that denotes an entry_declaration:

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 entry_body
or accept_statement,
or entry_body
after the entry_barrier,
corresponding to the entry_declaration
denoted by E. See C.7.1.

S'Ceiling

For every subtype S of a floating point type *T*:

S'Ceiling
denotes a function with the following specification:

The function yields the value *Ceiling*(*X*),
i.e., 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.

S'Class

For every subtype S of a tagged type *T* (specific or class-wide):

S'Class denotes a subtype of the class-wide
type (called *T*'Class in this International Standard) for the class
rooted at *T* (or if S already denotes a class-wide subtype, then
S'Class is the same as S).

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.

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 prefix X that denotes an array subtype or array object (after any implicit dereference):

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.

S'Compose

For every subtype S of a floating point type *T*:

S'Compose
denotes a function with the following specification:

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.

A'Constrained

For a prefix
A that is of a discriminated type (after any implicit dereference):

Yields the value True if A denotes a constant,
a value, a tagged object, or a constrained
variable, and False otherwise. See 3.7.2.

S'Copy_Sign

For every subtype S of a floating point type *T*:

S'Copy_Sign
denotes a function with the following specification:

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.

E'Count

For a prefix
E that denotes an entry of a task or protected unit:

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.

S'Definite

For a prefix prefix
S that denotes a formal indefinite subtype:

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.

S'Denorm

For every subtype S of a floating point type *T*:

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.

±

where

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.

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.

S'Exponent

For every subtype S of a floating point type *T*:

S'Exponent
denotes a function with the following specification:

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

S'External_Tag

For every subtype S of a tagged type

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
3.9.2 and 13.13.2.
See 13.3.

A'First

For a prefix prefix
A that is of an array type (after any implicit dereference), or denotes
a constrained array subtype:

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 prefix
A that is of an array type (after any implicit dereference), or denotes
a constrained array subtype:

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 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.

S'First_Valid

For every static discrete subtype S for which there exists at least one value belonging to S that satisfies any predicate of S:

S'First_Valid denotes
the smallest value that belongs to S and satisfies the predicate 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*:

S'Floor denotes
a function with the following specification:

The function yields the value *Floor*(*X*),
i.e., 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.

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.

S'Fraction

For every subtype S of a floating point type *T*:

S'Fraction
denotes a function with the following specification:

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.

X'Has_Same_Storage

For a prefix X that denotes an object:

X'Has_Same_Storage
denotes a function with the following specification:

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 occupies exactly the same bits as the
representation of the object denoted by X; otherwise, it returns False.
See 13.3.

E'Identity

For a prefix prefix
E that denotes an exception:

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):

Yields a value of the type Task_Id that
identifies the task denoted by T. See C.7.1.

S'Image

For every scalar subtype S:

S'Image denotes
a function with the following specification:

The function returns an image of the value
of *Arg* as a String. See 3.5.

S'Class'Input

For every subtype S'Class of a class-wide type *T*'Class:

S'Class'Input
denotes a function with the following specification:

First reads the external tag from *Stream*
and determines the corresponding internal tag (by calling Tags.Descendant_Tag Internal_Tag(String'Input(*Stream*),
S'Tag) which might 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
not covered by *T*'Class or is
abstract, Constraint_Error is raised. See 13.13.2.

S'Input

For every subtype S of a specific type *T*:

S'Input denotes
a function with the following specification:

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.

A'Last

For a prefix prefix
A that is of an array type (after any implicit dereference), or denotes
a constrained array subtype:

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)

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 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.

S'Last_Valid

For every static discrete subtype S for which there exists at least one value belonging to S that satisfies any predicate of S:

S'Last_Valid denotes
the largest value that belongs to S and satisfies the predicate 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

S'Leading_Part
denotes a function with the following specification:

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

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.

A'Length

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.

A'Length(N)

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.

S'Machine

For every subtype S of a floating point type *T*:

S'Machine
denotes a function with the following specification:

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.

S'Machine_Emax

For every subtype S of a floating point type

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.

S'Machine_Emin

For every subtype S of a floating point type

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.

S'Machine_Mantissa

For every subtype S of a floating point type

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.

S'Machine_Overflows

For every subtype S of a floating point type

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.

S'Machine_Overflows

For every subtype S of a fixed point type

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.

S'Machine_Radix

For every subtype S of a floating point type

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.

S'Machine_Radix

For every subtype S of a fixed point type

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.

S'Machine_Rounding

For every subtype S of a floating point type

S'Machine_Rounding
denotes a function with the following specification:

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.

S'Machine_Rounds

For every subtype S of a floating point type

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.

S'Machine_Rounds

For every subtype S of a fixed point type

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.

S'Max

For every scalar subtype S:

S'Max denotes
a function with the following specification:

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 could 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.

S'Max_Size_In_Storage_Elements

For every subtype S:

Denotes the maximum value for Size_In_Storage_Elements
that could will
be requested by the implementation via Allocate
for an access type whose designated subtype is S. For a type with access discriminants, if the implementation allocates
space for a coextension in the same pool as that of the object having
the access discriminant, then this accounts for any calls on Allocate
that could be performed to provide space for such coextensions.
The value of this attribute is of type *universal_integer*. See
13.11.1.

S'Min

For every scalar subtype S:

S'Min denotes
a function with the following specification:

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:

This function returns
*Arg* **mod** S'Modulus, as a value of the type of S.
See 3.5.4.

S'Model

For every subtype S of a floating point type *T*:

S'Model denotes
a function with the following specification:

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*:

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.

S'Model_Epsilon

For every subtype S of a floating point type

Yields the value *T*'Machine_Radix^{1
– T'Model_Mantissa}.
The value of this attribute is of the type *universal_real*. See
A.5.3.

S'Model_Mantissa

For every subtype S of a floating point type

If the Numerics Annex is not supported,
this attribute yields an implementation defined value that is greater
than or equal to *Ceiling*(*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.

S'Model_Small

For every subtype S of a floating point type

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.

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.

X'Old

For a prefix
X that denotes an object of a nonlimited type:

For each X'Old in
a postcondition expression that is enabled, a constant is implicitly
declared at the beginning of the subprogram or entry. The constant is
of the type of X and is initialized to the result of evaluating X (as
an expression) at the point of the constant declaration. The value of
X'Old in the postcondition expression is the value of this constant;
the type of X'Old is the type of X. These implicit constant declarations
occur in an arbitrary order. See 6.1.1.

S'Class'Output

For every subtype S'Class of a class-wide type

S'Class'Output
denotes a procedure with the following specification:

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.

S'Output

For every subtype S of a specific type *T*:

S'Output
denotes a procedure with the following specification:

X'Overlaps_Storage

For a prefix X that denotes an object:

X'Overlaps_Storage
denotes a function with the following specification:

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.

D'Partition_Id

For a prefix prefix D that denotes a library-level declaration, excepting a declaration of or within a declared-pure library unit:

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.

S'Pos

For every discrete subtype S:

S'Pos denotes
a function with the following specification:

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

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 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.

S'Pred

For every scalar subtype S:

S'Pred denotes
a function with the following specification:

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.

P'Priority

For a prefix P that denotes a protected object:

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.

A'Range

A'Range is equivalent to the range A'First
.. A'Last, except that the prefix
A is only evaluated once. See 3.6.2.

S'Range

For every scalar subtype S:

A'Range(N)

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.

S'Class'Read

For every subtype S'Class of a class-wide type *T*'Class:

S'Class'Read
denotes a procedure with the following specification:

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*:

S'Read denotes
a procedure with the following specification:

S'Remainder

For every subtype S of a floating point type *T*:

S'Remainder
denotes a function with the following specification:

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.

F'Result

For a prefix
F that denotes a function declaration:

Within a postcondition
expression for function F, denotes the result object of the function.
The type of this attribute is that of the function result except within
a Post'Class postcondition expression for a function with a controlling
result or with a controlling access result. For a controlling result,
the type of the attribute is *T*'Class, where *T* is the function
result type. For a controlling access result, the type of the attribute
is an anonymous access type whose designated type is *T*'Class,
where *T* is the designated type of the function result type.
See 6.1.1.

S'Round

For every decimal fixed point subtype S:

S'Round denotes
a function with the following specification:

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*:

S'Rounding
denotes a function with the following specification:

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.

S'Safe_First

For every subtype S of a floating point type *T*:

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.

S'Safe_Last

For every subtype S of a floating point type *T*:

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.

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.

S'Scaling

For every subtype S of a floating point type *T*:

S'Scaling
denotes a function with the following specification:

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.

S'Signed_Zeros

For every subtype S of a floating point type

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.

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.

X'Size

For a prefix prefix
X that denotes an object:

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.

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.

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.

T'Storage_Size

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.

S'Stream_Size

For every subtype S of an elementary type

Denotes
the number of bits read from or written
to a stream by the default implementations of S'Read and S'Write occupied
in a stream by items of subtype S.
Hence, the number of stream elements required per item of elementary
type *T* is:

The value of this
attribute is of type *universal_integer* and is a multiple of Stream_Element'Size.
See 13.13.2.

S'Succ

For every scalar subtype S:

S'Succ denotes
a function with the following specification:

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.

S'Tag

For every subtype S of a tagged type *T* (specific or class-wide):

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.

X'Tag

For a prefix
X that is of a class-wide tagged type (after any implicit dereference):

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):

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*:

S'Truncation
denotes a function with the following specification:

The function yields the value *Ceiling*(*X*)
when *X* is negative, and *Floor*(*X*)
otherwise. A zero result has the sign of *X* when S'Signed_Zeros
is True. See A.5.3.

S'Unbiased_Rounding

For every subtype S of a floating point type

S'Unbiased_Rounding
denotes a function with the following specification:

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.

X'Unchecked_Access

For a prefix X that denotes an aliased view of an object:

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:

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

X'Valid

For a prefix
X that denotes a scalar object (after any implicit dereference):

Yields True if and only if the object denoted
by X is normal, and
has a valid representation, and the predicate
of the nominal subtype of X evaluates to True. 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:

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 prefix
P that statically denotes a program unit:

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 scalar subtype S:

S'Wide_Image
denotes a function with the following specification:

The function returns
an image* image*
of the value of *Arg* as a Wide_String,
that is, a sequence of characters representing the value in display form.
See 3.5.

S'Wide_Value

For every scalar subtype S:

S'Wide_Value
denotes a function with the following specification:

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 scalar subtype S:

S'Wide_Wide_Image
denotes a function with the following specification:

The
function returns an *image* of the value of *Arg*, that is,
a sequence of characters representing the value in display form.
See 3.5.

S'Wide_Wide_Value

For every scalar subtype S:

S'Wide_Wide_Value
denotes a function with the following specification:

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. It denotes zero for a subtype that
has a null range. Its type is *universal_integer*. See 3.5.

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. It denotes zero for a subtype that has a null range. Its type is *universal_integer*.
See 3.5.

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. It denotes
zero for a subtype that has a null range. Its type is *universal_integer*.
See 3.5.

S'Class'Write

For every subtype S'Class of a class-wide type *T*'Class:

S'Class'Write
denotes a procedure with the following specification:

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*:

S'Write denotes
a procedure with the following specification:

Ada 2005 and 2012 Editions sponsored in part by **Ada-Europe**