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
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>AARM95 - Deferred Constants</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-7-3-1.html">Previous</A> <A HREF="AA-7-5.html">Next</A></P>
<HR>
<H1> 7.4 Deferred Constants</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> [Deferred constant declarations may be used to
declare constants in the visible part of a package, but with the value
of the constant given in the private part. They may also be used to declare
constants imported from other languages (see <A HREF="AA-B.html">Annex
B</A>).] </DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="Normal"> [<A NAME="I3246"></A> A <I>deferred constant declaration</I>
is an <FONT FACE="Arial, Helvetica">object_declaration</FONT> with the
reserved word <B>constant</B> but no initialization expression.] <A NAME="I3247"></A>The
constant declared by a deferred constant declaration is called a <I>deferred
constant</I>. <A NAME="I3248"></A>A deferred constant declaration requires
a completion, which shall be a full constant declaration (called the
<I>full declaration</I> of the deferred constant), or a <FONT FACE="Arial, Helvetica">pragma</FONT>
Import (see <A HREF="AA-B.html">Annex B</A>). <A NAME="I3249"></A></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>2.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Proof: </B>The first sentence
is redundant, as it is stated officially in <A HREF="AA-3-3-1.html">3.3.1</A>.
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> A deferred constant
declaration that is completed by a full constant declaration shall occur
immediately within the visible part of a <FONT FACE="Arial, Helvetica">package_specification</FONT>.
For this case, the following additional rules apply to the corresponding
full declaration: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The full declaration shall occur immediately within the
private part of the same package;</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The deferred and full constants shall have the same type;
</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>5.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>This implies
that both the deferred declaration and the full declaration have to have
a <FONT FACE="Arial, Helvetica">subtype_indication</FONT> rather than
an <FONT FACE="Arial, Helvetica">array_type_definition</FONT>, because
each <FONT FACE="Arial, Helvetica">array_type_definition</FONT> would
define a new type. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If the subtype defined by the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
in the deferred declaration is constrained, then the subtype defined
by the <FONT FACE="Arial, Helvetica">subtype_indication</FONT> in the
full declaration shall match it statically. [On the other hand, if the
subtype of the deferred constant is unconstrained, then the full declaration
is still allowed to impose a constraint. The constant itself will be
constrained, like all constants;]</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If the deferred constant declaration includes the reserved
word <B>aliased</B>, then the full declaration shall also. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>7.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>On the other
hand, the full constant can be aliased even if the deferred constant
is not. </FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> [A deferred constant declaration that is completed
by a <FONT FACE="Arial, Helvetica">pragma</FONT> Import need not appear
in the visible part of a <FONT FACE="Arial, Helvetica">package_specification</FONT>,
and has no full constant declaration.]</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal"> The completion of a deferred constant declaration
shall occur before the constant is frozen (see <A HREF="AA-7-4.html">7.4</A>).</DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Normal"> <A NAME="I3250"></A>The elaboration of a deferred
constant declaration elaborates the <FONT FACE="Arial, Helvetica">subtype_indication</FONT>
or (only allowed in the case of an imported constant) the <FONT FACE="Arial, Helvetica">array_type_definition</FONT>.
</DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>12 The full constant declaration
for a deferred constant that is of a given private type or private extension
is not allowed before the corresponding <FONT FACE="Arial, Helvetica">full_type_declaration</FONT>.
This is a consequence of the freezing rules for types (see <A HREF="AA-13-14.html">13.14</A>).
</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><B>Ramification: </B>Multiple
or single declarations are allowed for the deferred and the full declarations,
provided that the equivalent single declarations would be allowed.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Deferred constant declarations
are useful for declaring constants of private views, and types with components
of private views. They are also useful for declaring access-to-constant
objects that designate variables declared in the private part of a package.
</FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Examples of
deferred constant declarations:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT>Null_Key : <B>constant</B> Key; <I>-- see <A HREF="AA-7-3-1.html">7.3.1</A></I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Examples"><TT>CPU_Identifier : <B>constant</B> String(1..8);<BR>
<B>pragma</B> Import(Assembler, CPU_Identifier, Link_Name => "CPU_ID");<BR>
<I>-- see <A HREF="AA-B-1.html">B.1</A></I></TT></DIV>
<H4 ALIGN=CENTER>Extensions to Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14.a</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1><A NAME="I3251"></A>In Ada 83,
a deferred constant is required to be of a private type declared in the
same visible part. This restriction is removed for Ada 95; deferred constants
can be of any type.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.b</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>In Ada 83, a deferred constant
declaration was not permitted to include a constraint, nor the reserved
word <B>aliased</B>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.c</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>In Ada 83, the rules required
conformance of type marks; here we require static matching of subtypes
if the deferred constant is constrained.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.d</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>A deferred constant declaration
can be completed with a <FONT FACE="Arial, Helvetica">pragma</FONT> Import.
Such a deferred constant declaration need not be within a <FONT FACE="Arial, Helvetica">package_specification</FONT>.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.e</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The rules for too-early uses of
deferred constants are modified in Ada 95 to allow more cases, and catch
all errors at compile time. This change is necessary in order to allow
deferred constants of a tagged type without violating the principle that
for a dispatching call, there is always an implementation to dispatch
to. It has the beneficial side-effect of catching some Ada-83-erroneous
programs at compile time. The new rule fits in well with the new freezing-point
rules. Furthermore, we are trying to convert undefined-value problems
into bounded errors, and we were having trouble for the case of deferred
constants. Furthermore, uninitialized deferred constants cause trouble
for the shared variable / tasking rules, since they are really variable,
even though they purport to be constant. In Ada 95, they cannot be touched
until they become constant.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.f</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Note that we do not consider this
change to be an upward incompatibility, because it merely changes an
erroneous execution in Ada 83 into a compile-time error.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.g</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>The Ada 83 semantics are unclear
in the case where the full view turns out to be an access type. It is
a goal of the language design to prevent uninitialized access objects.
One wonders if the implementation is required to initialize the deferred
constant to null, and then initialize it (again!) to its real value.
In Ada 95, the problem goes away. </FONT></DIV>
<H4 ALIGN=CENTER>Wording Changes from Ada 83</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14.h</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Since deferred constants can now
be of a nonprivate type, we have made this a stand-alone clause, rather
than a subclause of <A HREF="AA-7-3.html">7.3</A>, ``<A HREF="AA-7-3.html">Private
Types and Private Extensions</A>''.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14.i</FONT></DIV>
<DIV Class="Annotations"><FONT SIZE=-1>Deferred constant declarations
used to have their own syntax, but now they are simply a special case
of <FONT FACE="Arial, Helvetica">object_declaration</FONT>s. </FONT></DIV>
<HR>
<P><A HREF="AA-TOC.html">Contents</A> <A HREF="AA-0-29.html">Index</A> <A HREF="AA-7-3-1.html">Previous</A> <A HREF="AA-7-5.html">Next</A> <A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>
|