6.2 Formal Parameter Modes
Static Semantics
A 
parameter is passed either 
by copy or 
by reference. When 
a parameter is passed by copy, the formal parameter denotes a separate 
object from the actual parameter, and any information transfer between 
the two occurs only before and after executing the subprogram. When a 
parameter is passed by reference, the formal parameter denotes (a view 
of) the object denoted by the actual parameter; reads and updates of 
the formal parameter directly reference the actual parameter object.
 
A type is a 
by-copy type 
if it is an elementary type, or if it is a descendant of a private type 
whose full type is a by-copy type. A parameter of a by-copy type is passed 
by copy, unless the formal parameter is explicitly aliased.
 
A 
type is a 
by-reference type if it is a descendant of one of the 
following: 
 
a tagged type;
a task or protected type;
an explicitly limited record type; 
a composite type with a subcomponent of a by-reference 
type;
a private type whose full type is a by-reference 
type. 
 A parameter of a by-reference type is passed by 
reference, as is an explicitly aliased parameter of any type. 
Each 
value of a by-reference type has an associated object. For a parenthesized 
expression, 
qualified_expression, 
or view conversion, this object is the one associated with the operand. 
For a value conversion, the associated object is the anonymous result 
object if such an object is created (see 
4.6); 
otherwise it is the associated object of the operand. For a 
conditional_expression, 
this object is the one associated with the evaluated 
dependent_expression.
 
 For other parameters, it is 
unspecified whether the parameter is passed by copy or by reference. 
 
Bounded (Run-Time) Errors
 If 
one 
name denotes 
a part of a formal parameter, and a second 
name 
denotes a part of a distinct formal parameter or an object that is not 
part of a formal parameter, then the two 
names 
are considered 
distinct access paths. If an object is of a type 
for which the parameter passing mechanism is not specified and is not 
an explicitly aliased parameter, then it is a bounded error to assign 
to the object via one access path, and then read the value of the object 
via a distinct access path, unless the first access path denotes a part 
of a formal parameter that no longer exists at the point of the second 
access (due to leaving the corresponding callable construct). 
The 
possible consequences are that Program_Error is raised, or the newly 
assigned value is read, or some old value of the object is read. 
 
6  The mode of a formal parameter describes 
the direction of information transfer to or from the 
subprogram_body 
(see 
6.1).
 
7  A formal parameter of mode 
in 
is a constant view (see 
3.3); it cannot be 
updated within the 
subprogram_body.
 
8  A formal parameter of mode 
out 
might be uninitialized at the start of the 
subprogram_body 
(see 
6.4.1). 
 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe