13.1.1 Aspect Specifications
Certain representation or operational aspects of
an entity may be specified as part of its declaration using an
aspect_specification,
rather than using a separate representation or operational item. The
declaration with the
aspect_specification
is termed the
associated declaration.
Syntax
Name Resolution Rules
An
aspect_mark
identifies an aspect of the entity defined by the associated declaration
(the
associated entity); the aspect denotes
an object, a value, an expression, an
aggregate,
a subprogram, or some other kind of entity. If the
aspect_mark
identifies:
an aspect that denotes an object, the
aspect_definition
shall be a
name.
The expected type for the
name
is the type of the identified aspect of the associated entity;
an aspect that is a value or an expression, the
aspect_definition
shall be an
expression.
The expected type for the
expression
is the type of the identified aspect of the associated entity;
an aspect that denotes a subprogram, the
aspect_definition
shall be a
name;
the expected profile for the
name
is the profile required for the aspect of the associated entity;
an aspect that denotes some other kind of entity,
the
aspect_definition
shall be a
name,
and the name shall resolve to denote an entity of the appropriate kind;
an aspect that is given by an identifier specific
to the aspect, the
aspect_definition
shall be an
identifier,
and the
identifier
shall be one of the identifiers specific to the identified aspect.
The usage names in an
aspect_definition
associated with a declaration are not resolved at the point of the associated
declaration, but rather are resolved at the end of the immediately enclosing
declaration list, or in the case of the declaration of a library unit,
at the end of the visible part of the entity.
If the associated declaration is for a subprogram,
entry, or access-to-subprogram type, the names of the formal parameters
are directly visible within the
aspect_definition,
as are certain attributes, as specified elsewhere in this document for
the identified aspect. If the associated declaration is a
type_declaration,
within the
aspect_definition
the names of any visible components, protected subprograms, and entries
are directly visible, and the name of the first subtype denotes the current
instance of the type (see
8.6). If the associated
declaration is a
subtype_declaration,
within the
aspect_definition
the name of the new subtype denotes the current instance of the subtype.
Legality Rules
If the first freezing point of the associated entity
comes before the end of the immediately enclosing declaration list, then
each usage name in the
aspect_definition
shall resolve to the same entity at the first freezing point as it does
at the end of the immediately enclosing declaration list.
An
expression
or
name that
causes freezing of an entity shall not occur within an
aspect_specification
that specifies a representation or operational aspect of that entity.
At most one occurrence of each
aspect_mark
is allowed within a single
aspect_specification.
The aspect identified by the
aspect_mark
shall be an aspect that can be specified for the associated entity (or
view of the entity defined by the associated declaration).
If the
aspect_mark
includes 'Class, then the associated entity shall be a tagged type or
a primitive subprogram of a tagged type.
Unless specified otherwise, a language-defined aspect
shall not be specified in an
aspect_specification
given on a completion of a program unit.
If an aspect of a derived type is inherited from
an ancestor type and has the boolean value True, the inherited value
shall not be overridden to have the value False for the derived type,
unless otherwise specified in this document.
If a given aspect is type-related and inherited,
then within an
aspect_definition
for the aspect, if a
name
resolves to denote multiple visible subprograms, all or none of the denoted
subprograms shall be primitives of the associated type.
Certain type-related aspects are defined to be
nonoverridable;
all such aspects
are inherited by derived types according to the rules given in
13.1.
Any legality rule associated with a nonoverridable aspect is re-checked
for the derived type, if the derived type is not abstract. Certain type-related
and subtype-specific aspects are defined to be
additive;
such aspects
are not inherited, but they can
apply
to the types derived from, or the subtypes based on, the original type
or subtype, as defined for each such aspect. Finally, certain type-related
aspects are
implicitly composed;
such aspects
are not inherited, but rather a default implementation
for a derived type is provided, as defined for each such aspect, based
on that of its parent type, presuming the aspect for the parent type
is available where the derived type is declared, plus those of any new
components added as part of a type extension.
If a nonoverridable aspect is directly specified
for a type
T, then any explicit specification of that aspect for
any descendant of
T (other than
T itself) shall be
confirming.
In the case of an aspect that is a
name,
this means that the specified
name
shall
match the inherited aspect in the sense
that it shall denote the same declarations as would the inherited
name.
Similarly, for an aspect that is an
expression
or an
aggregate,
confirming means the defining
expression
is fully conformant (see
6.3.1) with the
defining
expression
for the inherited aspect, with the added rule that an identifier that
is specific to the aspect is the same as the corresponding identifier
in the inherited aspect.
If a full type has a partial view, and a given
nonoverridable aspect is allowed for both the full view and the partial
view, then the given aspect for the partial view and the full view shall
be the same: the aspect shall be directly specified only on the partial
view; if the full type inherits the aspect, then a matching definition
shall be specified (directly or by inheritance) for the partial view.
If a type inherits a nonoverridable aspect from
multiple ancestors, the value of the aspect inherited from any given
ancestor shall be confirming of the values inherited from all other ancestors.
In addition to the places where
Legality Rules normally apply (see
12.3),
these rules about nonoverridable aspects also apply in the private part
of an instance of a generic unit.
Static Semantics
a
name
that denotes a subprogram, object, or other kind of entity;
an
expression
(other than an
aggregate),
which is either evaluated to produce a single value, or which (as in
a precondition) is to be evaluated at particular points during later
execution;
an
aggregate,
which is positional or named, and is composed of elements of any of these
four kinds of constructs.
The identified aspect
of the associated entity, or in some cases, the view of the entity defined
by the declaration, is as specified by the
aspect_definition
(or by the default of True when boolean). Whether an
aspect_specification
applies to an entity or only to the particular view of the entity
defined by the declaration is determined by the
aspect_mark
and the kind of entity. The following aspects are view specific:
All other
aspect_specifications
are associated with the entity, and
apply to all views of the
entity, unless otherwise specified in this document.
If the
aspect_mark
includes 'Class (a
class-wide aspect)
,
then, unless specified otherwise for a particular class-wide aspect:
if the associated entity is a tagged type, the
specification
applies to all descendants of the type;
if the associated entity is a primitive subprogram
of a tagged type
T, the specification
applies to the corresponding
primitive subprogram of all descendants of
T.
Some aspects are defined to be
library unit aspects.
Library unit aspects are of type Boolean. The expression specifying a
library unit aspect shall be static. Library unit aspects are defined
for all program units, but shall be specified only for library units.
Notwithstanding what this document says elsewhere, the expression of
a library unit aspect is resolved and evaluated at the point where it
occurs in the
aspect_specification,
rather than the first freezing point of the associated unit.
In addition, other operational and representation
aspects not associated with specifiable attributes or representation
pragmas may be specified, as specified elsewhere in this document.
This paragraph was
deleted.
If a Legality Rule or Static Semantics rule only
applies when a particular aspect has been specified, the aspect is considered
to have been specified only when the
aspect_specification
or
attribute_definition_clause
is visible (see
8.3) at the point of the application
of the rule.
Alternative legality and semantics rules may apply
for particular aspects, as specified elsewhere in this document.
Dynamic Semantics
At the freezing point of the associated entity, the
aspect_specification
is elaborated. When appearing in a construct other than a declaration,
an
aspect_specification
is elaborated as part of the execution of the construct. The elaboration
of the
aspect_specification
consists of the elaboration of each
aspect_definition
in an arbitrary order. The elaboration of an
aspect_definition
includes the evaluation of any
name
or
expression
that is part of the
aspect_definition
unless the part is itself an expression. If the corresponding aspect
(or part thereof) represents an expression (as in a precondition), the
elaboration of that part has no effect; the expression is evaluated later
at points within the execution as specified elsewhere in this document
for the particular aspect.
Implementation Permissions
Implementations may support implementation-defined
aspects. The
aspect_specification
for an implementation-defined aspect may use an implementation-defined
syntax for the
aspect_definition,
and may follow implementation-defined legality and semantics rules.
An implementation may ignore the specification of
an unrecognized aspect; if an implementation chooses to ignore such an
aspect specification (as opposed to rejecting it), then it has no effect
on the semantics of the program except for possibly (and this is not
required) the rejection of syntax errors within the
aspect_definition.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe