4.1.4 Attributes


4.1.4 Attributes

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


2 attribute_reference ::= prefix'attribute_designator

3 attribute_designator ::= 
  | Access | Delta | Digits

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.

6.a Discussion: The first part of this rule is essentially a "preference" against implicit dereference, so that it is possible to ask for, say, 'Size of an access object, without automatically getting the size of the object designated by the access object. This rule applies to 'Access, 'Unchecked_Access, 'Size, and 'Address, and any other attributes that are defined for at least some access objects.

6.b The second part of this rule implies that, for a parameterless function F, F'Address is the address of F, whereas F'Size is the size of the anonymous constant returned by F.

6.c/1 We normally talk in terms of expected type or profile for name resolution rules, but we don't do this for attributes because certain attributes are legal independent of the type or the profile of the prefix.

7 {expected type (attribute_designator expression) [partial]} {expected type (range_attribute_designator expression) [partial]} 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 An attribute_reference denotes a value, an object, a subprogram, or some other kind of program entity. 

9.a Ramification: The attributes defined by the language are summarized in Annex K. Implementations can define additional attributes. 

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 {evaluation (attribute_reference) [partial]} {evaluation (range_attribute_reference) [partial]} 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

12.a Implementation defined: Implementation-defined attributes.

12.b Ramification: They cannot be reserved words because reserved words are not legal identifiers.

12.c The semantics of implementation-defined attributes, and any associated rules, are, of course, implementation defined. For example, the implementation defines whether a given implementation-defined attribute can be used in a static expression.

12.c.1/1 Implementations are allowed to support the Small attribute for floating types, as this was defined in Ada 83, even though the name would conflict with a language-defined attribute. 


13 (4)  Attributes are defined throughout this International Standard, and are summarized in Annex K.

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. {type conformance (required)} 

14.a/2 Proof: In the general case, there is no “expected type” for the prefix of an attribute_reference. In the special case of 'Access, there is an “expected type” or “expected profile” for the prefix.

14.b Reason: 'Access is a special case, because without it, it would be very difficult to take 'Access of an overloaded subprogram. 


15 Examples of attributes:


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)

Extensions to Ada 83

16.a {extensions to Ada 83} We now uniformly treat X'Range as X'First .. X'Last, allowing its use with scalar subtypes.

16.b We allow any integer type in the static_expression of an attribute designator, not just a value of universal_integer. The preference rules ensure upward compatibility. 

Wording Changes from Ada 83

16.c We use the syntactic category attribute_reference rather than simply "attribute" to avoid confusing the name of something with the thing itself.

16.d The syntax rule for attribute_reference now uses identifier instead of simple_name, because attribute identifiers are not required to follow the normal visibility rules.

16.e We now separate attribute_reference from range_attribute_reference, and enumerate the reserved words that are legal attribute or range attribute designators. We do this because identifier no longer includes reserved words.

16.f The Ada 95 name resolution rules are a bit more explicit than in Ada 83. The Ada 83 rule said that the "meaning of the prefix of an attribute must be determinable independently of the attribute designator and independently of the fact that it is the prefix of an attribute." That isn't quite right since the meaning even in Ada 83 embodies whether or not the prefix is interpreted as a parameterless function call, and in Ada 95, it also embodies whether or not the prefix is interpreted as an implicit_dereference. So the attribute designator does make a difference — just not much.

16.g Note however that if the attribute designator is Access, it makes a big difference in the interpretation of the prefix (see 3.10.2). 

Wording Changes from Ada 95

16.h/2 Corrigendum: The wording was changed to allow implementations to continue to implement the Ada 83 Small attribute. This was always intended to be allowed.

16.i/2 The note about resolving prefixes of attributes was updated to reflect that the prefix of an Access attribute now has an expected type (see 3.10.2).