File: AA-3-2-2.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 (207 lines) | stat: -rw-r--r-- 16,586 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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>AARM95 - Subtype Declarations</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-2-1.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-2-3.html">Next</A></P>
<HR>
<H1> 3.2.2 Subtype Declarations</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;A <FONT FACE="Arial, Helvetica">subtype_declaration</FONT>
declares a subtype of some previously declared type, as defined by a
<FONT FACE="Arial, Helvetica">subtype_indication</FONT>. </DIV>

<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">subtype_declaration<A NAME="I1393"></A>
::= </FONT><BR>
&nbsp;&nbsp;&nbsp;<B>subtype</B>&nbsp;<A NAME="I1394"></A><FONT FACE="Arial, Helvetica">defining_identifier</FONT>&nbsp;<B>is</B>&nbsp;<A NAME="I1395"></A><FONT FACE="Arial, Helvetica">subtype_indication</FONT>;</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">subtype_indication<A NAME="I1396"></A>
::= </FONT>&nbsp;<A NAME="I1397"></A><FONT FACE="Arial, Helvetica">subtype_mark</FONT>&nbsp;[<A NAME="I1398"></A><FONT FACE="Arial, Helvetica">constraint</FONT>]</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">subtype_mark<A NAME="I1399"></A>
::= </FONT><I>subtype_</I><A NAME="I1400"></A><FONT FACE="Arial, Helvetica">name</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Note that
<FONT FACE="Arial, Helvetica">name</FONT> includes <FONT FACE="Arial, Helvetica">attribute_reference</FONT>;
thus, S'Base can be used as a <FONT FACE="Arial, Helvetica">subtype_mark</FONT>.
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>We considered changing
<FONT FACE="Arial, Helvetica">subtype_mark</FONT> to <FONT FACE="Arial, Helvetica">subtype_name</FONT>.
However, existing users are used to the word &quot;mark,&quot; so we're
keeping it. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">constraint<A NAME="I1401"></A>
::= </FONT><A NAME="I1402"></A><FONT FACE="Arial, Helvetica">scalar_constraint</FONT>&nbsp;|&nbsp;<A NAME="I1403"></A><FONT FACE="Arial, Helvetica">composite_constraint</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">scalar_constraint<A NAME="I1404"></A>
::= </FONT><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I1405"></A><FONT FACE="Arial, Helvetica">range_constraint</FONT>&nbsp;|&nbsp;<A NAME="I1406"></A><FONT FACE="Arial, Helvetica">digits_constraint</FONT>&nbsp;|&nbsp;<A NAME="I1407"></A><FONT FACE="Arial, Helvetica">delta_constraint</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">composite_constraint<A NAME="I1408"></A>
::= </FONT><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I1409"></A><FONT FACE="Arial, Helvetica">index_constraint</FONT>&nbsp;|&nbsp;<A NAME="I1410"></A><FONT FACE="Arial, Helvetica">discriminant_constraint</FONT></DIV>

<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;A <FONT FACE="Arial, Helvetica">subtype_mark</FONT>
shall resolve to denote a subtype. <A NAME="I1411"></A>The type <I>determined
by</I> a <FONT FACE="Arial, Helvetica">subtype_mark</FONT> is the type
of the subtype denoted by the <FONT FACE="Arial, Helvetica">subtype_mark</FONT>.
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Types are
never directly named; all <FONT FACE="Arial, Helvetica">subtype_mark</FONT>s
denote subtypes -- possibly an unconstrained (base) subtype, but never
the type. When we use the term <I>anonymous type</I> we really mean a
type with no namable subtypes. </FONT></DIV>

