

                                   Annex K
                                (informative)

                         Language-Defined Attributes


1     This annex summarizes the definitions given elsewhere of the
language-defined attributes.

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

6/1   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:

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

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

14/1  X'Alignment
              For a prefix X that denotes a subtype or object:

        15    The Address of an object that is allocated under control of the
              implementation is an integral multiple of 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.

        16    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. See 13.3.

17    S'Base  For every scalar subtype S:

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

        20    Denotes the bit ordering for the type of S. The value of this
              attribute is of type System.Bit_Order. See 13.5.3.

21/1  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.

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

            29    function S'Ceiling (X : T)
                    return T

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

31    S'Class For every subtype S of an untagged private type whose full view
              is tagged:

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

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

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

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

36/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:

            40    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    Yields the value True if A denotes a constant, a value, or a
              constrained variable, and False otherwise. See 3.7.2.

44    S'Copy_Sign
              For every subtype S of a floating point type T:

        45    S'Copy_Sign denotes a function with the following specification:

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

52    S'Delta For every fixed point subtype S:

        53    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 decimal fixed point subtype S:

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

58    S'Digits
              For every floating point subtype S:

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

60    S'Exponent
              For every subtype S of a floating point type T:

        61    S'Exponent denotes a function with the following specification:

            62    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 3.9.2 and 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.

68    S'First For every scalar subtype S:

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

70/1  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.

72    R.C'First_Bit
              For a component C of a composite, non-array object R:

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

74    S'Floor For every subtype S of a floating point type T:

        75    S'Floor denotes a function with the following specification:

            76    function S'Floor (X : T)
                    return T

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

78    S'Fore  For every fixed point subtype S:

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

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

84    T'Identity
              For a prefix T that is of a task type (after any implicit
              dereference):

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

86/1  E'Identity
              For a prefix E that denotes an exception:

        87    E'Identity returns the unique identity of the exception. The
              type of this attribute is Exception_Id. See 11.4.1.

88    S'Image For every scalar subtype S:

        89    S'Image denotes a function with the following specification:

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

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

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

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

        95    First reads the external tag from Stream and determines the
              corresponding internal tag (by calling
              Tags.Internal_Tag(String'Input(Stream)) - 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. 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:

            98    function S'Input(
                     Stream : 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.

102   S'Last  For every scalar subtype S:

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

104/1 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.

106   R.C'Last_Bit
              For a component C of a composite, non-array object R:

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

108   S'Leading_Part
              For every subtype S of a floating point type T:

        109   S'Leading_Part denotes a function with the following
              specification:

            110   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

            112   Floor(X/v)  v, when X is nonnegative and Radix_Digits is
                  positive;

            113   Ceiling(X/v)  v, when X is negative and Radix_Digits is
                  positive.

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

            121   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 fixed 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.4.

131   S'Machine_Overflows
              For every subtype S of a floating 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.3.

133   S'Machine_Radix
              For every subtype S of a fixed 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.4.

135   S'Machine_Radix
              For every subtype S of a floating 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.3.

137   S'Machine_Rounds
              For every subtype S of a fixed 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.4.

139   S'Machine_Rounds
              For every subtype S of a floating 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.3.

141   S'Max   For every scalar subtype S:

        142   S'Max denotes a function with the following specification:

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

145   S'Max_Size_In_Storage_Elements
              For every subtype S:

        146   Denotes the maximum value for Size_In_Storage_Elements that will
              be requested 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:

        148   S'Min denotes a function with the following specification:

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

151   S'Model For every subtype S of a floating point type T:

        152   S'Model denotes a function with the following specification:

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

155   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_Radix(1 - 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
              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.

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:

        164   S'Modulus yields the modulus of the type of S, as a value of the
              type universal_integer. See 3.5.4.

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

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

        168   First writes the external tag of Item to Stream (by calling
              String'Output(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. 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:

            171   procedure S'Output(
                     Stream : 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.

173/1 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:

        176   S'Pos denotes a function with the following specification:

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

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

        182   S'Pred denotes a function with the following specification:

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

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:

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

            193   procedure S'Class'Read(
                     Stream : 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.

195   S'Read  For every subtype S of a specific type T:

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

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

        198   S'Read reads the value of Item from Stream. See 13.13.2.

199   S'Remainder
              For every subtype S of a floating point type T:

        200   S'Remainder denotes a function with the following specification:

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

203   S'Round For every decimal fixed point subtype S:

        204   S'Round denotes a function with the following specification:

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

207   S'Rounding
              For every subtype S of a floating point type T:

        208   S'Rounding denotes a function with the following specification:

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

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

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

        224   If S is definite, denotes the size (in bits) that the
              implementation would choose for the following objects of subtype
              S:

            225   A record component of subtype S when the record type is
                  packed.

            226   The formal parameter of an instance of Unchecked_Conversion
                  that converts from subtype S to some other subtype.

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

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

        233   Denotes the storage pool of the type of S. The type of this
              attribute is Root_Storage_Pool'Class. See 13.11.

234   S'Storage_Size
              For every access subtype S:

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

238   S'Succ  For every scalar subtype S:

        239   S'Succ denotes a function with the following specification:

            240   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   X'Tag   For a prefix X that is of a class-wide tagged type (after any
              implicit dereference):

        243   X'Tag denotes the tag of X. The value of this attribute is of
              type Tag. See 3.9.

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

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

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

248   S'Truncation
              For every subtype S of a floating point type T:

        249   S'Truncation denotes a function with the following
              specification:

            250   function S'Truncation (X : T)
                    return T

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

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:

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

258   S'Val   For every discrete subtype S:

        259   S'Val denotes a function with the following specification:

            260   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   Yields True if and only if the object denoted by X is normal and
              has a valid representation. The value of this attribute is of
              the predefined type Boolean. See 13.9.2.

264   S'Value For every scalar subtype S:

        265   S'Value denotes a function with the following specification:

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

268/1 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.

270   S'Wide_Image
              For every scalar subtype S:

        271   S'Wide_Image denotes a function with the following
              specification:

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

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

274   S'Wide_Value
              For every scalar subtype S:

        275   S'Wide_Value denotes a function with the following
              specification:

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

278   S'Wide_Width
              For every scalar subtype S:

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

280   S'Width For every scalar subtype S:

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

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:

            284   procedure S'Class'Write(
                     Stream : 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.

286   S'Write For every subtype S of a specific type T:

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

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

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

