____ | Up | Next | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help


12.5.1 Formal Private and Derived Types

(1)
The class determined for a formal private type can be either limited or nonlimited, and either tagged or untagged; no more specific class is known for such a type. The class determined for a formal derived type is the derivation class rooted at the ancestor type.
Syntax
(2)
       formal_private_type_definition ::= [[abstract] tagged] [limited] private
(3)
       formal_derived_type_definition ::= [abstract] new subtype_mark [with private]
Legality Rules
(4)
If a generic formal type declaration has a known_discriminant_part, then it shall not include a default_expression for a discriminant.
(5)
The ancestor subtype of a formal derived type is the subtype denoted by the subtype_mark of the formal_derived_type_definition. For a formal derived type declaration, the reserved words with private shall appear if and only if the ancestor type is a tagged type; in this case the formal derived type is a private extension of the ancestor type and the ancestor shall not be a class-wide type. Similarly, the optional reserved word abstract shall appear only if the ancestor type is a tagged type.
(6)
If the formal subtype is definite, then the actual subtype shall also be definite.
(7)
For a generic formal derived type with no discriminant_part:
(8)
(9)
(10)
(11)
The declaration of a formal derived type shall not have a known_discriminant_part. For a generic formal private type with a known_discriminant_part:
(12)
(13)
(14)
(15)
For a generic formal type with an unknown_discriminant_part, the actual may, but need not, have discriminants, and may be definite or indefinite.
Static Semantics
(16)
The class determined for a formal private type is as follows:
(17)
       Type Definition                    Determined Class

       limited private                    the class of all types
       private                            the class of all nonlimited types
       tagged limited private             the class of all tagged types
       tagged private                     the class of all nonlimited tagged types
(18)
The presence of the reserved word abstract determines whether the actual type may be abstract.
(19)
A formal private or derived type is a private or derived type, respectively. A formal derived tagged type is a private extension. A formal private or derived type is abstract if the reserved word abstract appears in its declaration.
(20)
If the ancestor type is a composite type that is not an array type, the formal type inherits components from the ancestor type (including discriminants if a new discriminant_part is not specified), as for a derived type defined by a derived_type_definition (see 3.4).
(21)
For a formal derived type, the predefined operators and inherited user-defined subprograms are determined by the ancestor type, and are implicitly declared at the earliest place, if any, within the immediate scope of the formal type, where the corresponding primitive subprogram of the ancestor is visible (see 7.3.1). In an instance, the copy of such an implicit declaration declares a view of the corresponding primitive subprogram of the ancestor, even if this primitive has been overridden for the actual type. In the case of a formal private extension, however, the tag of the formal type is that of the actual type, so if the tag in a call is statically determined to be that of the formal type, the body executed will be that corresponding to the actual type.
(22)
For a prefix S that denotes a formal indefinite subtype, the following attribute is defined:
(23)
S'Definite

(24)
(25)
(26)
(27)
(28)

____ | Up | Next | Back | Forward
TOC -- / --.-- / --.--.-- | Index | Search | Syntax | Help

Ada WWW Home -- Email comments, additions, corrections, gripes, kudos, etc. to:

Magnus Kempe -- Magnus.Kempe@di.epfl.ch
Copyright statement
Page last generated: 95-03-12