- (1)
- 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 Annex B).
Legality Rules
- (2)
- A deferred constant declaration is an object_declaration with the reserved
word constant but no initialization expression. The constant declared by a
deferred constant declaration is called a deferred constant. A deferred constant
declaration requires a completion, which shall be a full constant declaration
(called the full declaration of the deferred constant), or a pragma Import
(see Annex B).
- (3)
- A deferred constant declaration that is completed by a full constant
declaration shall occur immediately within the visible part of a package_specification. For this case, the following additional rules apply to the
corresponding full declaration:
- (4)
- The full declaration shall occur immediately within the private
part of the same package;
- (5)
- The deferred and full constants shall have the same type;
- (6)
- If the subtype defined by the subtype_indication in the deferred
declaration is constrained, then the subtype defined by the
subtype_indication 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;
- (7)
- If the deferred constant declaration includes the reserved word
aliased, then the full declaration shall also.
- (8)
- A deferred constant declaration that is completed by a pragma Import need
not appear in the visible part of a package_specification, and has no full
constant declaration.
- (9)
- The completion of a deferred constant declaration shall occur before the
constant is frozen (see 7.4).
Dynamic Semantics
- (10)
- The elaboration of a deferred constant declaration elaborates the
subtype_indication or (only allowed in the case of an imported constant) the
array_type_definition.
-
- (11)
(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
full_type_declaration. This is a consequence of the freezing rules for types
(see 13.14).
Examples
- (12)
- Examples of deferred constant declarations:
(13)
Null_Key : constant Key; -- see 7.3.1
(14)
CPU_Identifier : constant String(1..8);
pragma Import(Assembler, CPU_Identifier, Link_Name => "CPU_ID");
-- see B.1
-- Email comments, additions, corrections, gripes, kudos, etc. to:
Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12