Contents Index Previous Next
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.]
Syntax
2
attribute_reference
::= prefix'
attribute_designator
3
attribute_designator
::=
identifier[(
static_expression)]
| 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 prefixprefix.
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
{
8652/0015}
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
{8652/0015}
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/1
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 prefixprefix
has to be a single access type, and if it is an access-to-subprogram type (see
3.10.2) then the resolution of the name
can use the fact that the profile of the callable entity denoted by the prefix
has to be type conformant with the designated profile of the access type. {type
conformance (required)}
14.a
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 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.
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)
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).
Contents Index Previous Next Legal