8.5.4 Subprogram Renaming Declarations
Name Resolution Rules
The profile of a renaming-as-declaration shall be
mode-conformant with that of the renamed callable entity.
- if the callable_entity_name
denotes a generic formal subprogram of a generic unit G, and the
occurs within the body of a generic unit G or within the body
of a generic unit declared within the declarative region of the generic
unit G, then the corresponding parameter or result subtype of
the formal subprogram of G shall have a null_exclusion;
- otherwise, the subtype of the corresponding
parameter or result type of the renamed callable entity shall exclude
null. In addition to the places where Legality Rules
normally apply (see 12.3), this rule applies
also in the private part of an instance of a generic unit.
The profile of a renaming-as-body shall conform fully
to that of the declaration it completes.
If the renaming-as-body
completes that declaration before the subprogram it declares is frozen,
the profile shall be mode-conformant
with that of
the renamed callable entity and the subprogram it declares takes its
convention from the renamed subprogram; otherwise, the profile shall
be subtype-conformant with that of the renamed callable entity and the
convention of the renamed subprogram shall not be Intrinsic.
renaming-as-body is illegal if the declaration occurs before the subprogram
whose declaration it completes is frozen, and the renaming renames the
subprogram itself, through one or more subprogram renaming declarations,
none of whose subprograms has been frozen.
of a renaming shall not denote a subprogram that requires overriding
of a renaming-as-body shall not denote an abstract subprogram.
A renaming-as-declaration declares a new view of
the renamed entity. The profile of this new view takes its subtypes,
parameter modes, and calling convention from the original profile of
the callable entity, while taking the formal parameter name
from the profile given in the subprogram_renaming_declaration
The new view is a function or procedure, never an entry.
For a call to a subprogram whose body is given
as a renaming-as-body, the execution of the renaming-as-body is equivalent
to the execution of a subprogram_body
that simply calls the renamed subprogram with its formal parameters as
the actual parameters and, if it is a function, returns the value of
For a call on a renaming of a dispatching subprogram
that is overridden, if the overriding occurred before the renaming, then
the body executed is that of the overriding declaration, even if the
overriding declaration is not visible at the place of the renaming; otherwise,
the inherited or predefined subprogram is called.
Bounded (Run-Time) Errors
If a subprogram
directly or indirectly renames itself, then it is a bounded error to
call that subprogram. Possible consequences are that Program_Error or
Storage_Error is raised, or that the call results in infinite recursion.
12 A procedure can only be renamed as a
procedure. A function whose defining_designator
is either an identifier
or an operator_symbol
can be renamed with either an identifier
or an operator_symbol
for renaming as an operator, the subprogram specification given in the
is subject to the rules given in 6.6
declarations. Enumeration literals can be renamed as functions; similarly,
that denote functions (such as references to Succ and Pred) can be renamed
as functions. An entry can only be renamed as a procedure; the new name
is only allowed to appear in contexts that allow a procedure name
An entry of a family can be renamed, but an entry family cannot be renamed
as a whole.
13 The operators of the root numeric types
cannot be renamed because the types in the profile are anonymous, so
the corresponding specifications cannot be written; the same holds for
certain attributes, such as Pos.
15 The primitiveness of a renaming-as-declaration
is determined by its profile, and by where it occurs, as for any declaration
of (a view of) a subprogram; primitiveness is not determined by the renamed
view. In order to perform a dispatching call, the subprogram name has
to denote a primitive subprogram, not a non-primitive renaming of a primitive
Examples of subprogram
My_Write(C : in
Pool(K).Write; -- see 4.1.3
function Real_Plus(Left, Right : Real ) return Real renames "+";
function Int_Plus (Left, Right : Integer) return Integer renames "+";
Red; -- see 3.5.1
Next(X : Color) return
Color'Succ; -- see 3.5.1
Example of a subprogram
renaming declaration with new parameter names:
"*" (X,Y : Vector) return
Dot_Product; -- see 6.1
Example of a subprogram
renaming declaration with a new default expression:
Minimum(L : Link := Head) return
Min_Cell; -- see 6.1