File: AA-3-7-1.html

package info (click to toggle)
ada-reference-manual 20021112web-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny, sarge
  • size: 18,652 kB
  • ctags: 8,921
  • sloc: makefile: 52; sh: 20
file content (219 lines) | stat: -rw-r--r-- 16,896 bytes parent folder | download
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>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-7.html">Previous</A>&nbsp;&nbsp;&nbsp;<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">&nbsp;&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;(<A NAME="I1951"></A><FONT FACE="Arial, Helvetica">discriminant_association</FONT>&nbsp;{,&nbsp;<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>
&nbsp;&nbsp;&nbsp;[<I>discriminant_</I><A NAME="I1954"></A><FONT FACE="Arial, Helvetica">selector_name</FONT>&nbsp;{|&nbsp;<I>discriminant_</I><A NAME="I1955"></A><FONT FACE="Arial, Helvetica">selector_name</FONT>}&nbsp;=&gt;]&nbsp;<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">&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;<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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<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">&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;<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 &quot;dependent
compatibility check&quot; 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">&nbsp;&nbsp;&nbsp;&nbsp;<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">&nbsp;&nbsp;&nbsp;&nbsp;<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&nbsp;&nbsp;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 =&gt; 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">&nbsp;&nbsp;&nbsp;&nbsp;<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&nbsp;&nbsp;&nbsp;:&nbsp;Buffer(200);&nbsp;&nbsp;<I>--&nbsp;&nbsp;constrained,&nbsp;always&nbsp;200&nbsp;characters</I><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;&nbsp;(explicit&nbsp;discriminant&nbsp;value)</I><BR>
Message&nbsp;:&nbsp;Buffer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;unconstrained,&nbsp;initially&nbsp;100&nbsp;characters</I><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;&nbsp;(default&nbsp;discriminant&nbsp;value)</I><BR>
Basis&nbsp;&nbsp;&nbsp;:&nbsp;Square(5);&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;constrained,&nbsp;always&nbsp;5&nbsp;by&nbsp;5</I><BR>
Illegal&nbsp;:&nbsp;Square;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;illegal,&nbsp;a&nbsp;Square&nbsp;has&nbsp;to&nbsp;be&nbsp;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 &quot;NOTE.&quot;
</FONT></DIV>

<HR>
<P><A HREF="AA-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-7.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-7-2.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>