Annotated Ada Reference ManualLegal Information
Contents   Index   References   Search   Previous   Next 

6.3 Subprogram Bodies

1
[A subprogram_body specifies the execution of a subprogram.] 

Syntax

2/3
{AI95-00218-03} {AI05-0183-1} subprogram_body ::= 
    [overriding_indicator]

    subprogram_specification
       [aspect_specification]
 is
       declarative_part
    begin
        handled_sequence_of_statements
    end [designator];
3
If a designator appears at the end of a subprogram_body, it shall repeat the defining_designator of the subprogram_specification.

Legality Rules

4
[In contrast to other bodies,] a subprogram_body need not be the completion of a previous declaration[, in which case the body declares the subprogram]. If the body is a completion, it shall be the completion of a subprogram_declaration or generic_subprogram_declaration. The profile of a subprogram_body that completes a declaration shall conform fully to that of the declaration.

Static Semantics

5
A subprogram_body is considered a declaration. It can either complete a previous declaration, or itself be the initial declaration of the subprogram. 

Dynamic Semantics

6
The elaboration of a non-generic subprogram_body has no other effect than to establish that the subprogram can from then on be called without failing the Elaboration_Check. 
6.a
Ramification: See 12.2 for elaboration of a generic body. Note that protected subprogram_bodies never get elaborated; the elaboration of the containing protected_body allows them to be called without failing the Elaboration_Check. 
7
[The execution of a subprogram_body is invoked by a subprogram call.] For this execution the declarative_part is elaborated, and the handled_sequence_of_statements is then executed. 

Examples

8
Example of procedure body: 
9
procedure Push(E : in Element_Type; S : in out Stack) is
begin
   if S.Index = S.Size then
      raise Stack_Overflow;
   else
      S.Index := S.Index + 1;
      S.Space(S.Index) := E;
   end if;
end Push;
10
Example of a function body: 
11
function Dot_Product(Left, Right : Vector) return Real is
   Sum : Real := 0.0;
begin
   Check(Left'First = Right'First and Left'Last = Right'Last);
   for J in Left'Range loop
      Sum := Sum + Left(J)*Right(J);
   end loop;
   return Sum;
end Dot_Product;

Extensions to Ada 83

11.a
A renaming_declaration may be used instead of a subprogram_body.

Wording Changes from Ada 83

11.b
The syntax rule for subprogram_body now uses the syntactic category handled_sequence_of_statements.
11.c
The declarative_part of a subprogram_body is now required; that doesn't make any real difference, because a declarative_part can be empty.
11.d
We have incorporated some rules from RM83-6.5 here.
11.e
RM83 forgot to restrict the definition of elaboration of a subprogram_body to non-generics. 

Wording Changes from Ada 95

11.f/2
{AI95-00218-03} Overriding_indicator is added to subprogram_body.

Extensions to Ada 2005

11.g/3
{AI05-0183-1} An optional aspect_specification can be used in a subprogram_body. This is described in 13.3.1. 

Contents   Index   References   Search   Previous   Next 
Ada-Europe Ada 2005 and 2012 Editions sponsored in part by Ada-Europe