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> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-12-3.html">Previous</A> <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"> [<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>
<A NAME="I4239"></A><FONT FACE="Arial, Helvetica">defining_identifier_list</FONT> : <A NAME="I4240"></A><FONT FACE="Arial, Helvetica">mode</FONT> <A NAME="I4241"></A><FONT FACE="Arial, Helvetica">subtype_mark</FONT> [:= <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"> <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"> <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"> 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"> 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"> 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"> 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"> 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"> <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"> <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 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> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-12-3.html">Previous</A> <A HREF="AA-12-5.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|