Contents Index Search 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 prefix 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
{
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 prefix prefix
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 Search Previous Next Legal