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