E.2.2 Remote Types Library Units
A remote types library unit supports the definition
of types intended for use in communication between active partitions.
Legality Rules
When
the library unit aspect (see
13.1.1) Remote_Types
of a library unit is True, the library unit is a
remote types library
unit. The following restrictions apply to such a library unit:
it shall be preelaborable;
it shall depend semantically only on declared pure
library_items,
shared passive library units, other remote types library units, or preelaborated
normal library units that are mentioned only in private with clauses;
it shall not contain the declaration of any variable
within the visible part of the library unit;
the full view of each type declared in the visible
part of the library unit that has any available stream attributes shall
support external streaming (see
13.13.2).
A
named access type declared in the visible part of a remote types or remote
call interface library unit is called a
remote access type.
Such
a type shall be:
an access-to-subprogram type, or
a general access type that designates a class-wide
limited private type, a class-wide limited interface type, or a class-wide
private extension all of whose ancestors are either private extensions,
limited interface types, or limited private types.
A type that is derived from a remote access type
is also a remote access type.
A remote access-to-subprogram type shall not be
nonblocking (see
9.5).
The following restrictions
apply to the use of a remote access-to-subprogram type:
A value of a remote access-to-subprogram type shall
be converted only to or from another (subtype-conformant) remote access-to-subprogram
type;
The
prefix
of an Access
attribute_reference
that yields a value of a remote access-to-subprogram type shall statically
denote a (subtype-conformant) remote subprogram.
The following restrictions
apply to the use of a remote access-to-class-wide type:
The primitive subprograms of the corresponding
specific type shall only have access parameters if they are controlling
formal parameters. The primitive functions of the corresponding specific
type shall only have an access result if it is a controlling access result.
Each noncontrolling formal parameter and noncontrolling result type shall
support external streaming (see
13.13.2);
The corresponding specific type shall not have
a primitive procedure with the Synchronization aspect specified unless
the
synchronization_kind
is Optional (see
9.5);
A value of a remote access-to-class-wide type shall
be explicitly converted only to another remote access-to-class-wide type;
A value of a remote access-to-class-wide type shall
be dereferenced (or implicitly converted to an anonymous access type)
only as part of a dispatching call to a primitive operation of the designated
type where the value designates a controlling operand of the call (see
E.4, “
Remote Subprogram
Calls”);
A controlling access result value for a primitive
function with any controlling operands of the corresponding specific
type shall either be explicitly converted to a remote access-to-class-wide
type or be part of a dispatching call where the value designates a controlling
operand of the call;
The Storage_Pool attribute is not defined for a
remote access-to-class-wide type; the expected type for an
allocator
shall not be a remote access-to-class-wide type. A remote access-to-class-wide
type shall not be an actual parameter for a generic formal access type.
The Storage_Size attribute of a remote access-to-class-wide type yields
0. The Storage_Pool and Storage_Size aspects shall not be specified for
a remote access-to-class-wide type.
Erroneous Execution
Execution is erroneous if some operation (other
than the initialization or finalization of the object) modifies the value
of a constant object declared in the visible part of a remote types package.
NOTE 1 A remote types library unit
is not necessarily pure, and the types it defines can include levels
of indirection implemented by using access types. User-specified Read
and Write attributes (see
13.13.2) provide
for sending values of such a type between active partitions, with Write
marshalling the representation, and Read unmarshalling any levels of
indirection.
NOTE 2 The value of a remote access-to-class-wide
limited interface can designate an object of a nonlimited type derived
from the interface.
NOTE 3 A remote access type can designate
a class-wide synchronized, protected, or task interface type.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe