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