1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Discriminant Constraints</TITLE>
<META NAME="Author" CONTENT="JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor">
<META NAME="GENERATOR" CONTENT="Arm_Form.Exe, Ada Reference Manual generator">
<STYLE type="text/css">
DIV.paranum {position: absolute; font-family: Arial, Helvetica, sans-serif; left: 0.5 em; top: auto}
TT {font-family: "Courier New", monospace}
DT {display: compact}
DIV.Normal {font-family: "Times New Roman", Times, serif; margin-bottom: 0.6em}
DIV.Wide {font-family: "Times New Roman", Times, serif; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Annotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.WideAnnotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Index {font-family: "Times New Roman", Times, serif}
DIV.SyntaxSummary {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Notes {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.NotesHeader {font-family: "Times New Roman", Times, serif; margin-left: 2.0em}
DIV.SyntaxIndented {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Indented {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-bottom: 0.6em}
DIV.CodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.SmallIndented {font-family: "Times New Roman", Times, serif; margin-left: 10.0em; margin-bottom: 0.6em}
DIV.SmallCodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.Examples {font-family: "Courier New", monospace; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.SmallExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 7.5em; margin-bottom: 0.6em}
DIV.IndentedExamples {font-family: "Courier New", monospace; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.SmallIndentedExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 15.0em; margin-bottom: 0.6em}
UL.Bulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.IndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SyntaxIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.Hanging {font-family: "Times New Roman", Times, serif; margin-top: 0em; margin-bottom: 0.6em}
DD.Hanging {margin-left: 6.0em}
DL.IndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.IndentedHanging {margin-left: 2.0em}
DL.HangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.HangingInBulleted {margin-left: 4.0em}
DL.SmallHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallHanging {margin-left: 7.5em}
DL.SmallIndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallIndentedHanging {margin-left: 2.0em}
DL.SmallHangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallHangingInBulleted {margin-left: 5.0em}
DL.Enumerated {font-family: "Times New Roman", Times, serif; margin-right: 0.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.Enumerated {margin-left: 2.0em}
DL.SmallEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallEnumerated {margin-left: 2.5em}
DL.NestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.SmallNestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
</STYLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFF0" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-3-7.html">Previous</A> <A HREF="AA-3-7-2.html">Next</A></P>
<HR>
<H1> 3.7.1 Discriminant Constraints</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> A <FONT FACE="Arial, Helvetica">discriminant_constraint</FONT>
specifies the values of the discriminants for a given discriminated type.
</DIV>
<H4 ALIGN=CENTER>Language Design Principles</H4>
<DIV Class="Paranum"><FONT SIZE=-2>1.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The rules in this clause are intentionally
parallel to those given in Record Aggregates. </FONT></DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">discriminant_constraint<A NAME="I1950"></A>
::= </FONT><BR>
(<A NAME="I1951"></A><FONT FACE="Arial, Helvetica">discriminant_association</FONT> {, <A NAME="I1952"></A><FONT FACE="Arial, Helvetica">discriminant_association</FONT>})</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">discriminant_association<A NAME="I1953"></A>
::= </FONT><BR>
[<I>discriminant_</I><A NAME="I1954"></A><FONT FACE="Arial, Helvetica">selector_name</FONT> {| <I>discriminant_</I><A NAME="I1955"></A><FONT FACE="Arial, Helvetica">selector_name</FONT>} =>] <A NAME="I1956"></A><FONT FACE="Arial, Helvetica">expression</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="SyntaxIndented"><A NAME="I1957"></A>A <FONT FACE="Arial, Helvetica">discriminant_association</FONT>
is said to be <I>named</I> if it has one or more <I>discriminant_</I><FONT FACE="Arial, Helvetica">selector_name</FONT>s;
<A NAME="I1958"></A>it is otherwise said to be <I>positional</I>. In
a <FONT FACE="Arial, Helvetica">discriminant_constraint</FONT>, any positional
associations shall precede any named associations. </DIV>
<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal"> Each <FONT FACE="Arial, Helvetica">selector_name</FONT>
of a named <FONT FACE="Arial, Helvetica">discriminant_association</FONT>
shall resolve to denote a discriminant of the subtype being constrained;
<A NAME="I1959"></A>the discriminants so named are the <I>associated
discriminants</I> of the named association. <A NAME="I1960"></A>For a
positional association, the <I>associated discriminant</I> is the one
whose <FONT FACE="Arial, Helvetica">discriminant_specification</FONT>
occurred in the corresponding position in the <FONT FACE="Arial, Helvetica">known_discriminant_part</FONT>
that defined the discriminants of the subtype being constrained.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1961"></A>The expected type for the
<FONT FACE="Arial, Helvetica">expression</FONT> in a <FONT FACE="Arial, Helvetica">discriminant_association</FONT>
is that of the associated discriminant(s). </DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7/1</FONT></DIV>
<DIV Class="Normal"> {<I><A HREF="defect1.html#8652/0008">8652/0008</A></I>}
A <FONT FACE="Arial, Helvetica">discriminant_constraint</FONT> is only
allowed in a <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
whose <FONT FACE="Arial, Helvetica">subtype_mark</FONT> denotes either
an unconstrained discriminated subtype, or an unconstrained access subtype
whose designated subtype is an unconstrained discriminated subtype. <U>However,
in the case of a general access subtype, a <FONT FACE="Arial, Helvetica">discriminant_constraint</FONT>
is illegal if there is a place within the immediate scope of the designated
subtype where the designated subtype's view is constrained.</U> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7.a.1/1</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>{<I><A HREF="defect1.html#8652/0008">8652/0008</A></I>}
<U>The second rule is necessary to prevent assignments that change the
discriminant of a constrained object. See the defect report for examples.</U>
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> A named <FONT FACE="Arial, Helvetica">discriminant_association</FONT>
with more than one <FONT FACE="Arial, Helvetica">selector_name</FONT>
is allowed only if the named discriminants are all of the same type.
A <FONT FACE="Arial, Helvetica">discriminant_constraint</FONT> shall
provide exactly one value for each discriminant of the subtype being
constrained.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal"> The <FONT FACE="Arial, Helvetica">expression</FONT>
associated with an access discriminant shall be of a type convertible
to the anonymous access type. <A NAME="I1962"></A></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This implies
both convertibility of designated types, and static accessibility. This
implies that if an object of type T with an access discriminant is created
by an allocator for an access type A, then it requires that the type
of the <FONT FACE="Arial, Helvetica">expression</FONT> associated with
the access discriminant have an accessibility level that is not statically
deeper than that of A. This is to avoid dangling references.</FONT></DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1963"></A>A <FONT FACE="Arial, Helvetica">discriminant_constraint</FONT>
is <I>compatible</I> with an unconstrained discriminated subtype if each
discriminant value belongs to the subtype of the corresponding discriminant.
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The "dependent
compatibility check" has been eliminated in Ada 95. Any checking
on subcomponents is performed when (and if) an object is created.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>There is no
need to define compatibility with a constrained discriminated subtype,
because one is not allowed to constrain it again.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1964"></A>A composite value <I>satisfies</I>
a discriminant constraint if and only if each discriminant of the composite
value has the value imposed by the discriminant constraint.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1965"></A>For the elaboration of a
<FONT FACE="Arial, Helvetica">discriminant_constraint</FONT>, the <FONT FACE="Arial, Helvetica">expression</FONT>s
in the <FONT FACE="Arial, Helvetica">discriminant_association</FONT>s
are evaluated in an arbitrary order and converted to the type of the
associated discriminant (which might raise Constraint_Error -- see <A HREF="AA-4-6.html">4.6</A>);
the <FONT FACE="Arial, Helvetica">expression</FONT> of a named association
is evaluated (and converted) once for each associated discriminant. <A NAME="I1966"></A>The
result of each evaluation and conversion is the value imposed by the
constraint for the associated discriminant. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>We convert to the
type, not the subtype, so that the definition of compatibility of discriminant
constraints is not vacuous.</FONT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>54 The rules of the language
ensure that a discriminant of an object always has a value, either from
explicit or implicit initialization. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>Although it
is illegal to constrain a class-wide tagged subtype, it is possible to
have a partially constrained class-wide subtype: If the subtype S is
defined by T(A => B), then S'Class is partially constrained in the
sense that objects of subtype S'Class have to have discriminants corresponding
to A equal to B, but there can be other discriminants defined in extensions
that are not constrained to any particular value. </FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Examples (using
types declared above in clause <A HREF="AA-3-7.html">3.7</A>):</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Examples"><TT>Large : Buffer(200); <I>-- constrained, always 200 characters</I><BR>
<I>-- (explicit discriminant value)</I><BR>
Message : Buffer; <I>-- unconstrained, initially 100 characters</I><BR>
<I>-- (default discriminant value)</I><BR>
Basis : Square(5); <I>-- constrained, always 5 by 5</I><BR>
Illegal : Square; <I>-- illegal, a Square has to be constrained</I></TT></DIV>
<H4 ALIGN=CENTER>Inconsistencies With Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>15.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I1967"></A>Dependent
compatibility checks are no longer performed on subtype declaration.
Instead they are deferred until object creation (see <A HREF="AA-3-3-1.html">3.3.1</A>).
This is upward compatible for a program that does not raise Constraint_Error.
</FONT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>15.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Everything in RM83-3.7.2(7-12),
which specifies the initial values for discriminants, is now redundant
with 3.3.1, 6.4.1, 8.5.1, and 12.4. Therefore, we don't repeat it here.
Since the material is largely intuitive, but nevertheless complicated
to state formally, it doesn't seem worth putting it in a "NOTE."
</FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-3-7.html">Previous</A> <A HREF="AA-3-7-2.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|