12.4 Formal Objects
1
A generic
formal object can be used to pass a value or variable to a generic unit.
Syntax
2/2
formal_object_declaration ::=
defining_identifier_list :
mode [
null_exclusion]
subtype_mark [:=
default_expression];
defining_identifier_list :
mode access_definition [:=
default_expression];
Name Resolution Rules
3
The expected type for the
default_expression,
if any, of a formal object is the type of the formal object.
4
For a generic formal object of
mode
in, the expected type for the actual is the type of the formal.
5/2
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
6
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.
7
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).
8/2
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:
8.1/2
- shall both be access-to-object types
with statically matching designated subtypes and with both or neither
being access-to-constant types; or
8.2/2
- shall both be access-to-subprogram
types with subtype conformant designated profiles.
8.3/2
For a formal_object_declaration
with a null_exclusion or an access_definition
that has a null_exclusion:
8.4/2
- 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;
8.5/2
- 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
9/2
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.
10/2
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
11
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.
12
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.