File: AA-3-8.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 (370 lines) | stat: -rw-r--r-- 27,792 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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>AARM95 - Record Types</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-2.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-8-1.html">Next</A></P>
<HR>
<H1> 3.8 Record Types</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I1972"></A><A NAME="I1973"></A>A record
object is a composite object consisting of named components. The value
of a record object is a composite value consisting of the values of the
components. <A NAME="I1974"></A></DIV>

<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">record_type_definition<A NAME="I1975"></A>
::= </FONT>[[<B>abstract</B>]&nbsp;<B>tagged</B>]&nbsp;[<B>limited</B>]&nbsp;<A NAME="I1976"></A><FONT FACE="Arial, Helvetica">record_definition</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">record_definition<A NAME="I1977"></A>
::= </FONT><BR>
&nbsp;&nbsp;&nbsp;&nbsp;<B>record</B><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I1978"></A><FONT FACE="Arial, Helvetica">component_list</FONT><BR>
&nbsp;&nbsp;&nbsp;&nbsp;<B>end</B>&nbsp;<B>record</B><BR>
&nbsp;&nbsp;|&nbsp;<B>null&nbsp;record</B></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">component_list<A NAME="I1979"></A>
::= </FONT><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I1980"></A><FONT FACE="Arial, Helvetica">component_item</FONT>&nbsp;{<A NAME="I1981"></A><FONT FACE="Arial, Helvetica">component_item</FONT>}<BR>
&nbsp;&nbsp;&nbsp;|&nbsp;{<A NAME="I1982"></A><FONT FACE="Arial, Helvetica">component_item</FONT>}&nbsp;<A NAME="I1983"></A><FONT FACE="Arial, Helvetica">variant_part</FONT><BR>
&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;<B>null</B>;</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5/1</FONT></DIV>
<DIV Class="SyntaxIndented">{<I><A HREF="defect1.html#8652/0009">8652/0009</A></I>}
<FONT FACE="Arial, Helvetica">component_item<A NAME="I1984"></A> ::=
</FONT><A NAME="I1985"></A><FONT FACE="Arial, Helvetica">component_declaration</FONT>&nbsp;|&nbsp;<U><A NAME="I1986"></A><FONT FACE="Arial, Helvetica">aspect_clause</FONT></U><S><A NAME="I1987"></A><FONT FACE="Arial, Helvetica">representation_clause</FONT></S></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">component_declaration<A NAME="I1988"></A>
::= </FONT><BR>
&nbsp;&nbsp;&nbsp;<A NAME="I1989"></A><FONT FACE="Arial, Helvetica">defining_identifier_list</FONT>&nbsp;:&nbsp;<A NAME="I1990"></A><FONT FACE="Arial, Helvetica">component_definition</FONT>&nbsp;[:=&nbsp;<A NAME="I1991"></A><FONT FACE="Arial, Helvetica">default_expression</FONT>];</DIV>

<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I1992"></A>The expected type for the
<FONT FACE="Arial, Helvetica">default_expression</FONT>, if any, in a
<FONT FACE="Arial, Helvetica">component_declaration</FONT> is the type
of the component. </DIV>

<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;A <FONT FACE="Arial, Helvetica">default_expression</FONT>
is not permitted if the component is of a limited type.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I1993"></A>Each <FONT FACE="Arial, Helvetica">component_declaration</FONT>
declares a <I>component</I> of the record type. Besides components declared
by <FONT FACE="Arial, Helvetica">component_declaration</FONT>s, the components
of a record type include any components declared by <FONT FACE="Arial, Helvetica">discriminant_specification</FONT>s
of the record type declaration. [The identifiers of all components of
a record type shall be distinct.] </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Proof: </B>The identifiers
of all components of a record type have to be distinct because they are
all declared immediately within the same declarative region. See Section
8.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;Within a <FONT FACE="Arial, Helvetica">type_declaration</FONT>,
a <FONT FACE="Arial, Helvetica">name</FONT> that denotes a component,
protected subprogram, or entry of the type is allowed only in the following
cases:</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>A <FONT FACE="Arial, Helvetica">name</FONT> that denotes
any component, protected subprogram, or entry is allowed within a representation
item that occurs within the declaration of the composite type.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>A <FONT FACE="Arial, Helvetica">name</FONT> that denotes
a noninherited discriminant is allowed within the declaration of the
type, but not within the <FONT FACE="Arial, Helvetica">discriminant_part</FONT>.
If the discriminant is used to define the constraint of a component,
the bounds of an entry family, or the constraint of the parent subtype
in a <FONT FACE="Arial, Helvetica">derived_type_definition</FONT> then
its name shall appear alone as a <FONT FACE="Arial, Helvetica">direct_name</FONT>
(not as part of a larger expression or expanded name). A discriminant
shall not be used to define the constraint of a scalar component. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>12.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>The penultimate
restriction simplifies implementation, and allows the outer discriminant
and the inner discriminant or bound to possibly share storage. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Other rules
prevent such a discriminant from being an inherited one. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>The last restriction
is inherited from Ada 83. The restriction is not really necessary from
a language design point of view, but we did not remove it, in order to
avoid unnecessary changes to existing compilers. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>Note that a
discriminant can be used to define the constraint for a component that
is of an access-to-composite type. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.e</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>The above rules,
and a similar one in <A HREF="AA-6-1.html">6.1</A> for formal parameters,
are intended to allow initializations of components or parameters to
occur in an arbitrary order -- whatever order is most efficient, since
one <FONT FACE="Arial, Helvetica">default_expression</FONT> cannot depend
on the value of another one. It also prevent circularities. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.f</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Inherited
discriminants are not allowed to be denoted, except within representation
items. However, the <I>discriminant_</I><FONT FACE="Arial, Helvetica">selector_name</FONT>
of the parent <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
is allowed to denote a discriminant of the parent. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;If the name of the current instance of a type
(see <A HREF="AA-8-6.html">8.6</A>) is used to define the constraint
of a component, then it shall appear as a <FONT FACE="Arial, Helvetica">direct_name</FONT>
that is the <FONT FACE="Arial, Helvetica">prefix</FONT> of an <FONT FACE="Arial, Helvetica">attribute_reference</FONT>
whose result is of an access type, and the <FONT FACE="Arial, Helvetica">attribute_reference</FONT>
shall appear alone. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>This rule allows
T'Access or T'Unchecked_Access, but disallows, for example, a range constraint
(1..T'Size). Allowing things like (1..T'Size) would mean that a per-object
constraint could affect the size of the object, which would be bad. </FONT></DIV>

<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I1994"></A>The <FONT FACE="Arial, Helvetica">component_definition</FONT>
of a <FONT FACE="Arial, Helvetica">component_declaration</FONT> defines
the (nominal) subtype of the component. If the reserved word <B>aliased</B>
appears in the <FONT FACE="Arial, Helvetica">component_definition</FONT>,
then the component is aliased (see <A HREF="AA-3-10.html">3.10</A>).
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>In this case,
the nominal subtype cannot be an unconstrained discriminated subtype.
See <A HREF="AA-3-6.html">3.6</A>. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I1995"></A>If the <FONT FACE="Arial, Helvetica">component_list</FONT>
of a record type is defined by the reserved word <B>null</B> and there
are no discriminants, then the record type has no components and all
records of the type are <I>null records</I>. A <FONT FACE="Arial, Helvetica">record_definition</FONT>
of <B>null record</B> is equivalent to <B>record null; end record</B>.
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This short-hand
is available both for declaring a record type and a record extension
-- see <A HREF="AA-3-9-1.html">3.9.1</A>. </FONT></DIV>

