- (1)
- A value of an access type (an access value) provides indirect access to
the object or subprogram it designates. Depending on its type, an access value
can designate either subprograms, objects created by allocators (see
4.8), or more generally aliased objects of an appropriate type.
(2)
access_type_definition ::=
access_to_object_definition
| access_to_subprogram_definition
(3)
access_to_object_definition ::=
access [general_access_modifier] subtype_indication
(4)
general_access_modifier ::= all | constant
(5)
access_to_subprogram_definition ::=
access [protected] procedure parameter_profile
| access [protected] function parameter_and_result_profile
(6)
access_definition ::= access subtype_mark
Static Semantics
- (7)
- There are two kinds of access types, access-to-object types, whose values
designate objects, and access-to-subprogram types, whose values designate
subprograms. Associated with an access-to-object type is a storage pool; several
access types may share the same storage pool. A storage pool is an area of
storage used to hold dynamically allocated objects (called pool elements)
created by allocators; storage pools are described further in
13.11, ``Storage Management''.
- (8)
- Access-to-object types are further subdivided into pool-specific access
types, whose values can designate only the elements of their associated
storage pool, and general access types, whose values can designate the
elements of any storage pool, as well as aliased objects created by
declarations rather than allocators, and aliased subcomponents of other
objects.
- (9)
- A view of an object is defined to be aliased if it is defined by an object_declaration
or component_definition with the reserved word aliased, or by a renaming of
an aliased view. In addition, the dereference of an access-to-object value
denotes an aliased view, as does a view conversion (see
4.6) of an aliased view. Finally, the current instance of a limited type,
and a formal parameter or generic formal object of a tagged type are defined
to be aliased. Aliased views are the ones that can be designated by an access
value. If the view defined by an object_declaration is aliased, and the type
of the object has discriminants, then the object is constrained; if its nominal
subtype is unconstrained, then the object is constrained by its initial value.
Similarly, if the object created by an allocator has discriminants, the object
is constrained, either by the designated subtype, or by its initial value.
- (10)
- An access_to_object_definition defines an access-to-object type and its
first subtype; the subtype_indication defines the designated subtype of the
access type. If a general_access_modifier appears, then the access type is a
general access type. If the modifier is the reserved word constant, then the
type is an access-to-constant type; a designated object cannot be updated
through a value of such a type. If the modifier is the reserved word all,
then the type is an access-to-variable type; a designated object can be both
read and updated through a value of such a type. If no general_access_modifier appears in the access_to_object_definition, the access type is a
pool-specific access-to-variable type.
- (11)
- An access_to_subprogram_definition defines an access-to-subprogram type
and its first subtype; the parameter_profile or parameter_and_result_profile
defines the designated profile of the access type. There is a calling convention
associated with the designated profile; only subprograms with this calling
convention can be designated by values of the access type. By default, the
calling convention is ``protected'' if the reserved word protected appears,
and ``Ada'' otherwise. See Annex B for how to override
this default.
- (12)
- An access_definition defines an anonymous general access-to-variable type;
the subtype_mark denotes its designated subtype. An access_definition is used
in the specification of an access discriminant (see 3.7)
or an access parameter (see 6.1).
- (13)
- For each (named) access type, there is a literal null which has a null access
value designating no entity at all. The null value of a named access type
is the default initial value of the type. Other values of an access type are
obtained by evaluating an attribute_reference for the Access or Unchecked_Access
attribute of an aliased view of an object or non-intrinsic subprogram, or,
in the case of a named access-to-object type, an allocator, which returns
an access value designating a newly created object (see
3.10.2).
- (14)
- All subtypes of an access-to-subprogram type are constrained. The first
subtype of a type defined by an access_type_definition or an access_to_object_definition is unconstrained if the designated subtype is an
unconstrained array or discriminated type; otherwise it is constrained.
Dynamic Semantics
- (15)
- A composite_constraint is compatible with an unconstrained access
subtype if it is compatible with the designated subtype. An access value
satisfies a composite_constraint of an access subtype if it equals the null
value of its type or if it designates an object whose value satisfies the
constraint.
- (16)
- The elaboration of an access_type_definition creates the access type and
its first subtype. For an access-to-object type, this elaboration includes
the elaboration of the subtype_indication, which creates the designated
subtype.
- (17)
- The elaboration of an access_definition creates an anonymous general
access-to-variable type (this happens as part of the initialization of an
access parameter or access discriminant).
-
- (18)
(77) Access values are called ``pointers'' or ``references'' in some
other languages.
- (19)
(78) Each access-to-object type has an associated storage pool; several
access types can share the same pool. An object can be created in the storage
pool of an access type by an allocator (see 4.8)
for the access type. A storage pool (roughly) corresponds to what some other
languages call a ``heap.'' See 13.11 for a discussion
of pools.
- (20)
(79) Only index_constraints and discriminant_constraints can be applied
to access types (see 3.6.1 and 3.7.1).
Examples
- (21)
- Examples of access-to-object types:
(22)
type Peripheral_Ref is access Peripheral; -- see 3.8.1
type Binop_Ptr is access all Binary_Operation'Class;
-- general access-to-class-wide,see 3.9.1
- (23)
- Example of an access subtype:
(24)
subtype Drum_Ref is Peripheral_Ref(Drum); -- see 3.8.1
- (25)
- Example of an access-to-subprogram type:
(26)
type Message_Procedure is access procedure (M : in String := "Error!");
procedure Default_Message_Procedure(M : in String);
Give_Message : Message_Procedure := Default_Message_Procedure'Access;
...
procedure Other_Procedure(M : in String);
...
Give_Message := Other_Procedure'Access;
...
Give_Message("File not found."); -- call with parameter (.all is optional)
Give_Message.all; -- call with no parameters
Subclauses
- Incomplete Type Declarations
- Operations of Access Types
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12