6.1 Subprogram Declarations
1
Syntax
2/3
3/2
4/2
4.1/2
4.2/2
5
6
7
8
9
10/2
{
AI95-00395-01}
The sequence of characters in an
operator_symbol
shall
form a reserved word, a delimiter, or compound
delimiter that corresponds correspond
to an operator belonging to one of the six
categories classes
of operators defined in clause
4.5(spaces
are not allowed and the case of letters is not significant).
10.a/3
Reason: {
AI95-00395-01}
{
AI05-0090-1}
The “sequence of characters” of the
string literal of the operator is a technical term (see 2.6),
and does not include the surrounding quote characters. As defined in
2.2, lexical elements are “formed”
from a sequence of characters. Spaces are not allowed, and upper and
lower case is not significant. See 2.2 and 2.9 for
rules related to the use of other_format characters
in delimiters and reserved words.
11
12
13/2
14
15/3
16
mode ::= [
in] |
in out |
out
Name Resolution Rules
17
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
18/3
{
AI05-0143-1}
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.
The formal parameters of a function, if any, shall have the mode in.
18.a/3
This paragraph
was deleted.Ramification: {
AI05-0143-1}
Access parameters are permitted. This restriction
to in parameters is primarily a methodological restriction, though
it also simplifies implementation for some compiler technologies.
19
20/3
20.a/3
Ramification: {
AI95-00348-01}
{
AI05-0177-1}
Abstract subprograms
, and null procedures, and expression functions are not declared by
subprogram_declarations,
and so do not require completion
(although the
latter two can be completions). Protected subprograms are
declared by
subprogram_declarations,
and so require completion. Note that an abstract subprogram is a subprogram,
a null procedure is a subprogram, an expression
function is a subprogram, and a protected subprogram is a subprogram,
but a generic subprogram is not a subprogram.
20.b/3
Proof: {
AI05-0229-1}
When the Import aspect is True for any entity,
no completion is allowed (see B.1).
21
21.a
Static Semantics
22
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.
23/2
23.1/3
24/2
{
AI95-00231-01}
{
AI95-00254-01}
{
AI95-00318-02}
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 general
access-to-variable 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. ]
24.a/2
Discussion: {
AI95-00318-02}
Access result types have normal accessibility and
thus don't have any special properties worth noting here.
25
The
subtypes of a profile are:
26
For any non-access parameters, the nominal subtype
of the parameter.
27/2
{
AI95-00254-01}
For any access parameters
of an access-to-object
type, the designated subtype of the parameter type.
27.1/3
{
AI95-00254-01}
{
AI05-0164-1}
For any access parameters of an access-to-subprogram
type, the subtypes of the designated profile
of the parameter type.
28/2
{
AI95-00231-01}
{
AI95-00318-02}
For any non-access result, the nominal subtype
of the function result. For any result,
the result subtype.
28.1/2
{
AI95-00318-02}
For any access result type of an access-to-object
type, the designated subtype of the result type.
28.2/3
{
AI95-00318-02}
{
AI05-0164-1}
For any access result type of an access-to-subprogram
type, the subtypes of the designated profile
of the result type.
29
[
The
types of a profile
are the types of those subtypes.]
30/3
30.1/2
Dynamic Semantics
31/2
32
33
34
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.
35
4 Subprograms can be called recursively
and can be called concurrently from multiple tasks.
Examples
36
Examples of subprogram
declarations:
37
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
38
function Random
return Probability; --
see 3.5.7
39
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
40
function "*"(Left, Right : Matrix)
return Matrix; --
see 3.6
41
Examples of in
parameters with default expressions:
42
procedure Print_Header(Pages :
in Natural;
Header :
in Line := (1 .. Line'Last => ' '); --
see 3.6
Center :
in Boolean := True);
Extensions to Ada 83
42.a
42.b
Program units that are library units may have
a
parent_unit_name
to indicate the parent of a child (see Section 10).
Wording Changes from Ada 83
42.c
We have incorporated the rules from RM83-6.5,
“Function Subprograms” here and in
6.3,
“
Subprogram Bodies”
42.d
We have incorporated the definitions of RM83-6.6,
“Parameter and Result Type Profile - Overloading of Subprograms”
here.
42.e
Extensions to Ada 95
42.f/2
42.g/2
42.h/2
{
AI95-00318-02}
The return type of a function can be an anonymous
access type.
Wording Changes from Ada 95
42.i/2
{
AI95-00254-01}
A description of the purpose of anonymous access-to-subprogram
parameters and the definition of the profile of subprograms containing
them was added.
42.j/2
42.k/2
42.l/2
Extensions to Ada 2005
42.m/3
{
AI05-0142-4}
Parameters can now be explicitly
aliased, allowing parts of function results to designate parameters and
forcing by-reference parameter passing.
42.n/3
{
AI05-0143-1}
The parameters of a function can now have any mode.
42.o/3
Wording Changes from Ada 2005
42.p/3
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe