6.4 Subprogram Calls
Syntax
Name Resolution Rules
A subprogram call shall contain at most one association
for each formal parameter. Each formal parameter without an association
shall have a
default_expression
(in the profile of the view denoted by the
name
or
prefix).
This rule is an overloading rule (see
8.6).
Dynamic Semantics
For the execution of a subprogram
call, the
name
or
prefix
of the call is evaluated, and each
parameter_association
is evaluated (see
6.4.1). If a
default_expression
is used, an implicit
parameter_association
is assumed for this rule. These evaluations are done in an arbitrary
order. The
subprogram_body
is then executed, or a call on an entry or protected subprogram is performed
(see
3.9.2). Finally, if the subprogram completes
normally, then after it is left, any necessary assigning back of formal
to actual parameters occurs (see
6.4.1).
If the
name
or
prefix
of a subprogram call denotes a prefixed view (see
4.1.3),
the subprogram call is equivalent to a call on the underlying subprogram,
with the first actual parameter being provided by the
prefix
of the prefixed view (or the Access attribute of this
prefix
if the first formal parameter is an access parameter), and the remaining
actual parameters given by the
actual_parameter_part,
if any.
The exception Program_Error is
raised at the point of a
function_call
if the function completes normally without executing a return statement.
A
function_call
denotes a constant, as defined in
6.5; the
nominal subtype of the constant is given by the nominal subtype of the
function result.
Examples
Examples of procedure
calls:
Traverse_Tree; --
see 6.1
Print_Header(128, Title, True); --
see 6.1
Switch(From => X, To => Next); --
see 6.1
Print_Header(128, Header => Title, Center => True); --
see 6.1
Print_Header(Header => Title, Center => True, Pages => 128); --
see 6.1
Examples of function
calls:
Dot_Product(U, V) --
see 6.1 and 6.3
Clock --
see 9.6
F.
all --
presuming F is of an access-to-subprogram type — see 3.10
Examples of procedures
with default expressions:
procedure Activate(Process : in Process_Name;
After : in Process_Name := No_Process;
Wait : in Duration := 0.0;
Prior : in Boolean := False);
procedure Pair(Left, Right :
in Person_Name :=
new Person); --
see 3.10.1
Examples of their
calls:
Activate(X);
Activate(X, After => Y);
Activate(X, Wait => 60.0, Prior => True);
Activate(X, Y, 10.0, False);
Pair;
Pair(Left => new Person, Right => new Person);
Examples
Examples of overloaded
subprograms:
procedure Put(X : in Integer);
procedure Put(X : in String);
procedure Set(Tint : in Color);
procedure Set(Signal : in Light);
Examples of their
calls:
Put(28);
Put("no possible ambiguity here");
Set(Tint => Red);
Set(Signal => Red);
Set(Color'(Red));
-- Set(Red) would be ambiguous since Red may
-- denote a value either of type Color or of type Light