File: AA-12-4.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 (223 lines) | stat: -rw-r--r-- 16,378 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
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>AARM95 - Formal Objects</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-12-3.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-12-5.html">Next</A></P>
<HR>
<H1> 12.4 Formal Objects</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;[<A NAME="I4236"></A> <A NAME="I4237"></A>A generic
formal object can be used to pass a value or variable to a generic unit.]
</DIV>

<H4 ALIGN=CENTER>Language Design Principles</H4>
<DIV Class="Paranum"><FONT SIZE=-2>1.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>A generic formal object of mode
<B>in</B> is like a constant initialized to the value of the <FONT FACE="Arial, Helvetica">explicit_generic_actual_parameter</FONT>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>1.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>A generic formal object of mode
<B>in out</B> is like a renaming of the <FONT FACE="Arial, Helvetica">explicit_generic_actual_parameter</FONT>.
</FONT></DIV>

<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">formal_object_declaration<A NAME="I4238"></A>
::= </FONT><BR>
&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I4239"></A><FONT FACE="Arial, Helvetica">defining_identifier_list</FONT>&nbsp;:&nbsp;<A NAME="I4240"></A><FONT FACE="Arial, Helvetica">mode</FONT>&nbsp;<A NAME="I4241"></A><FONT FACE="Arial, Helvetica">subtype_mark</FONT>&nbsp;[:=&nbsp;<A NAME="I4242"></A><FONT FACE="Arial, Helvetica">default_expression</FONT>];</DIV>

<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I4243"></A>The expected type for the
<FONT FACE="Arial, Helvetica">default_expression</FONT>, if any, of a
formal object is the type of the formal object.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I4244"></A>For a generic formal object
of mode <B>in</B>, the expected type for the actual is the type of the
formal.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;For a generic formal object of mode <B>in out</B>,
the type of the actual shall resolve to the type of the formal. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>See the corresponding
rule for <FONT FACE="Arial, Helvetica">object_renaming_declaration</FONT>s
for a discussion of the reason for this rule. </FONT></DIV>

<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;If a generic formal object has a <FONT FACE="Arial, Helvetica">default_expression</FONT>,
then the mode shall be <B>in</B> [(either explicitly or by default)];
otherwise, its mode shall be either <B>in</B> or <B>in out</B>. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Mode <B>out</B>
is not allowed for generic formal objects. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;For a generic formal object of mode <B>in</B>,
the actual shall be an <FONT FACE="Arial, Helvetica">expression</FONT>.
For a generic formal object of mode <B>in out</B>, the actual shall be
a <FONT FACE="Arial, Helvetica">name</FONT> that denotes a variable for
which renaming is allowed (see <A HREF="AA-8-5-1.html">8.5.1</A>). </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>To be honest: </B>The part
of this that requires an <FONT FACE="Arial, Helvetica">expression</FONT>
or <FONT FACE="Arial, Helvetica">name</FONT> is a Name Resolution Rule,
but that's too pedantic to worry about. (The part about denoting a variable,
and renaming being allowed, is most certainly <I>not</I> a Name Resolution
Rule.) </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;The type of a generic formal object of mode <B>in</B>
shall be nonlimited. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>Since a generic
formal object is like a constant of mode <B>in</B> initialized to the
value of the actual, a limited type would not make sense, since initializing
a constant is not allowed for a limited type. That is, generic formal
objects of mode <B>in</B> are passed by copy, and limited types are not
supposed to be copied. </FONT></DIV>

