6.1 Subprogram Declarations
Syntax
This paragraph 
was deleted.
The sequence of characters in an 
operator_symbol 
shall form a reserved word, a delimiter, or compound delimiter that corresponds 
to an operator belonging to one of the six categories of operators defined 
in subclause 
4.5.
 
mode ::= [
in] | 
in out | 
out 
Name Resolution Rules
A 
formal parameter is 
an object directly visible within a 
subprogram_body 
that represents the actual parameter passed to the subprogram in a call; 
it is declared by a 
parameter_specification. 
For a formal parameter, the expected type for its 
default_expression, 
if any, is that of the formal parameter. 
 
Legality Rules
 The 
parameter mode of 
a formal parameter conveys the direction of information transfer with 
the actual parameter: 
in, 
in out, or 
out. Mode 
in 
is the default, and is the mode of a parameter defined by an 
access_definition. 
 
Static Semantics
The 
profile of (a view 
of) a callable entity is either a 
parameter_profile 
or 
parameter_and_result_profile; 
it embodies information about the interface to that entity — for 
example, the profile includes information about parameters passed to 
the callable entity. All callable entities have a profile — enumeration 
literals, other subprograms, and entries. An access-to-subprogram type 
has a designated profile. Associated with a profile is a calling convention. 
A 
subprogram_declaration 
declares a procedure or a function, as indicated by the initial reserved 
word, with name and profile as given by its specification.
 
   An 
explicitly 
aliased parameter is a formal parameter whose 
parameter_specification 
includes the reserved word 
aliased.
 
 An 
access parameter is 
a formal 
in parameter specified by an 
access_definition. 
An 
access result type is a function result 
type specified by an 
access_definition. 
An access parameter or result type is of an anonymous access type (see 
3.10). Access parameters of an access-to-object 
type allow dispatching calls to be controlled by access values. Access 
parameters of an access-to-subprogram type permit calls to subprograms 
passed as parameters irrespective of their accessibility level.
 
The 
subtypes of a profile are: 
 
For any non-access parameters, the nominal subtype 
of the parameter.
For any access parameters of an access-to-object 
type, the designated subtype of the parameter type.
For any access parameters of an access-to-subprogram 
type, the subtypes of the designated profile of the parameter type.
For any non-access result, the nominal subtype 
of the function result.
For any access result type of an access-to-object 
type, the designated subtype of the result type.
For any access result type of an access-to-subprogram 
type, the subtypes of the designated profile of the result type.
The 
types of a profile 
are the types of those subtypes.
 
Dynamic Semantics
3  The evaluation of 
default_expressions 
is caused by certain calls, as described in 
6.4.1. 
They are not evaluated during the elaboration of the subprogram declaration.
 
4  Subprograms can be called recursively 
and can be called concurrently from multiple tasks. 
Examples
Examples of subprogram 
declarations: 
procedure Traverse_Tree;
procedure Increment(X : 
in out Integer);
procedure Right_Indent(Margin : 
out Line_Size);          --
  see 3.5.4
procedure Switch(From, To : 
in out Link);                --
  see 3.10.1 
function Random 
return Probability;                      --
  see 3.5.7 
function Min_Cell(X : Link) 
return Cell;                 --
  see 3.10.1
function Next_Frame(K : Positive) 
return Frame;          --
  see 3.10
function Dot_Product(Left, Right : Vector) 
return Real;  --
  see 3.6
function Find(B : 
aliased in out Barrel; Key : String) 
return Real;
                                                         --
  see 4.1.5 
function "*"(Left, Right : Matrix) 
return Matrix;        --
  see 3.6 
Examples of in 
parameters with default expressions: 
procedure Print_Header(Pages  : 
in Natural;
            Header : 
in Line    :=  (1 .. Line'Last => ' ');  --
  see 3.6
            Center : 
in Boolean := True);
 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe