6.5 Return Statements
Syntax
Name Resolution Rules
Legality Rules
A return statement shall be within 
a callable construct, and it 
applies to the innermost callable 
construct or 
extended_return_statement 
that contains it. A return statement shall not be within a body that 
is within the construct to which the return statement applies.
 
If the result subtype of the function is class-wide, 
the accessibility level of the type of the subtype defined by the 
return_subtype_indication 
shall not be statically deeper than that of the master that elaborated 
the function body. 
 
  For any return statement 
that applies to a function body:
If the result subtype of the function is limited, 
then the 
expression 
of the return statement (if any) shall meet the restrictions described 
in 
7.5. 
 
If the result subtype of the function is class-wide, 
the accessibility level of the type of the 
expression 
(if any) of the return statement shall not be statically deeper than 
that of the master that elaborated the function body.
 
If the subtype determined by the 
expression 
of the 
simple_return_statement 
or by the 
return_subtype_indication 
has one or more access discriminants, the accessibility level of the 
anonymous access type of each access discriminant shall not be statically 
deeper than that of the master that elaborated the function body.
 
Static Semantics
Dynamic Semantics
   For the execution of an 
extended_return_statement, 
the 
subtype_indication 
or 
access_definition 
is elaborated. This creates the nominal subtype of the return object. 
If there is an 
expression, 
it is evaluated and converted to the nominal subtype (which might raise 
Constraint_Error — see 
4.6); 
the return object is created and the converted value is assigned to the 
return object. Otherwise, the return object is created and initialized 
by default as for a stand-alone object of its nominal subtype (see 
3.3.1). 
If the nominal subtype is indefinite, the return object is constrained 
by its initial value.
 A check 
is made that the value of the return object belongs to the function result 
subtype. Constraint_Error is raised if this check fails.
 
 
For the execution of a 
simple_return_statement, 
the 
expression 
(if any) is first evaluated, converted to the result subtype, and then 
is assigned to the anonymous 
return object. 
 
If the return object has any parts that are tasks, 
the activation of those tasks does not occur until after the function 
returns (see 
9.2). 
 
If the result type of a function is a specific tagged 
type, the tag of the return object is that of the result type. If the 
result type is class-wide, the tag of the return object is that of the 
value of the 
expression, 
unless the return object is defined by an 
extended_return_object_declaration 
with a 
subtype_indication 
that is specific, in which case it is that of the type of the 
subtype_indication. 
A check is made that the master of the type identified by the tag of 
the result includes the elaboration of the master that elaborated the 
function body. If this check fails, Program_Error is raised.
 
 
  If the 
result subtype of the function is defined by an 
access_definition 
designating a specific tagged type 
T, a check is made that the 
result value is null or the tag of the object designated by the result 
value identifies 
T. 
Constraint_Error is raised 
if this check fails. 
 
Paragraphs 9 through 
20 were deleted. 
 If any part of the specific type of the return object 
of a function (or coextension thereof) has one or more access discriminants 
whose value is not constrained by the result subtype of the function, 
a check is made that the accessibility level of the anonymous access 
type of each access discriminant, as determined by the 
expression 
or the 
return_subtype_indication 
of the return statement, is not deeper than the level of the master of 
the call (see 
3.10.2). If this check fails, 
Program_Error is raised. 
 
 In the case of a function, the 
function_call 
denotes a constant view of the return object. 
 
Implementation Permissions
 For a function call used to initialize a composite 
object with a constrained nominal subtype or used to initialize a return 
object that is built in place into such an object:
If the result subtype of the function is constrained, 
and conversion of an object of this subtype to the subtype of the object 
being initialized would raise Constraint_Error, then Constraint_Error 
may be raised before calling the function.
If the result subtype of the function is unconstrained, 
and a return statement is executed such that the return object is known 
to be constrained, and conversion of the return object to the subtype 
of the object being initialized would raise Constraint_Error, then Constraint_Error 
may be raised at the point of the call (after abandoning the execution 
of the function body). 
Examples
Examples of return 
statements: 
return Key_Value(Last_Index);   -- in a function body
return Node : Cell 
do           --
 in a function body, see 3.10.1 for Cell
   Node.Value := Result;
   Node.Succ := Next_Node;
end return;
 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe