8.6 The Context of Overload Resolution
Because declarations can be overloaded, 
it is possible for an occurrence of a usage name to have more than one 
possible interpretation; in most cases, ambiguity is disallowed. This 
subclause describes how the possible interpretations resolve to the actual 
interpretation.
 
Certain rules of the language 
(the Name Resolution Rules) are considered “overloading rules”. 
If a possible interpretation violates an overloading rule, it is assumed 
not to be the intended interpretation; some other possible interpretation 
is assumed to be the actual interpretation. On the other hand, violations 
of nonoverloading rules do not affect which interpretation is chosen; 
instead, they cause the construct to be illegal. To be legal, there usually 
has to be exactly one acceptable interpretation of a construct that is 
a “complete context”, not counting any nested complete contexts.
 
The syntax rules of the language 
and the visibility rules given in 
8.3 determine 
the possible interpretations. Most type checking rules (rules that require 
a particular type, or a particular class of types, for example) are overloading 
rules. Various rules for the matching of formal and actual parameters 
are overloading rules. 
 
Name Resolution Rules
Overload 
resolution is applied separately to each 
complete context, not 
counting inner complete contexts. Each of the following constructs is 
a 
complete context: 
 
An 
(overall) 
interpretation of a complete context embodies its meaning, 
and includes the following information about the constituents of the 
complete context, not including constituents of inner complete contexts: 
 
for each constituent of the complete context, to 
which syntactic categories it belongs, and by which syntax rules; and 
for each usage name, which declaration it denotes 
(and, therefore, which view and which entity it denotes); and 
for a complete context that is a 
declarative_item, 
whether or not it is a completion of a declaration, and (if so) which 
declaration it completes. 
 
A 
possible interpretation 
is one that obeys the syntax rules and the visibility rules. 
An 
acceptable interpretation is a possible interpretation that obeys 
the 
overloading rules, that is, those rules that specify an expected 
type or expected profile, or specify how a construct shall 
resolve 
or be 
interpreted. 
 
The 
interpretation of 
a constituent of a complete context is determined from the overall interpretation 
of the complete context as a whole. Thus, for example, “interpreted 
as a 
function_call,” 
means that the construct's interpretation says that it belongs to the 
syntactic category 
function_call.
 
Each 
occurrence of a usage name 
denotes the declaration determined 
by its interpretation. It also denotes the view declared by its denoted 
declaration, except in the following cases: 
 
If a usage name appears within 
the declarative region of a 
type_declaration 
and denotes that same 
type_declaration, 
then it denotes the 
current instance of the type (rather than 
the type itself); the current instance of a type is the object or value 
of the type that is associated with the execution that evaluates the 
usage name.  Similarly, if a usage name appears within the declarative 
region of a 
subtype_declaration 
and denotes that same 
subtype_declaration, 
then it denotes the current instance of the subtype. These rules do not 
apply if the usage name appears within the 
subtype_mark 
of an 
access_definition 
for an access-to-object type, or within the subtype of a parameter or 
result of an access-to-subprogram type. 
 
Within an 
aspect_specification 
for a type or subtype, the current instance represents a value of the 
type; it is not an object. The nominal subtype of this value is given 
by the subtype itself (the first subtype in the case of a 
type_declaration), 
prior to applying any predicate specified directly on the type or subtype. 
If the type or subtype is by-reference, the associated object with the 
value is the object associated (see 
6.2) with 
the execution of the usage name.
 
A usage name that denotes a view also denotes the 
entity of that view. 
 The 
expected type for a given 
expression, 
name, or other 
construct determines, according to the 
type resolution rules given 
below, the types considered for the construct during overload resolution. 
The type resolution rules provide support for class-wide 
programming, universal literals, dispatching operations, and anonymous 
access types: 
 
If a construct 
is expected to be of any type in a class of types, or of the universal 
or class-wide type for a class, then the type of the construct shall 
resolve to a type in that class or to a universal type that covers the 
class. 
 