<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;A <FONT FACE="Arial, Helvetica">formal_object_declaration</FONT>
declares a generic formal object. The default mode is <B>in</B>. <A NAME="I4245"></A>For
a formal object of mode <B>in</B>, the nominal subtype is the one denoted
by the <FONT FACE="Arial, Helvetica">subtype_mark</FONT> in the declaration
of the formal. <A NAME="I4246"></A>For a formal object of mode <B>in
out</B>, its type is determined by the <FONT FACE="Arial, Helvetica">subtype_mark</FONT>
in the declaration; its nominal subtype is nonstatic, even if the <FONT FACE="Arial, Helvetica">subtype_mark</FONT>
denotes a static subtype.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I4247"></A>In an instance, a <FONT FACE="Arial, Helvetica">formal_object_declaration</FONT>
of mode <B>in</B> declares a new stand-alone constant object whose initialization
expression is the actual, whereas a <FONT FACE="Arial, Helvetica">formal_object_declaration</FONT>
of mode <B>in out</B> declares a view whose properties are identical
to those of the actual. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>These rules
imply that generic formal objects of mode <B>in</B> are passed by copy,
whereas generic formal objects of mode <B>in out</B> are passed by reference.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Initialization and finalization
happen for the constant declared by a <FONT FACE="Arial, Helvetica">formal_object_declaration</FONT>
of mode <B>in</B> as for any constant; see <A HREF="AA-3-3-1.html">3.3.1</A>,
``<A HREF="AA-3-3-1.html">Object Declarations</A>'' and <A HREF="AA-7-6.html">7.6</A>,
``<A HREF="AA-7-6.html">User-Defined Assignment and Finalization</A>''.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I4248"></A>In an instance,
the subtype of a generic formal object of mode <B>in</B> is as for the
equivalent constant. In an instance, the subtype of a generic formal
object of mode <B>in out</B> is the subtype of the corresponding generic
actual. </FONT></DIV>

<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;<A NAME="I4249"></A><A NAME="I4250"></A>For the
evaluation of a <FONT FACE="Arial, Helvetica">generic_association</FONT>
for a formal object of mode <B>in</B>, a constant object is created,
the value of the actual parameter is converted to the nominal subtype
of the formal object, and assigned to the object[, including any value
adjustment -- see <A HREF="AA-7-6.html">7.6</A>]. <A NAME="I4251"></A></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This includes
evaluating the actual and doing a subtype conversion, which might raise
an exception. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>The rule for
evaluating a <FONT FACE="Arial, Helvetica">generic_association</FONT>
for a formal object of mode <B>in out</B> is covered by the general Dynamic
Semantics rule in <A HREF="AA-12-3.html">12.3</A>. </FONT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>6&nbsp;&nbsp;The constraints that apply
to a generic formal object of mode <B>in out</B> are those of the corresponding
generic actual parameter (not those implied by the <FONT FACE="Arial, Helvetica">subtype_mark</FONT>
that appears in the <FONT FACE="Arial, Helvetica">formal_object_declaration</FONT>).
Therefore, to avoid confusion, it is recommended that the name of a first
subtype be used for the declaration of such a formal object. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Constraint
checks are done at instantiation time for formal objects of mode <B>in</B>,
but not for formal objects of mode <B>in out</B>. </FONT></DIV>

<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>12.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I4252"></A>In Ada 83,
it is forbidden to pass a (nongeneric) formal parameter of mode <B>out</B>,
or a subcomponent thereof, to a generic formal object of mode <B>in out</B>.
This restriction is removed in Ada 95. </FONT></DIV>

<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>12.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>We make ``<FONT FACE="Arial, Helvetica">mode</FONT>''
explicit in the syntax. RM83 refers to the mode without saying what it
is. This is also more uniform with the way (nongeneric) formal parameters
are defined.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>We considered allowing mode <B>out</B>
in Ada 95, for uniformity with (nongeneric) formal parameters. The semantics
would be identical for modes <B>in out</B> and <B>out</B>. (Note that
generic formal objects of mode <B>in out</B> are passed by reference.
Note that for (nongeneric) formal parameters that are allowed to be passed
by reference, the semantics of <B>in out</B> and <B>out</B> is the same.
The difference might serve as documentation. The same would be true for
generic formal objects, if <B>out</B> were allowed, so it would be consistent.)
We decided not to make this change, because it does not produce any important
benefit, and any change has some cost. </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-12-3.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-12-5.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>