<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;<A NAME="I1412"></A>The
elaboration of a <FONT FACE="Arial, Helvetica">subtype_declaration</FONT>
consists of the elaboration of the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>.
<A NAME="I1413"></A>The elaboration of a <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
creates a new subtype. If the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
does not include a <FONT FACE="Arial, Helvetica">constraint</FONT>, the
new subtype has the same (possibly null) constraint as that denoted by
the <FONT FACE="Arial, Helvetica">subtype_mark</FONT>. The elaboration
of a <FONT FACE="Arial, Helvetica">subtype_indication</FONT> that includes
a <FONT FACE="Arial, Helvetica">constraint</FONT> proceeds as follows:
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The <FONT FACE="Arial, Helvetica">constraint</FONT> is
first elaborated.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC><A NAME="I1414"></A><A NAME="I1415"></A>A check is then
made that the <FONT FACE="Arial, Helvetica">constraint</FONT> is <I>compatible</I>
with the subtype denoted by the <FONT FACE="Arial, Helvetica">subtype_mark</FONT>.
</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The checks
associated with constraint compatibility are all Range_Checks. Discriminant_Checks
and Index_Checks are associated only with checks that a value satisfies
a constraint. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;The condition imposed by a <FONT FACE="Arial, Helvetica">constraint</FONT>
is the condition obtained after elaboration of the <FONT FACE="Arial, Helvetica">constraint</FONT>.
<A NAME="I1416"></A>The rules defining compatibility are given for each
form of <FONT FACE="Arial, Helvetica">constraint</FONT> in the appropriate
subclause. These rules are such that if a <FONT FACE="Arial, Helvetica">constraint</FONT>
is <I>compatible</I> with a subtype, then the condition imposed by the
<FONT FACE="Arial, Helvetica">constraint</FONT> cannot contradict any
condition already imposed by the subtype on its values. <A NAME="I1417"></A>The
exception Constraint_Error is raised if any check of compatibility fails.
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>To be honest: </B>The condition
imposed by a <FONT FACE="Arial, Helvetica">constraint</FONT> is named
after it -- a <FONT FACE="Arial, Helvetica">range_constraint</FONT> imposes
a range constraint, etc. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>A <FONT FACE="Arial, Helvetica">range_constraint</FONT>
causes freezing of its type. Other <FONT FACE="Arial, Helvetica">constraint</FONT>s
do not. </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>4&nbsp;&nbsp;A <FONT FACE="Arial, Helvetica">scalar_constraint</FONT>
may be applied to a subtype of an appropriate scalar type (see <A HREF="AA-3-5.html">3.5</A>,
<A HREF="AA-3-5-9.html">3.5.9</A>, and <A HREF="AA-J-3.html">J.3</A>),
even if the subtype is already constrained. On the other hand, a <FONT FACE="Arial, Helvetica">composite_constraint</FONT>
may be applied to a composite subtype (or an access-to-composite subtype)
only if the composite subtype is unconstrained (see <A HREF="AA-3-6-1.html">3.6.1</A>
and <A HREF="AA-3-7-1.html">3.7.1</A>). </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 of
subtype declarations:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Examples"><TT><B>subtype</B>&nbsp;Rainbow&nbsp;&nbsp;&nbsp;<B>is</B>&nbsp;Color&nbsp;<B>range</B>&nbsp;Red&nbsp;..&nbsp;Blue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;see&nbsp;<A HREF="AA-3-2-1.html">3.2.1</A></I><BR>
<B>subtype</B>&nbsp;Red_Blue&nbsp;&nbsp;<B>is</B>&nbsp;Rainbow;<BR>
<B>subtype</B>&nbsp;Int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<B>is</B>&nbsp;Integer;<BR>
<B>subtype</B>&nbsp;Small_Int&nbsp;<B>is</B>&nbsp;Integer&nbsp;<B>range</B>&nbsp;-10&nbsp;..&nbsp;10;<BR>
<B>subtype</B>&nbsp;Up_To_K&nbsp;&nbsp;&nbsp;<B>is</B>&nbsp;Column&nbsp;<B>range</B>&nbsp;1&nbsp;..&nbsp;K;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;see&nbsp;<A HREF="AA-3-2-1.html">3.2.1</A></I><BR>
<B>subtype</B>&nbsp;Square&nbsp;&nbsp;&nbsp;&nbsp;<B>is</B>&nbsp;Matrix(1&nbsp;..&nbsp;10,&nbsp;1&nbsp;..&nbsp;10);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;see&nbsp;<A HREF="AA-3-6.html">3.6</A></I><BR>
<B>subtype</B>&nbsp;Male&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<B>is</B>&nbsp;Person(Sex&nbsp;=&gt;&nbsp;M);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;&nbsp;see&nbsp;<A HREF="AA-3-10-1.html">3.10.1</A></I></TT></DIV>

<H4 ALIGN=CENTER>Incompatibilities With Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>15.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I1418"></A>In Ada 95,
all <FONT FACE="Arial, Helvetica">range_constraint</FONT>s cause freezing
of their type. Hence, a type-related representation item for a scalar
type has to precede any <FONT FACE="Arial, Helvetica">range_constraint</FONT>s
whose type is the scalar type. </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><FONT FACE="Arial, Helvetica">Subtype_mark</FONT>s
allow only subtype names now, since types are never directly named. There
is no need for RM83-3.3.2(3), which says a <FONT FACE="Arial, Helvetica">subtype_mark</FONT>
can denote both the type and the subtype; in Ada 95, you denote an unconstrained
(base) subtype if you want, but never the type.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The syntactic category <FONT FACE="Arial, Helvetica">type_mark</FONT>
is now called <FONT FACE="Arial, Helvetica">subtype_mark</FONT>, since
it always denotes a subtype. </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-2-1.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-2-3.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>