4.7 Qualified Expressions
1
Syntax
2
Name Resolution Rules
3
Static Semantics
3.1/3
3.a/3
Dynamic Semantics
4
The
evaluation of a
qualified_expression
evaluates the operand (and if of a universal type, converts it to the
type determined by the
subtype_mark)
and checks that its value belongs to the subtype denoted by the
subtype_mark.
The exception Constraint_Error
is raised if this check fails.
4.a
Ramification: This is one of the few
contexts in Ada 95 where implicit subtype conversion is not performed
prior to a constraint check, and hence no “sliding” of array
bounds is provided.
4.b
Reason: Implicit subtype conversion is
not provided because a
qualified_expression
with a constrained target subtype is essentially an assertion about the
subtype of the operand, rather than a request for conversion. An explicit
type_conversion
can be used rather than a
qualified_expression
if subtype conversion is desired.
5
23 When a given context does not uniquely
identify an expected type, a
qualified_expression
can be used to do so. In particular, if an overloaded
name
or
aggregate
is passed to an overloaded subprogram, it might be necessary to qualify
the operand to resolve its type.
Examples
6
Examples of disambiguating
expressions using qualification:
7
type Mask is (Fix, Dec, Exp, Signif);
type Code is (Fix, Cla, Dec, Tnz, Sub);
8
Print (Mask'(Dec)); -- Dec is of type Mask
Print (Code'(Dec)); -- Dec is of type Code
9
for J in Code'(Fix) .. Code'(Dec) loop ... -- qualification needed for either Fix or Dec
for J in Code range Fix .. Dec loop ... -- qualification unnecessary
for J in Code'(Fix) .. Dec loop ... -- qualification unnecessary for Dec
10
Dozen'(1 | 3 | 5 | 7 => 2,
others => 0)
-- see 4.6
Wording Changes from Ada 2005
10.a/3
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe