File: AA-7-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 (220 lines) | stat: -rw-r--r-- 16,233 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
<!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>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-7-3-1.html">Previous</A>&nbsp;&nbsp;&nbsp;<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">&nbsp;&nbsp;&nbsp;[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">&nbsp;&nbsp;&nbsp;[<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">&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;[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">&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;<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&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;<I>Examples of
deferred constant declarations:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Examples"><TT>Null_Key&nbsp;:&nbsp;<B>constant</B>&nbsp;Key;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;see&nbsp;<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&nbsp;:&nbsp;<B>constant</B>&nbsp;String(1..8);<BR>
<B>pragma</B>&nbsp;Import(Assembler,&nbsp;CPU_Identifier,&nbsp;Link_Name&nbsp;=&gt;&nbsp;&quot;CPU_ID&quot;);<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>--&nbsp;see&nbsp;<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>&nbsp;&nbsp;&nbsp;<A HREF="AA-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-7-3-1.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-7-5.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="AA-TTL.html">Legal</A></P>
</BODY>
</HTML>