<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I1996"></A>The elaboration of a <FONT FACE="Arial, Helvetica">record_type_definition</FONT>
creates the record type and its first subtype, and consists of the elaboration
of the <FONT FACE="Arial, Helvetica">record_definition</FONT>. <A NAME="I1997"></A>The
elaboration of a <FONT FACE="Arial, Helvetica">record_definition</FONT>
consists of the elaboration of its <FONT FACE="Arial, Helvetica">component_list</FONT>,
if any.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I1998"></A>The elaboration of a <FONT FACE="Arial, Helvetica">component_list</FONT>
consists of the elaboration of the <FONT FACE="Arial, Helvetica">component_item</FONT>s
and <FONT FACE="Arial, Helvetica">variant_part</FONT>, if any, in the
order in which they appear. <A NAME="I1999"></A>The elaboration of a
<FONT FACE="Arial, Helvetica">component_declaration</FONT> consists of
the elaboration of the <FONT FACE="Arial, Helvetica">component_definition</FONT>.
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>If the <FONT FACE="Arial, Helvetica">defining_identifier_list</FONT>
has more than one <FONT FACE="Arial, Helvetica">defining_identifier</FONT>,
we presume here that the transformation explained in <A HREF="AA-3-3-1.html">3.3.1</A>
has already taken place. Alternatively, we could say that the <FONT FACE="Arial, Helvetica">component_definition</FONT>
is elaborated once for each <FONT FACE="Arial, Helvetica">defining_identifier</FONT>
in the list. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18/1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<I><A HREF="defect1.html#8652/0002">8652/0002</A></I>}
<A NAME="I2000"></A><A NAME="I2001"></A><A NAME="I2002"></A>Within the
definition of a composite type, if a <FONT FACE="Arial, Helvetica">component_definition</FONT>
or <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT> (see
<A HREF="AA-9-5-2.html">9.5.2</A>) includes a <FONT FACE="Arial, Helvetica">name</FONT>
that denotes a discriminant of the type, or that is an <FONT FACE="Arial, Helvetica">attribute_reference</FONT>
whose <FONT FACE="Arial, Helvetica">prefix</FONT> denotes the current
instance of the type, the expression containing the <FONT FACE="Arial, Helvetica">name</FONT>
is called a <I>per-object expression</I>, and the <U><FONT FACE="Arial, Helvetica">constraint</FONT>
or <FONT FACE="Arial, Helvetica">range</FONT></U><S>constraint</S> being
defined is called a <I>per-object constraint</I>. <A NAME="I2003"></A>For
the elaboration of a <FONT FACE="Arial, Helvetica">component_definition</FONT>
of a <FONT FACE="Arial, Helvetica">component_declaration</FONT><U> or
the <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT>
of an <FONT FACE="Arial, Helvetica">entry_declaration</FONT> for an entry
family (see <A HREF="AA-9-5-2.html">9.5.2</A>)</U>, if the <FONT FACE="Arial, Helvetica">constraint</FONT>
<U>or <FONT FACE="Arial, Helvetica">range</FONT></U> of the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
<U>or <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT></U>
is not a per-object constraint, then the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
<U>or <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT></U>
is elaborated. On the other hand, if the <FONT FACE="Arial, Helvetica">constraint</FONT>
<U>or <FONT FACE="Arial, Helvetica">range</FONT></U> is a per-object
constraint, then the elaboration consists of the evaluation of any included
expression that is not part of a per-object expression. <U>Each such
expression is evaluated once unless it is part of a named association
in a discriminant constraint, in which case it is evaluated once for
each associated discriminant.</U></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18.1/1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<I><A HREF="defect1.html#8652/0002">8652/0002</A></I>}
<U><A NAME="I2004"></A>When a per-object constraint is elaborated [(as
part of creating an object)], each per-object expression of the constraint
is evaluated. For other expressions, the values determined during the
elaboration of the <FONT FACE="Arial, Helvetica">component_definition</FONT>
or <FONT FACE="Arial, Helvetica">entry_declaration</FONT> are used. Any
checks associated with the enclosing <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
or <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT> are
performed[, including the subtype compatibility check (see <A HREF="AA-3-2-2.html">3.2.2</A>),]
and the associated subtype is created.</U> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>The evaluation
of other expressions that appear in <FONT FACE="Arial, Helvetica">component_definition</FONT>s
and <FONT FACE="Arial, Helvetica">discrete_subtype_definition</FONT>s
is performed when the type definition is elaborated. The evaluation of
expressions that appear as <FONT FACE="Arial, Helvetica">default_expression</FONT>s
is postponed until an object is created. Expressions in representation
items that appear within a composite type definition are evaluated according
to the rules of the particular representation item. </FONT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>19</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>55&nbsp;&nbsp;A <FONT FACE="Arial, Helvetica">component_declaration</FONT>
with several identifiers is equivalent to a sequence of single <FONT FACE="Arial, Helvetica">component_declaration</FONT>s,
as explained in <A HREF="AA-3-3-1.html">3.3.1</A>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>56&nbsp;&nbsp;The <FONT FACE="Arial, Helvetica">default_expression</FONT>
of a record component is only evaluated upon the creation of a default-initialized
object of the record type (presuming the object has the component, if
it is in a <FONT FACE="Arial, Helvetica">variant_part</FONT> -- see <A HREF="AA-3-3-1.html">3.3.1</A>).</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>21</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>57&nbsp;&nbsp;The subtype defined by
a <FONT FACE="Arial, Helvetica">component_definition</FONT> (see <A HREF="AA-3-6.html">3.6</A>)
has to be a definite subtype.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>22</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>58&nbsp;&nbsp;If a record type does
not have a <FONT FACE="Arial, Helvetica">variant_part</FONT>, then the
same components are present in all values of the type.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>23</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>59&nbsp;&nbsp;A record type is limited
if it has the reserved word <B>limited</B> in its definition, or if any
of its components are limited (see <A HREF="AA-7-5.html">7.5</A>).</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>24</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>60&nbsp;&nbsp;<A NAME="I2005"></A>The
predefined operations of a record type include membership tests, qualification,
and explicit conversion. If the record type is nonlimited, they also
include assignment and the predefined equality operators.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>25</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>61&nbsp;&nbsp;A component of a record
can be named with a <FONT FACE="Arial, Helvetica">selected_component</FONT>.
A value of a record can be specified with a <FONT FACE="Arial, Helvetica">record_aggregate</FONT>,
unless the record type is limited.</FONT></DIV>

