Contents Index Search Related Documents Previous Next
3.10.2 Operations of Access Types
1
The attribute Access is used to create access
values designating aliased objects and non-intrinsic subprograms. The
“accessibility” rules prevent dangling references (in the
absence of uses of certain unchecked features — see Section 13).
Name Resolution Rules
2/2
For an
attribute_reference
with
attribute_designator Access
(or Unchecked_Access — see
13.10),
the expected type shall be a single access type
A such that:
2.1/2
- A is an access-to-object type
with designated type D and the type of the prefix
is D'Class or is covered by D, or
2.2/2
- A is an access-to-subprogram
type whose designated profile is type conformant with that of the prefix.
2.3/2
The
prefix
of such an
attribute_reference is
never interpreted as an
implicit_dereference
or a parameterless
function_call
(see
4.1.4).
The
designated type or profile of the expected type of the
attribute_reference
is the expected type or profile for the
prefix.
Static Semantics
3/2
The
accessibility rules, which prevent dangling references, are written in
terms of
accessibility levels, which reflect the run-time nesting
of
masters. As explained in
7.6.1,
a master is the execution of a certain construct, such as a
subprogram_body.
4
An accessibility level is deeper than another
if it is more deeply nested at run time. For example, an object declared
local to a called subprogram has a deeper accessibility level than an
object declared local to the calling subprogram. The accessibility rules
for access types require that the accessibility level of an object designated
by an access value be no deeper than that of the access type. This ensures
that the object will live at least as long as the access type, which
in turn ensures that the access value cannot later designate an object
that no longer exists. The Unchecked_Access attribute may be used to
circumvent the accessibility rules.
5
A given
accessibility level is said to be
statically deeper than another
if the given level is known at compile time (as defined below) to be
deeper than the other for all possible executions. In most cases, accessibility
is enforced at compile time by Legality Rules. Run-time accessibility
checks are also used, since the Legality Rules do not cover certain cases
involving access parameters and generic packages.
6
Each master, and
each entity and view created by it, has an accessibility level:
7
- The accessibility level of a given
master is deeper than that of each dynamically enclosing master, and
deeper than that of each master upon which the task executing the given
master directly depends (see 9.3).
8/2
- An entity or view defined by a declaration
and created as part of its elaboration has the same accessibility level
as the innermost master of the declaration except in the cases of renaming
and derived access types described below. A parameter of a master has
the same accessibility level as the master.
9
- The accessibility level of a view
of an object or subprogram defined by a renaming_declaration
is the same as that of the renamed view.
10/2
- The accessibility level of a view
conversion, qualified_expression,
or parenthesized expression, is the same as that of the operand.
11/2
- The accessibility level of the result
of a function call that is used as a prefix
of a name, as the actual parameter
in a call, or as the expression
of an assignment_statement, is that
of the innermost master of the function call. In other contexts, the
accessibility level is that of the object being initialized from the
function result.
11.1/2
- Within a return statement, the accessibility
level of the return object is that of the execution of the return statement.
If the return statement completes normally by returning from the function,
then prior to leaving the function, the accessibility level of the return
object changes to be a level determined by the point of call, as does
the level of any coextensions (see below) of the return object.
12
- The accessibility level of a derived
access type is the same as that of its ultimate ancestor.
12.1/2
- The accessibility level of the anonymous
access type defined by an access_definition
of an object_renaming_declaration
is the same as that of the renamed view.
13/2
- The
accessibility level of the anonymous access type of an access discriminant
in the subtype_indication or qualified_expression
of an allocator, or in the expression
or return_subtype_indication of
a return statement is determined as follows:
13.1/2
- For an access discriminant whose
value is determined by a discriminant_association
in a subtype_indication, the accessibility
level of the object or subprogram designated by the associated value
(or library level if the value is null);
13.2/2
- For an access discriminant of
an object defined by an aggregate
where the value of the discriminant is determined by a component_association
in the aggregate, the accessibility
level of the object or subprogram designated by the associated value
(or library level if the value is null);
13.3/2
- For an access discriminant of
any other object with an unconstrained nominal subtype, the accessibility
level of the object.
14/2
- The accessibility level of the anonymous
access type of an access parameter specifying an access-to-object type
is the same as that of the view designated by the actual.
14.1/2
- The accessibility level of the anonymous
access type of an access parameter specifying an access-to-subprogram
type is deeper than that of any master; all such anonymous access types
have this same level.
15/2
- The
accessibility level of an object created by an allocator
is the same as that of the access type, except for an allocator
of an anonymous access type that defines the value of an access parameter
or an access discriminant. For an allocator
defining the value of an access parameter, the accessibility level is
that of the innermost master of the call. For one defining an access
discriminant, the accessibility level is determined as follows:
15.1/2
- for an allocator
used to define the constraint in a subtype_declaration,
the level of the subtype_declaration;
15.2/2
- for an allocator
used to define the constraint in a component_definition,
the level of the enclosing type;
15.3/2
- for an allocator
used to define the discriminant of an object, the level of the object.
15.4/2
In this last case, the allocated
object is said to be a coextension of the object whose discriminant
designates it, as well as of any object of which the discriminated object
is itself a coextension or subcomponent. All coextensions of an object
are finalized when the object is finalized (see 7.6.1).
16
- The accessibility level of a view
of an object or subprogram denoted by a dereference of an access value
is the same as that of the access type.
17
- The accessibility level of a component,
protected subprogram, or entry of (a view of) a composite object is the
same as that of (the view of) the composite object.
17.1/2
In the above rules, the operand of a view
conversion, parenthesized expression or qualified_expression
is considered to be used in a context if the view conversion, parenthesized
expression or qualified_expression
itself is used in that context.
18
One
accessibility level is defined to be
statically deeper than another
in the following cases:
19
- For a master that is statically nested
within another master, the accessibility level of the inner master is
statically deeper than that of the outer master.
19.1/2
- The accessibility level of the anonymous
access type of an access parameter specifying an access-to-subprogram
type is statically deeper than that of any master; all such anonymous
access types have this same level.
20/2
- The statically deeper relationship
does not apply to the accessibility level of the anonymous type of an
access parameter specifying an access-to-object type; that is, such an
accessibility level is not considered to be statically deeper, nor statically
shallower, than any other.
21
- For determining whether one level
is statically deeper than another when within a generic package body,
the generic package is presumed to be instantiated at the same level
as where it was declared; run-time checks are needed in the case of more
deeply nested instantiations.
22
- For determining whether one level
is statically deeper than another when within the declarative region
of a type_declaration, the current
instance of the type is presumed to be an object created at a deeper
level than that of the type.
23
The accessibility
level of all library units is called the
library level; a library-level
declaration or entity is one whose accessibility level is the library
level.
24
The following attribute
is defined for a prefix X that denotes
an aliased view of an object:
25/1
- X'Access
-
X'Access yields an access value
that designates the object denoted by X. The type of X'Access is an access-to-object
type, as determined by the expected type. The expected type shall be
a general access type. X shall denote an aliased
view of an object, including possibly the current instance (see 8.6)
of a limited type within its definition, or a formal parameter or generic
formal object of a tagged type. The view denoted by the prefix
X shall satisfy the following additional requirements, presuming the
expected type for X'Access is the general access type A with designated
type D:
26
- If A is an access-to-variable
type, then the view shall be a variable; on the other hand, if A
is an access-to-constant type, the view may be either a constant or a
variable.
27/2
- The view shall not be a subcomponent
that depends on discriminants of a variable whose nominal subtype is
unconstrained, unless this subtype is indefinite, or the variable is
constrained by its initial value.
28/2
- If A is a named access
type and D is a tagged type, then the type of the view shall be
covered by D; if A is anonymous and D is tagged,
then the type of the view shall be either D'Class or a type covered
by D; if D is untagged, then the type of the view shall
be D, and either:
28.1/2
- the designated subtype
of A shall statically match the nominal subtype of the view; or
28.2/2
- D shall be discriminated
in its full view and unconstrained in any partial view, and the designated
subtype of A shall be unconstrained.
29
- The accessibility level of
the view shall not be statically deeper than that of the access type
A. In addition to the places where Legality Rules normally apply
(see 12.3), this rule applies also in the
private part of an instance of a generic unit.
30
- A
check is made that the accessibility level of X is not deeper than that
of the access type A. If this check fails, Program_Error is raised.
31
- If the nominal
subtype of X does not statically match the designated subtype of A,
a view conversion of X to the designated subtype is evaluated (which
might raise Constraint_Error — see 4.6)
and the value of X'Access designates that view.
32
The following attribute is defined for a prefix
P that denotes a subprogram:
33/2
- P'Access
-
P'Access yields an access value
that designates the subprogram denoted by P. The type of P'Access is
an access-to-subprogram type (S), as determined by the expected
type. The accessibility level of P shall not be statically
deeper than that of S. In addition to the
places where Legality Rules normally apply (see 12.3),
this rule applies also in the private part of an instance of a generic
unit. The profile of P shall be subtype-conformant with the designated
profile of S, and shall not be Intrinsic. If
the subprogram denoted by P is declared within a generic unit, and the
expression P'Access occurs within the body of that generic unit or within
the body of a generic unit declared within the declarative region of
the generic unit, then the ultimate ancestor of S shall be either
a non-formal type declared within the generic unit or an anonymous access
type of an access parameter.
34
85 The Unchecked_Access
attribute yields the same result as the Access attribute for objects,
but has fewer restrictions (see 13.10). There
are other predefined operations that yield access values: an allocator
can be used to create an object, and return an access value that designates
it (see 4.8); evaluating the literal null
yields a null access value that designates no entity at all (see 4.2).
35/2
86 The
predefined operations of an access type also include the assignment operation,
qualification, and membership tests. Explicit conversion is allowed between
general access types with matching designated subtypes; explicit conversion
is allowed between access-to-subprogram types with subtype conformant
profiles (see 4.6). Named
access types have predefined equality operators; anonymous access types
do not, but they can use the predefined equality operators for universal_access
(see 4.5.2).
36
87 The object or subprogram
designated by an access value can be named with a dereference, either
an explicit_dereference or an implicit_dereference.
See 4.1.
37
88 A call through the dereference
of an access-to-subprogram value is never a dispatching call.
38/2
89 The
Access attribute for subprograms and parameters of an anonymous access-to-subprogram
type may together be used to implement “downward closures”
— that is, to pass a more-nested subprogram as a parameter to a
less-nested subprogram, as might be appropriate for an iterator abstraction
or numerical integration. Downward closures can also be implemented using
generic formal subprograms (see 12.6). Note
that Unchecked_Access is not allowed for subprograms.
39
90 Note that using an access-to-class-wide
tagged type with a dispatching operation is a potentially more structured
alternative to using an access-to-subprogram type.
40
91 An implementation may
consider two access-to-subprogram values to be unequal, even though they
designate the same subprogram. This might be because one points directly
to the subprogram, while the other points to a special prologue that
performs an Elaboration_Check and then jumps to the subprogram. See 4.5.2.
Examples
41
Example of use
of the Access attribute:
42
Martha : Person_Name := new Person(F); -- see 3.10.1
Cars : array (1..2) of aliased Car;
...
Martha.Vehicle := Cars(1)'Access;
George.Vehicle := Cars(2)'Access;
Contents Index Search Related Documents Previous Next Legal