If 
the expected type for a construct is a specific type 
T, then the 
type of the construct shall resolve either to 
T, or: 
 
to T'Class; or 
to a universal type that covers 
T; or
when 
T is a specific anonymous 
access-to-object type (see 
3.10) with designated 
type 
D, to an access-to-object type whose designated type is 
D'Class 
or is covered by 
D; or
 
when 
T is a named general 
access-to-object type (see 
3.10) with designated 
type 
D, to an anonymous access-to-object type whose designated 
type covers or is covered by 
D; or
 
when 
T is an anonymous access-to-subprogram 
type (see 
3.10), to an access-to-subprogram 
type whose designated profile is type conformant with that of 
T.
 
In certain contexts, such as 
in a 
subprogram_renaming_declaration, 
the Name Resolution Rules define an 
expected profile for a given 
name; 
in 
such cases, the 
name 
shall resolve to the name of a callable entity whose profile is type 
conformant with the expected profile. 
 
Legality Rules
 When a construct is one that 
requires that its expected type be a 
single type in a given class, 
the type of the construct shall be determinable solely from the context 
in which the construct appears, excluding the construct itself, but using 
the requirement that it be in the given class. Furthermore, the context 
shall not be one that expects any type in some class that contains types 
of the given class; in particular, the construct shall not be the operand 
of a 
type_conversion.
 
   Other than for the 
tested_simple_expression 
of a membership test, if the expected type for a 
name 
or 
expression 
is not the same as the actual type of the 
name 
or 
expression, 
the actual type shall be convertible to the expected type (see 
4.6);
 
further, if the expected type is a named access-to-object type with designated 
type 
D1 and the actual type is an anonymous access-to-object type 
with designated type 
D2, then 
D1 shall cover 
D2, 
and the 
name 
or 
expression 
shall denote a view with an accessibility level for which the statically 
deeper relationship applies; in particular it shall not denote an access 
parameter nor a stand-alone access object.
 
A complete context shall have at least one acceptable 
interpretation; if there is exactly one, then that one is chosen. 
There is a 
preference 
for the primitive operators (and 
ranges) 
of the root numeric types 
root_integer and 
root_real. In 
particular, if two acceptable interpretations of a constituent of a complete 
context differ only in that one is for a primitive operator (or 
range) 
of the type 
root_integer or 
root_real, and the other is 
not, the interpretation using the primitive operator (or 
range) 
of the root numeric type is 
preferred.
 
   Similarly, there is a preference for the equality 
operators of the 
universal_access type (see 
4.5.2). 
If two acceptable interpretations of a constituent of a complete context 
differ only in that one is for an equality operator of the 
universal_access 
type, and the other is not, the interpretation using the equality operator 
of the 
universal_access type is preferred.
 
For a complete context, if there is exactly one overall 
acceptable interpretation where each constituent's interpretation is 
the same as or preferred (in the above sense) over those in all other 
overall acceptable interpretations, then that one overall acceptable 
interpretation is chosen. 
Otherwise, the complete 
context is 
ambiguous.
 
A complete context that is a 
pragma_argument_association 
is allowed to be ambiguous (unless otherwise specified for the particular 
pragma), but only if every acceptable interpretation of the pragma argument 
is as a 
name 
that statically denotes a callable entity. 
Such a 
name denotes 
all of the declarations determined by its interpretations, and all of 
the views declared by these declarations. 
 
17  If a usage name has only one acceptable 
interpretation, then it denotes the corresponding entity. However, this 
does not mean that the usage name is necessarily legal since other requirements 
exist which are not considered for overload resolution; for example, 
the fact that an expression is static, whether an object is constant, 
mode and subtype conformance rules, freezing rules, order of elaboration, 
and so on.
Similarly, subtypes are not considered for overload 
resolution (the violation of a constraint does not make a program illegal 
but raises an exception during program execution). 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe