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 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. In other cases, the object associated with the
evaluated operative constituent of the
name
or
expression
(see
4.4) determines its associated object.
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.
NOTE 1 The mode of a formal parameter
describes the direction of information transfer to or from the
subprogram_body
(see
6.1).
NOTE 2 A formal parameter of mode
in is a constant view (see
3.3); it
cannot be updated within the
subprogram_body.
NOTE 3 A formal parameter of mode
out can be uninitialized at the start of the
subprogram_body
(see
6.4.1).
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe