Contents Index Search Previous Next
12.5.1 Formal Private and Derived Types
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
] new subtype_mark
If a generic formal type declaration has a known_discriminant_part,
then it shall not include a default_expression
for a discriminant.
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.
If the formal subtype is definite, then the actual
subtype shall also be definite.
For a generic formal
derived type with no discriminant_part:
- If the ancestor subtype is constrained,
the actual subtype shall be constrained, and shall be statically compatible
with the ancestor;
- If the ancestor subtype is an unconstrained
access or composite subtype, the actual subtype shall be unconstrained.
- If the ancestor subtype is an unconstrained
discriminated subtype, then the actual shall have the same number of
discriminants, and each discriminant of the actual shall correspond to
a discriminant of the ancestor, in the sense of 3.7.
of a formal derived type shall not have a known_discriminant_part.
For a generic formal private type with a known_discriminant_part:
- The actual type shall be a type with
the same number of discriminants.
- The actual subtype shall be unconstrained.
- The subtype of each discriminant of
the actual type shall statically match the subtype of the corresponding
discriminant of the formal type.
For a generic formal type with an unknown_discriminant_part,
the actual may, but need not, have discriminants, and may be definite
The class determined
for a formal private type is as follows:
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
The presence of the reserved word abstract
determines whether the actual type may be abstract.
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.
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
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 of the formal
derived type, even if this primitive has been overridden for the actual
type. When the ancestor of the formal derived type is itself a formal
type, the copy of the implicit declaration declares a view of the corresponding
copied operation of the ancestor. 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.
For a prefix
S that denotes a formal indefinite subtype, the following attribute is
S'Definite yields True if the
actual subtype corresponding to S is definite; otherwise it yields False.
The value of this attribute is of the predefined type Boolean.
accordance with the general rule that the actual type shall belong to
the class determined for the formal (see 12.5,
- If the formal
type is nonlimited, then so shall be the actual;
- For a formal
derived type, the actual shall be in the class rooted at the ancestor
10 The actual type can
be abstract only if the formal type is abstract (see 3.9.3).
11 If the formal has a
discriminant_part, the actual can
be either definite or indefinite. Otherwise, the actual has to be definite.
Contents Index Search Previous Next Legal