1
A parameter_specification declares a formal parameter of mode in, in out, or out.
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
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.
4
A type is a by−reference type if it is a descendant of one of the following:
5
6
7
8
9
10
A parameter of a by−reference type is passed by reference. Each value of a by−reference type has an associated object. For a parenthesized expression, qualified_expression, or type_conversion, this object is the one associated with the operand.
11
For parameters of other types, it is unspecified whether the parameter is passed by copy or by reference.
12
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, 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.
NOTES
13
5 A formal parameter of mode in is a constant view (see 3.3); it cannot be updated within the subprogram_body.