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> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-3-2-1.html">Previous</A> <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"> 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>
<B>subtype</B> <A NAME="I1394"></A><FONT FACE="Arial, Helvetica">defining_identifier</FONT> <B>is</B> <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> <A NAME="I1397"></A><FONT FACE="Arial, Helvetica">subtype_mark</FONT> [<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 "mark," 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> | <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>
<A NAME="I1405"></A><FONT FACE="Arial, Helvetica">range_constraint</FONT> | <A NAME="I1406"></A><FONT FACE="Arial, Helvetica">digits_constraint</FONT> | <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>
<A NAME="I1409"></A><FONT FACE="Arial, Helvetica">index_constraint</FONT> | <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"> 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"> <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"> 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 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"> <I>Examples of
subtype declarations:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Examples"><TT><B>subtype</B> Rainbow <B>is</B> Color <B>range</B> Red .. Blue; <I>-- see <A HREF="AA-3-2-1.html">3.2.1</A></I><BR>
<B>subtype</B> Red_Blue <B>is</B> Rainbow;<BR>
<B>subtype</B> Int <B>is</B> Integer;<BR>
<B>subtype</B> Small_Int <B>is</B> Integer <B>range</B> -10 .. 10;<BR>
<B>subtype</B> Up_To_K <B>is</B> Column <B>range</B> 1 .. K; <I>-- see <A HREF="AA-3-2-1.html">3.2.1</A></I><BR>
<B>subtype</B> Square <B>is</B> Matrix(1 .. 10, 1 .. 10); <I>-- see <A HREF="AA-3-6.html">3.6</A></I><BR>
<B>subtype</B> Male <B>is</B> Person(Sex => M); <I>-- see <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> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-3-2-1.html">Previous</A> <A HREF="AA-3-2-3.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|