13.1 Operational and Representation Aspects
Two kinds of aspects of entities
can be specified: representation aspects and operational aspects. Representation
aspects affect how the types and other entities of the language are to
be mapped onto the underlying machine. Operational aspects determine
other properties of entities.
Either kind of aspect of an entity may be specified
by means of an
aspect_specification
(see
13.1.1), which is an optional element
of most kinds of declarations and applies to the entity or entities being
declared. Aspects may also be specified by certain other constructs occurring
subsequent to the declaration of the affected entity: a representation
aspect value may be specified by means of a representation item and an
operational aspect value may be specified by means of an operational
item.
An operational item or a representation item applies
to an entity identified by a
local_name,
which denotes an entity declared local to the current declarative region,
or a library unit declared immediately preceding a representation pragma
in a
compilation.
Syntax
Name Resolution Rules
In an operational item or representation item, if
the
local_name
is a
direct_name,
then it shall resolve to denote a declaration (or, in the case of a
pragma,
one or more declarations) that occurs immediately within the same declarative
region as the item. If the
local_name
has an
attribute_designator,
then it shall resolve to denote an implementation-defined component (see
13.5.1) or a class-wide type implicitly
declared immediately within the same declarative region as the item.
A
local_name
that is a
library_unit_name
(only permitted in a representation pragma) shall resolve to denote the
library_item
that immediately precedes (except for other pragmas) the representation
pragma.
Legality Rules
The
representation
of an object consists of a certain number of bits (the
size of
the object). For an object of an elementary type, these are the bits
that are normally read or updated by the machine code when loading, storing,
or operating-on the value of the object. For an object of a composite
type, these are the bits reserved for this object, and include bits occupied
by subcomponents of the object. If the size of an object is greater than
that of its subtype, the additional bits are padding bits.
For
an elementary object, these padding bits are normally read and updated
along with the others. For a composite object, it is unspecified whether
padding bits are read or updated in any given composite operation.
A
representation item
directly specifies a
representation aspect
of the entity denoted by the
local_name,
except in the case of a type-related representation item, whose
local_name
shall denote a first subtype, and which directly specifies an aspect
of the subtype's type.
A
representation item that names a subtype is either
subtype-specific
(Size, Object_Size, and Alignment clauses) or
type-related (all
others).
An operational item
directly specifies an
operational aspect of the entity denoted by the
local_name,
except in the case of a type-related operational item, whose
local_name
shall denote a first subtype, and which directly specifies an aspect
of the type of the subtype.
Aspects that can be specified for types and subtypes
are also classified into type-related or subtype-specific aspects. Representation
aspects that can be specified for types and subtypes are considered type-related
unless specified otherwise. In contrast, the classification of operational
aspects are given with the definition of the aspect. Type-related aspects
have the same value for all subtypes of (a view of) a type, while subtype-specific
aspects may differ for different subtypes of the same type.
A representation item or operational item that directly
specifies an aspect of an entity shall appear before the entity is frozen
(see
13.14).
A representation aspect of a subtype or type shall
not be specified (whether by a representation item or an
aspect_specification)
before the type is completely defined (see
3.11.1).
If a representation item, operational item, library
unit pragma (see
J.15), or
aspect_specification
is given that directly specifies an aspect of an entity, then it is illegal
to give another representation item, operational item, library unit pragma,
or
aspect_specification
that directly specifies the same aspect of the entity.
Unless otherwise specified, it is illegal to specify
an operational or representation aspect of a generic formal parameter.
A
by-reference primitive
is a user-defined primitive subprogram for a type
T that has an
access result designating type
T, or that has a formal parameter
that is an access parameter designating type
T or is aliased and
of type
T. It is illegal to specify a nonconfirming type-related
representation aspect for an untagged type
T if it is derived
from a by-reference type or inherits one or more by-reference primitives,
or if one or more types have been derived from
T prior to the
specification of the aspect and type
T is a by-reference type
or defines one or more by-reference primitives that are inherited by
these descendants.
If a type-related aspect is defined for the partial
view of a type, then it has the same definition for the full view of
the type, except for certain Boolean-valued operational aspects where
the language specifies that the partial view can have the value False
even when the full view has the value True. Type-related aspects cannot
be specified, and are not defined for an incomplete view of a type. Representation
aspects of a generic formal parameter are the same as those of the actual.
Specification of a type-related representation aspect is not allowed
for a descendant of a generic formal untagged type.
The specification of the Size aspect for a given
subtype, or the size or storage place for an object (including a component)
of a given subtype, shall allow for enough storage space to accommodate
any value of the subtype.
The specification of certain language-defined aspects
is not required to be supported by all implementations; in such an implementation,
the specification for such an aspect is illegal or raises an exception
at run time.
A
type_declaration
is illegal if it has one or more progenitors, and a nonconfirming value
was specified for a representation aspect of an ancestor, and this conflicts
with the representation of some other ancestor. The cases that cause
conflicts are implementation defined.
When specifying an aspect that denotes a subprogram,
the profile of the subprogram shall be mode conformant with the one required
for the aspect, and the convention shall be Ada. Additional requirements
are defined for particular aspects.
Static Semantics
If two subtypes statically match, then their subtype-specific
aspects (for example, Size and Alignment) are the same.
A derived type inherits each type-related representation
aspect of its parent type that was directly specified before the declaration
of the derived type, or (in the case where the parent is derived) that
was inherited by the parent type from the grandparent type. A derived
subtype inherits each subtype-specific representation aspect of its parent
subtype that was directly specified before the declaration of the derived
type, or (in the case where the parent is derived) that was inherited
by the parent subtype from the grandparent subtype, but only if the parent
subtype statically matches the first subtype of the parent type. An inherited
representation aspect is overridden by a subsequent
aspect_specification
or representation item that specifies a different value for the same
aspect of the type or subtype.
In contrast, whether type-related operational aspects
are inherited by a derived type depends on each specific aspect; unless
specified, an operational aspect is not inherited. When type-related
operational aspects are inherited by a derived type, aspects that were
directly specified by
aspect_specifications
or operational items that are visible at any point within the immediate
scope of the derived type declaration, or (in the case where the parent
is derived) that were inherited by the parent type from the grandparent
type, are inherited. An inherited operational aspect is overridden by
an
aspect_specification
or operational item that specifies the same aspect of the type.
When a type-related
operational aspect is inherited, the rules for inheritance depend on
the nature of the aspect (see
13.1.1). Unless
otherwise specified for a given aspect, these rules are as follows:
For an operational aspect that is a value, the
inherited aspect has the same value;
For an operational
aspect that is a
name:
if the
name
denotes one or more primitive subprograms of the type, the inherited
aspect is a
name
that denotes the corresponding primitive subprogram(s) of the derived
type;
otherwise, the inherited aspect is a
name
that denotes the same entity or entities as the original aspect;
For an operational aspect that is an identifier
specific to the aspect, the inherited aspect is the same identifier;
Each aspect of representation
of an entity is as follows:
If the aspect is
specified
for the entity, meaning that it is either directly specified or inherited,
then that aspect of the entity is as specified, except in the case of
Storage_Size, which specifies a minimum.
If an aspect of representation
of an entity is not specified, it is chosen by default in an unspecified
manner.
If an operational aspect is
specified for an entity (meaning that it is either directly specified
or, if type-related or subtype-specific, inherited), then that aspect
of the entity is as specified. Otherwise, the aspect of the entity has
the default value for that aspect. For aspects that are neither type-related
nor subtype-specific, the terms “specified” and “directly
specified” are equivalent.
An
aspect_specification
or representation item that specifies a representation aspect that would
have been chosen in the absence of the
aspect_specification
or representation item is said to be
confirming.
The aspect value specified in this case is said to be a
confirming
representation aspect value. Other values of the aspect are said to be
nonconfirming, as are the
aspect_specifications
and representation items that specified them.
Similarly,
an
aspect_specification
or operational item that specifies an operational aspect to be the same
as the definition it would have by default is said to be
confirming;
otherwise it is
nonconfirming.
Dynamic Semantics
For the elaboration of an
aspect_clause,
any evaluable constructs within it are evaluated.
Implementation Permissions
An implementation may interpret representation aspects
in an implementation-defined manner. An implementation may place implementation-defined
restrictions on the specification of representation aspects.
A
recommended level of support is defined for the specification
of representation aspects and related features in each subclause. These
recommendations are changed to requirements for implementations that
support the Systems Programming Annex (see
C.2,
“
Required Representation Support”).
Implementation Advice
The
recommended level of support for the specification of all representation
aspects is qualified as follows:
A confirming specification for a representation
aspect should be supported.
An implementation is not required to support the
specification for a representation aspect that contains nonstatic expressions,
unless each nonstatic expression is a
name
that statically denotes a constant declared before the entity.
An implementation is not required to support a
specification for the Object_Size or Size for a given composite subtype,
nor the size or storage place for an object (including a component) of
a given composite subtype, unless the constraints on the subtype and
its composite subcomponents (if any) are all static constraints.
An implementation is not required to support specifying
a nonconfirming representation aspect value if it can cause an aliased
object or an object of a by-reference type to be allocated at a nonaddressable
location or, when the alignment attribute of the subtype of such an object
is nonzero, at an address that is not an integral multiple of that alignment.
An implementation is not required to support specifying
a nonconfirming representation aspect value if it can cause an aliased
object of an elementary type to have a size other than that which would
have been chosen by default.
An implementation is not required to support specifying
a nonconfirming representation aspect value if it can cause an aliased
object of a composite type, or an object whose type is by-reference,
to have a size smaller than that which would have been chosen by default.
An implementation is not required to support specifying
a nonconfirming subtype-specific representation aspect value for an indefinite
or abstract subtype.
For purposes of these rules, the determination of
whether specifying a representation aspect value for a type
can
cause an object to have some property is based solely on the properties
of the type itself, not on any available information about how the type
is used. In particular, it presumes that minimally aligned objects of
this type can be declared at some point.
NOTE Aspects that can be specified
are defined throughout this document, and are summarized in
K.1.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe