Attributes
Author: JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor

Ada Reference Manual — Legal Information

# 4.1.4 Attributes

1
An attribute is a characteristic of an entity that can be queried via an attribute_reference or a range_attribute_reference.

#### Syntax

2
attribute_reference ::= prefix'attribute_designator
3/2
attribute_designator ::=
identifier[(static_ expression)]
| Access | Delta | Digits | Mod
4
range_attribute_reference ::= prefix'range_attribute_designator
5
range_attribute_designator ::= Range[(static_ expression)]

#### Name Resolution Rules

6
In an attribute_reference, if the attribute_designator is for an attribute defined for (at least some) objects of an access type, then the prefix is never interpreted as an implicit_dereference; otherwise (and for all range_attribute_references), if the type of the name within the prefix is of an access type, the prefix is interpreted as an implicit_dereference. Similarly, if the attribute_designator is for an attribute defined for (at least some) functions, then the prefix is never interpreted as a parameterless function_call; otherwise (and for all range_attribute_references), if the prefix consists of a name that denotes a function, it is interpreted as a parameterless function_call.
7
The expression, if any, in an attribute_designator or range_attribute_designator is expected to be of any integer type.

#### Legality Rules

8
The expression, if any, in an attribute_designator or range_attribute_designator shall be static.

#### Static Semantics

9/3
An attribute_reference denotes a value, an object, a subprogram, or some other kind of program entity. For an attribute_reference that denotes a value or an object, if its type is scalar, then its nominal subtype is the base subtype of the type; if its type is tagged, its nominal subtype is the first subtype of the type; otherwise, its nominal subtype is a subtype of the type without any constraint or null_exclusion. Similarly, unless explicitly specified otherwise, for an attribute_reference that denotes a function, when its result type is scalar, its result subtype is the base subtype of the type, when its result type is tagged, the result subtype is the first subtype of the type, and when the result type is some other type, the result subtype is a subtype of the type without any constraint or null_exclusion.
10
A range_attribute_reference X'Range(N) is equivalent to the range X'First(N) .. X'Last(N), except that the prefix is only evaluated once. Similarly, X'Range is equivalent to X'First .. X'Last, except that the prefix is only evaluated once.

#### Dynamic Semantics

11
The evaluation of an attribute_reference (or range_attribute_reference) consists of the evaluation of the prefix.

#### Implementation Permissions

12/1
An implementation may provide implementation-defined attributes; the identifier for an implementation-defined attribute shall differ from those of the language-defined attributes unless supplied for compatibility with a previous edition of this International Standard.
NOTES
13
4 Attributes are defined throughout this International Standard, and are summarized in K.2.
14/2
5 In general, the name in a prefix of an attribute_reference (or a range_attribute_reference) has to be resolved without using any context. However, in the case of the Access attribute, the expected type for the attribute_reference has to be a single access type, and the resolution of the name can use the fact that the type of the object or the profile of the callable entity denoted by the prefix has to match the designated type or be type conformant with the designated profile of the access type.

#### Examples

15
Examples of attributes:
16
Color'First -- minimum value of the enumeration type Color (see 3.5.1)
Rainbow'Base'First -- same as Color'First (see 3.5.1)
Real'Digits -- precision of the type Real (see 3.5.7)
Board'Last(2) -- upper bound of the second dimension of Board (see 3.6.1)
Board'Range(1) -- index range of the first dimension of Board (see 3.6.1)
Pool(K)'Terminated -- True if task Pool(K) is terminated (see 9.1)
Date'Size -- number of bits for records of type Date (see 3.8)
Message'Address -- address of the record variable Message (see 3.7.1)

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