<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>26</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;&nbsp;<I>Examples of
record type declarations: </I></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>27</FONT></DIV>
<DIV Class="Examples"><TT><B>type</B>&nbsp;Date&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;<B>record</B><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Day&nbsp;&nbsp;&nbsp;:&nbsp;Integer&nbsp;<B>range</B>&nbsp;1&nbsp;..&nbsp;31;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Month&nbsp;:&nbsp;Month_Name;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Year&nbsp;&nbsp;:&nbsp;Integer&nbsp;<B>range</B>&nbsp;0&nbsp;..&nbsp;4000;<BR>
&nbsp;&nbsp;&nbsp;<B>end</B>&nbsp;<B>record</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>28</FONT></DIV>
<DIV Class="Examples"><TT><B>type</B>&nbsp;Complex&nbsp;<B>is</B><BR>
&nbsp;&nbsp;&nbsp;<B>record</B><BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Re&nbsp;:&nbsp;Real&nbsp;:=&nbsp;0.0;<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Im&nbsp;:&nbsp;Real&nbsp;:=&nbsp;0.0;<BR>
&nbsp;&nbsp;&nbsp;<B>end</B>&nbsp;<B>record</B>;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>29</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;&nbsp;<I>Examples of record
variables: </I></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>30</FONT></DIV>
<DIV Class="Examples"><TT>Tomorrow,&nbsp;Yesterday&nbsp;:&nbsp;Date;<BR>
A,&nbsp;B,&nbsp;C&nbsp;:&nbsp;Complex;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>31</FONT></DIV>
<DIV Class="Examples"><TT><I>--&nbsp;both&nbsp;components&nbsp;of&nbsp;A,&nbsp;B,&nbsp;and&nbsp;C&nbsp;are&nbsp;implicitly&nbsp;initialized&nbsp;to&nbsp;zero&nbsp;</I></TT></DIV>

<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>31.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I2006"></A>The syntax
rule for <FONT FACE="Arial, Helvetica">component_declaration</FONT> is
modified to use <FONT FACE="Arial, Helvetica">component_definition</FONT>
(instead of <FONT FACE="Arial, Helvetica">component_subtype_definition</FONT>).
The effect of this change is to allow the reserved word <B>aliased</B>
before the <FONT FACE="Arial, Helvetica">component_subtype_definition</FONT>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>31.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>A short-hand is provided for defining
a null record type (and a null record extension), as these will be more
common for abstract root types (and derived types without additional
components).</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>31.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The syntax rule for <FONT FACE="Arial, Helvetica">record_type_definition</FONT>
is modified to allow the reserved words <B>tagged</B> and <B>limited</B>.
Tagging is new. Limitedness is now orthogonal to privateness. In Ada
83 the syntax implied that limited private was sort of more private than
private. However, limitedness really has nothing to do with privateness;
limitedness simply indicates the lack of assignment capabilities, and
makes perfect sense for nonprivate types such as record types. </FONT></DIV>

<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>31.d/1</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>{<I><A HREF="defect1.html#8652/0009">8652/0009</A></I>}
The syntax rules now allow <U><FONT FACE="Arial, Helvetica">aspect_clause</FONT>s</U><S><FONT FACE="Arial, Helvetica">representation_clause</FONT>s</S>
to appear in a <FONT FACE="Arial, Helvetica">record_definition</FONT>.
This is not a language extension, because Legality Rules prevent all
language-defined representation clauses from appearing there. However,
an implementation-defined <FONT FACE="Arial, Helvetica">attribute_definition_clause</FONT>
could appear there. The reason for this change is to allow the rules
for <U><FONT FACE="Arial, Helvetica">aspect_clause</FONT>s</U><S><FONT FACE="Arial, Helvetica">representation_clause</FONT>s</S>
and representation pragmas to be as similar as possible. </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-2.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-3-8-1.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>