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
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Parameter Associations</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-6-4.html">Previous</A> <A HREF="AA-6-5.html">Next</A></P>
<HR>
<H1> 6.4.1 Parameter Associations</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [<A NAME="I3147"></A> A parameter association
defines the association between an actual parameter and a formal parameter.]
</DIV>
<H4 ALIGN=CENTER>Language Design Principles</H4>
<DIV Class="Paranum"><FONT SIZE=-2>1.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The parameter passing rules for
<B>out</B> parameters are designed to ensure that the parts of a type
that have implicit initial values (see <A HREF="AA-3-3-1.html">3.3.1</A>)
don't become ``de-initialized'' by being passed as an <B>out</B> parameter.
</FONT></DIV>
<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="Normal"> The <I>formal_parameter_</I><FONT FACE="Arial, Helvetica">selector_name</FONT>
of a <FONT FACE="Arial, Helvetica">parameter_association</FONT> shall
resolve to denote a <FONT FACE="Arial, Helvetica">parameter_specification</FONT>
of the view being called.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3148"></A>The <I>actual parameter</I>
is either the <FONT FACE="Arial, Helvetica">explicit_actual_parameter</FONT>
given in a <FONT FACE="Arial, Helvetica">parameter_association</FONT>
for a given formal parameter, or the corresponding <FONT FACE="Arial, Helvetica">default_expression</FONT>
if no <FONT FACE="Arial, Helvetica">parameter_association</FONT> is given
for the formal parameter. <A NAME="I3149"></A>The expected type for an
actual parameter is the type of the corresponding formal parameter. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>To be honest: </B>The corresponding
<FONT FACE="Arial, Helvetica">default_expression</FONT> is the one of
the corresponding formal parameter in the profile of the view denoted
by the <FONT FACE="Arial, Helvetica">name</FONT> or <FONT FACE="Arial, Helvetica">prefix</FONT>
of the call. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Normal"> If the mode is <B>in</B>, the actual is interpreted
as an <FONT FACE="Arial, Helvetica">expression</FONT>; otherwise, the
actual is interpreted only as a <FONT FACE="Arial, Helvetica">name</FONT>,
if possible. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This formally
resolves the ambiguity present in the syntax rule for <FONT FACE="Arial, Helvetica">explicit_actual_parameter</FONT>.
Note that we don't actually require that the actual be a <FONT FACE="Arial, Helvetica">name</FONT>
if the mode is not <B>in</B>; we do that below. </FONT></DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal"> If the mode is <B>in out</B> or <B>out</B>, the
actual shall be a <FONT FACE="Arial, Helvetica">name</FONT> that denotes
a variable. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>We no longer
need ``or a <FONT FACE="Arial, Helvetica">type_conversion</FONT> whose
argument is the <FONT FACE="Arial, Helvetica">name</FONT> of a variable,''
because a <FONT FACE="Arial, Helvetica">type_conversion</FONT> is now
a <FONT FACE="Arial, Helvetica">name</FONT>, and a <FONT FACE="Arial, Helvetica">type_conversion</FONT>
of a variable is a variable. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.b</FONT></DIV>
<DIV Class="Annotations" Style="margin-bottom: 0.4em"><FONT SIZE=-1><B>Reason:
</B>The requirement that the actual be a (variable) <FONT FACE="Arial, Helvetica">name</FONT>
is not an overload resolution rule, since we don't want the difference
between <FONT FACE="Arial, Helvetica">expression</FONT> and <FONT FACE="Arial, Helvetica">name</FONT>
to be used to resolve overloading. For example: </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.c</FONT></DIV>
<DIV Class="SmallExamples"><TT>procedure Print(X : <B>in</B> Integer; Y : <B>in</B> Boolean := True);<BR>
procedure Print(Z : <B>in out</B> Integer);<BR>
. . .<BR>
Print(3); --<I> Ambiguous!</I><BR>
</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The above call to Print is ambiguous
even though the call is not compatible with the second Print which requires
an actual that is a (variable) <FONT FACE="Arial, Helvetica">name</FONT>
(``3'' is an <FONT FACE="Arial, Helvetica">expression</FONT>, not a <FONT FACE="Arial, Helvetica">name</FONT>).
This requirement is a legality rule, so overload resolution fails before
it is considered, meaning that the call is ambiguous. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> The type of the actual parameter associated with
an access parameter shall be convertible (see <A HREF="AA-4-6.html">4.6</A>)
to its anonymous access type. <A NAME="I3150"></A></DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <A NAME="I3151"></A>For
the evaluation of a <FONT FACE="Arial, Helvetica">parameter_association</FONT>:
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The actual parameter is first evaluated.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>For an access parameter, the <FONT FACE="Arial, Helvetica">access_definition</FONT>
is elaborated, which creates the anonymous access type.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>For a parameter [(of any mode)] that is passed by reference
(see <A HREF="AA-6-2.html">6.2</A>), a view conversion of the actual
parameter to the nominal subtype of the formal parameter is evaluated,
and the formal parameter denotes that conversion. <A NAME="I3152"></A></LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>10.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>We are always
allowing sliding, even for <B>[in] out</B> by-reference parameters. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC><A NAME="I3153"></A>For an <B>in</B> or <B>in out</B> parameter
that is passed by copy (see <A HREF="AA-6-2.html">6.2</A>), the formal
parameter object is created, and the value of the actual parameter is
converted to the nominal subtype of the formal parameter and assigned
to the formal. <A NAME="I3154"></A></LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The conversion
mentioned here is a value conversion. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<UL Class="Bulleted" Style="margin-bottom: 0.3em"><LI TYPE=DISC>For an <B>out</B> parameter that is passed by copy, the
formal parameter object is created, and: </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<UL Class="CodeIndentedBulleted"><LI TYPE=DISC>For an access type, the formal parameter is initialized
from the value of the actual, without a constraint check; </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>13.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>This preserves
the Language Design Principle that an object of an access type is always
initialized with a ``reasonable'' value. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<UL Class="CodeIndentedBulleted"><LI TYPE=DISC>For a composite type with discriminants or that has implicit
initial values for any subcomponents (see <A HREF="AA-3-3-1.html">3.3.1</A>),
the behavior is as for an <B>in out</B> parameter passed by copy. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>14.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Reason: </B>This ensures that
no part of an object of such a type can become ``de-initialized'' by
being part of an <B>out</B> parameter. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This includes
an array type whose component type is an access type, and a record type
with a component that has a <FONT FACE="Arial, Helvetica">default_expression</FONT>,
among other things. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<UL Class="CodeIndentedBulleted"><LI TYPE=DISC>For any other type, the formal parameter is uninitialized.
If composite, a view conversion of the actual parameter to the nominal
subtype of the formal is evaluated [(which might raise Constraint_Error)],
and the actual subtype of the formal is that of the view conversion.
If elementary, the actual subtype of the formal is given by its nominal
subtype. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>15.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This case
covers scalar types, and composite types whose subcomponent's subtypes
do not have any implicit initial values. The view conversion for composite
types ensures that if the lengths don't match between an actual and a
formal array parameter, the Constraint_Error is raised before the call,
rather than after. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3155"></A><A NAME="I3156"></A>A formal
parameter of mode <B>in out</B> or <B>out</B> with discriminants is constrained
if either its nominal subtype or the actual parameter is constrained.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3157"></A><A NAME="I3158"></A><A NAME="I3159"></A><A NAME="I3160"></A><A NAME="I3161"></A>After
normal completion and leaving of a subprogram, for each <B>in out</B>
or <B>out</B> parameter that is passed by copy, the value of the formal
parameter is converted to the subtype of the variable given as the actual
parameter and assigned to it. <A NAME="I3162"></A>These conversions and
assignments occur in an arbitrary order. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>The conversions
mentioned above during parameter passing might raise Constraint_Error
-- (see <A HREF="AA-4-6.html">4.6</A>). </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>If any conversion
or assignment as part of parameter passing propagates an exception, the
exception is raised at the place of the subprogram call; that is, it
cannot be handled inside the <FONT FACE="Arial, Helvetica">subprogram_body</FONT>.
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Proof: </B>Since these checks
happen before or after executing the <FONT FACE="Arial, Helvetica">subprogram_body</FONT>,
the execution of the <FONT FACE="Arial, Helvetica">subprogram_body</FONT>
does not dynamically enclose them, so it can't handle the exceptions.
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>17.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Discussion: </B>The variable
we're talking about is the one denoted by the <I>variable_</I><FONT FACE="Arial, Helvetica">name</FONT>
given as the <FONT FACE="Arial, Helvetica">explicit_actual_parameter</FONT>.
If this <I>variable_</I><FONT FACE="Arial, Helvetica">name</FONT> is
a <FONT FACE="Arial, Helvetica">type_conversion</FONT>, then the rules
in <A HREF="AA-4-6.html">4.6</A> for assigning to a view conversion apply.
That is, if X is of subtype S1, and the actual is S2(X), the above-mentioned
conversion will convert to S2, and the one mentioned in <A HREF="AA-4-6.html">4.6</A>
will convert to S1. </FONT></DIV>
<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>17.e</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I3163"></A>In Ada 95,
a program can rely on the fact that passing an object as an <B>out</B>
parameter does not ``de-initialize'' any parts of the object whose subtypes
have implicit initial values. (This generalizes the RM83 rule that required
copy-in for parts that were discriminants or of an access type.) </FONT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>17.f</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>We have eliminated the subclause
on Default Parameters, as it is subsumed by earlier clauses and subclauses.
</FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-6-4.html">Previous</A> <A HREF="AA-6-5.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|