12.4 Formal Objects
A generic
formal object can be used to pass a value or variable to a generic unit.
Syntax
Name Resolution Rules
The expected type for the
default_expression,
if any, of a formal object is the type of the formal object.
For a generic formal object of
mode
in, the expected type for the actual is the type of the formal.
For a generic formal object of mode
in out,
the type of the actual shall resolve to the type determined by the
subtype_mark,
or for a
formal_object_declaration
with an
access_definition,
to a specific anonymous access type. If the anonymous access type is
an access-to-object type, the type of the actual shall have the same
designated type as that of the
access_definition.
If the anonymous access type is an access-to-subprogram type, the type
of the actual shall have a designated profile which is type conformant
with that of the
access_definition.
Legality Rules
If a generic formal object has a
default_expression,
then the mode shall be
in (either explicitly or by default); otherwise,
its mode shall be either
in or
in out.
For a generic formal object of mode
in, the
actual shall be an
expression.
For a generic formal object of mode
in out, the actual shall be
a
name that
denotes a variable for which renaming is allowed (see
8.5.1).
In the case where the
type of the formal is defined by an
access_definition,
the type of the actual and the type of the formal:
shall both be access-to-object types with statically
matching designated subtypes and with both or neither being access-to-constant
types; or
shall both be access-to-subprogram types with subtype
conformant designated profiles.
if the actual matching the
formal_object_declaration
denotes the generic formal object of another generic unit
G, and
the instantiation containing the actual occurs within the body of
G
or within the body of a generic unit declared within the declarative
region of
G, then the declaration of the formal object of
G
shall have a
null_exclusion;
otherwise, the subtype of the actual matching the
formal_object_declaration
shall exclude null.
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.
Static Semantics
A
formal_object_declaration
declares a generic formal object. The default mode is
in.
For
a formal object of mode
in, the nominal subtype is the one denoted
by the
subtype_mark
or
access_definition
in the declaration of the formal.
For a formal object
of mode
in out, its type is determined by the
subtype_mark
or
access_definition
in the declaration; its nominal subtype is nonstatic, even if the
subtype_mark
denotes a static subtype; for a composite type, its nominal subtype is
unconstrained if the first subtype of the type is unconstrained, even
if the
subtype_mark
denotes a constrained subtype.
In
an instance, a
formal_object_declaration
of mode
in is a
full constant declaration and declares
a new stand-alone constant object whose initialization expression is
the actual, whereas a
formal_object_declaration
of mode
in out declares a view whose properties are identical
to those of the actual.
Dynamic Semantics
For the evaluation
of a
generic_association
for a formal object of mode
in, a constant object is created,
the value of the actual parameter is converted to the nominal subtype
of the formal object, and assigned to the object, including any value
adjustment — see
7.6.
6 The constraints that apply to a generic
formal object of mode
in out are those of the corresponding generic
actual parameter (not those implied by the
subtype_mark
that appears in the
formal_object_declaration).
Therefore, to avoid confusion, it is recommended that the name of a first
subtype be used for the declaration of such a formal object.
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe