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 can 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
of the return statement, 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.
A check is performed that the return value satisfies
the predicates of the return subtype. If this check fails, the effect
is as defined in
3.2.4.
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