Ada Reference Manual (Ada 2022) — Legal Information

# 6.2 Formal Parameter Modes

1
A parameter_specification declares a formal parameter of mode in, in out, or out.

#### Static Semantics

2
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.
3/3
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.
4
A type is a by-reference type if it is a descendant of one of the following:
5
a tagged type;
6
a task or protected type;
7/3
an explicitly limited record type;
8
a composite type with a subcomponent of a by-reference type;
9
a private type whose full type is a by-reference type.
10/5
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.
11/3
For other parameters, it is unspecified whether the parameter is passed by copy or by reference.

#### Bounded (Run-Time) Errors

12/3
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.
13/4
NOTE 1 The mode of a formal parameter describes the direction of information transfer to or from the subprogram_body (see 6.1).
14/4
NOTE 2 A formal parameter of mode in is a constant view (see 3.3); it cannot be updated within the subprogram_body.
15/5
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