Contents Index Previous Next
6.4.1 Parameter Associations
1
[
{parameter passing}
A parameter association defines the association between
an actual parameter and a formal parameter.]
Language Design Principles
1.a
The parameter passing rules for out
parameters are designed to ensure that the parts of a type that have implicit
initial values (see 3.3.1) don't become ``de-initialized''
by being passed as an out parameter.
Name Resolution Rules
2
The formal_parameter_selector_name
of a parameter_association shall
resolve to denote a parameter_specification
of the view being called.
3
{actual parameter (for a formal
parameter)} The
actual parameter
is either the
explicit_actual_parameter
given in a
parameter_association
for a given formal parameter, or the corresponding
default_expression
if no
parameter_association is given
for the formal parameter.
{expected type (actual parameter)}
The expected type for an actual parameter is the
type of the corresponding formal parameter.
3.a
To be honest: The corresponding
default_expression is the one of
the corresponding formal parameter in the profile of the view denoted
by the name or prefix
of the call.
4
If the mode is in, the actual is interpreted
as an expression; otherwise, the
actual is interpreted only as a name,
if possible.
4.a
Ramification: This formally
resolves the ambiguity present in the syntax rule for explicit_actual_parameter.
Note that we don't actually require that the actual be a name
if the mode is not in; we do that below.
Legality Rules
5
If the mode is in out or out, the
actual shall be a name that denotes
a variable.
5.a
Discussion: We no longer
need ``or a type_conversion whose
argument is the name of a variable,''
because a type_conversion is now
a name, and a type_conversion
of a variable is a variable.
5.b
Reason:
The requirement that the actual be a (variable) name
is not an overload resolution rule, since we don't want the difference
between expression and name
to be used to resolve overloading. For example:
5.c
procedure Print(X : in Integer; Y : in Boolean := True);
procedure Print(Z : in out Integer);
. . .
Print(3); -- Ambiguous!
5.d
The above call to Print is ambiguous
even though the call is not compatible with the second Print which requires
an actual that is a (variable) name
(``3'' is an expression, not a name).
This requirement is a legality rule, so overload resolution fails before
it is considered, meaning that the call is ambiguous.
6
The type of the actual parameter associated
with an access parameter shall be convertible (see
4.6)
to its anonymous access type.
{convertible (required) [partial]}
Dynamic Semantics
7
{evaluation
(parameter_association) [partial]} For
the evaluation of a
parameter_association:
8
- The actual parameter is first evaluated.
9
- For an access parameter, the access_definition
is elaborated, which creates the anonymous access type.
10
- For a parameter [(of any mode)] that is passed by reference (see
6.2), a view conversion of the actual parameter
to the nominal subtype of the formal parameter is evaluated, and the formal
parameter denotes that conversion. {implicit subtype conversion
(parameter passing) [partial]}
10.a
Discussion: We are always
allowing sliding, even for [in] out by-reference parameters.
11
- {assignment operation (during evaluation of a
parameter_association)} For an in or
in out parameter that is passed by copy (see 6.2),
the formal parameter object is created, and the value of the actual parameter
is converted to the nominal subtype of the formal parameter and assigned to
the formal. {implicit subtype conversion (parameter passing)
[partial]}
11.a
Ramification: The conversion
mentioned here is a value conversion.
12
- For an out parameter that is passed by copy, the
formal parameter object is created, and:
13
- For an access type, the formal parameter is initialized
from the value of the actual, without a constraint check;
13.a
Reason: This preserves
the Language Design Principle that an object of an access type is always
initialized with a ``reasonable'' value.
14
- For a composite type with discriminants or that has implicit initial
values for any subcomponents (see 3.3.1), the
behavior is as for an in out parameter passed by copy.
14.a
Reason: This ensures that
no part of an object of such a type can become ``de-initialized'' by
being part of an out parameter.
14.b
Ramification: This includes
an array type whose component type is an access type, and a record type
with a component that has a default_expression,
among other things.
15
- For any other type, the formal parameter is uninitialized.
If composite, a view conversion of the actual parameter to the nominal
subtype of the formal is evaluated [(which might raise Constraint_Error)],
and the actual subtype of the formal is that of the view conversion.
If elementary, the actual subtype of the formal is given by its nominal
subtype.
15.a
Ramification: This case
covers scalar types, and composite types whose subcomponent's subtypes
do not have any implicit initial values. The view conversion for composite
types ensures that if the lengths don't match between an actual and a
formal array parameter, the Constraint_Error is raised before the call,
rather than after.
16
{constrained (object) [partial]}
{unconstrained (object) [partial]}
A formal parameter of mode
in out or
out
with discriminants is constrained if either its nominal subtype or the
actual parameter is constrained.
17
{parameter copy back}
{copy back of parameters}
{parameter assigning back}
{assigning back of parameters}
{assignment operation (during parameter
copy back)} After normal completion and
leaving of a subprogram, for each
in out or
out parameter
that is passed by copy, the value of the formal parameter is converted
to the subtype of the variable given as the actual parameter and assigned
to it.
{implicit subtype conversion (parameter passing)
[partial]} These conversions and assignments
occur in an arbitrary order.
17.a
Ramification: The conversions mentioned
above during parameter passing might raise Constraint_Error -- (see 4.6).
17.b
Ramification: If any conversion
or assignment as part of parameter passing propagates an exception, the
exception is raised at the place of the subprogram call; that is, it
cannot be handled inside the subprogram_body.
17.c
Proof: Since these checks
happen before or after executing the subprogram_body,
the execution of the subprogram_body
does not dynamically enclose them, so it can't handle the exceptions.
17.d
Discussion: The variable we're talking
about is the one denoted by the variable_name
given as the explicit_actual_parameter.
If this variable_name is a type_conversion,
then the rules in 4.6 for assigning to a view conversion
apply. That is, if X is of subtype S1, and the actual is S2(X), the above-mentioned
conversion will convert to S2, and the one mentioned in 4.6
will convert to S1.
Extensions to Ada 83
17.e
{extensions to Ada 83}
In Ada 95, a program can rely on the fact that passing
an object as an out parameter does not ``de-initialize'' any parts
of the object whose subtypes have implicit initial values. (This generalizes
the RM83 rule that required copy-in for parts that were discriminants
or of an access type.)
Wording Changes from Ada 83
17.f
We have eliminated the subclause
on Default Parameters, as it is subsumed by earlier clauses and subclauses.
Contents Index Previous Next Legal