Statically Matching Constraints and Subtypes
Author: JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor

Ada Reference Manual — Legal Information

# 4.9.1 Statically Matching Constraints and Subtypes

#### Static Semantics

1/2
A constraint statically matches another constraint if:
1.1/2
both are null constraints;
1.2/2
both are static and have equal corresponding bounds or discriminant values;
1.3/2
both are nonstatic and result from the same elaboration of a constraint of a subtype_indication or the same evaluation of a range of a discrete_subtype_definition; or
1.4/2
both are nonstatic and come from the same formal_type_declaration.
2/3
A subtype statically matches another subtype of the same type if they have statically matching constraints, all predicate specifications that apply to them come from the same declarations, and, for access subtypes, either both or neither exclude null. Two anonymous access-to-object subtypes statically match if their designated subtypes statically match, and either both or neither exclude null, and either both or neither are access-to-constant. Two anonymous access-to-subprogram subtypes statically match if their designated profiles are subtype conformant, and either both or neither exclude null.
3
Two ranges of the same type statically match if both result from the same evaluation of a range, or if both are static and have equal corresponding bounds.
4/3
A constraint is statically compatible with a scalar subtype if it statically matches the constraint of the subtype, or if both are static and the constraint is compatible with the subtype. A constraint is statically compatible with an access or composite subtype if it statically matches the constraint of the subtype, or if the subtype is unconstrained.
5/3
Two statically matching subtypes are statically compatible with each other. In addition, a subtype S1 is statically compatible with a subtype S2 if:
6/3
the constraint of S1 is statically compatible with S2, and
7/3
if S2 excludes null, so does S1, and
8/3
either:
9/3
all predicate specifications that apply to S2 apply also to S1, or
10/3
both subtypes are static, every value that satisfies the predicate of S1 also satisfies the predicate of S2, and it is not the case that both types each have at least one applicable predicate specification, predicate checks are enabled (see 11.4.2) for S2, and predicate checks are not enabled for S1.

Ada 2005 and 2012 Editions sponsored in part by Ada-Europe