Contents Index Search Previous Next
12.5 Formal Types
1
[A generic formal subtype can be used to pass
to a generic unit a subtype whose type is in a certain class of types.]
1.a
Reason: We considered
having intermediate syntactic categories formal_integer_type_definition,
formal_real_type_definition, and
formal_fixed_point_definition, to
be more uniform with the syntax rules for non-generic-formal types. However,
that would make the rules for formal types slightly more complicated,
and it would cause confusion, since formal_discrete_type_definition
would not fit into the scheme very well.
Syntax
2
formal_type_declaration
::=
type defining_identifier[
discriminant_part]
is formal_type_definition;
3
formal_type_definition
::=
formal_private_type_definition
|
formal_derived_type_definition
|
formal_discrete_type_definition
|
formal_signed_integer_type_definition
|
formal_modular_type_definition
|
formal_floating_point_definition
|
formal_ordinary_fixed_point_definition
|
formal_decimal_fixed_point_definition
|
formal_array_type_definition
|
formal_access_type_definition
Legality Rules
4
{generic actual subtype}
{actual subtype} {generic
actual type} {actual
type} For a generic formal subtype, the
actual shall be a
subtype_mark;
it denotes the
(generic) actual subtype.
4.a
Ramification: When we
say simply ``formal'' or ``actual'' (for a generic formal that denotes
a subtype) we're talking about the subtype, not the type, since a name
that denotes a formal_type_declaration
denotes a subtype, and the corresponding actual also denotes a subtype.
Static Semantics
5
{generic formal type}
{formal type} {generic
formal subtype} {formal
subtype} A
formal_type_declaration
declares a
(generic) formal type, and its first subtype, the
(generic)
formal subtype.
5.a
Ramification: A subtype
(other than the first subtype) of a generic formal type is not a generic
formal subtype.
6
{determined class for a formal
type} {class determined
for a formal type} The form of a
formal_type_definition
determines a class to which the formal type belongs. For a
formal_private_type_definition
the reserved words
tagged and
limited indicate the class
(see
12.5.1). For a
formal_derived_type_definition
the class is the derivation class rooted at the ancestor type. For other
formal types, the name of the syntactic category indicates the class;
a
formal_discrete_type_definition
defines a discrete type, and so on.
6.a
Reason: This rule is
clearer with the flat syntax rule for formal_type_definition
given above. Adding formal_integer_type_definition
and others would make this rule harder to state clearly.
Legality Rules
7
The actual type shall be in the class determined
for the formal.
7.a
Ramification: For example,
if the class determined for the formal is the class of all discrete types,
then the actual has to be discrete.
7.b
Note that this rule does not
require the actual to belong to every class to which the formal belongs.
For example, formal private types are in the class of composite types,
but the actual need not be composite. Furthermore, one can imagine an
infinite number of classes that are just arbitrary sets of types that
obey the closed-under-derivation rule, and are therefore technically
classes (even though we don't give them names, since they are uninteresting).
We don't want this rule to apply to those classes.
7.c
``Limited'' is not a ``interesting''
class, but ``nonlimited'' is; it is legal to pass a nonlimited type to
a limited formal type, but not the other way around. The reserved word
limited really represents a class
containing both limited and nonlimited types. ``Private'' is not a class;
a generic formal private type accepts both private and nonprivate actual
types.
7.d
It is legal to pass a class-wide
subtype as the actual if it is in the right class, so long as the formal
has unknown discriminants.
Static Semantics
8/1
{
8652/0037}
[The formal type also belongs to each class that contains the determined
class.] The primitive subprograms of the type are as for any type in
the determined class. For a formal type other than a formal derived type,
these are the predefined operators of the type
. For an elementary
formal type, the predefined operators are implicitly declared immediately
after the declaration of the formal type. For a composite formal type,
the predefined operators are implicitly declared either immediately after
the declaration of the formal type, or later in its immediate scope according
to the rules of 7.3.1. ; they are
implicitly declared immediately after the declaration of the formal type.
In an instance, the copy of such an implicit declaration declares a view
of the predefined operator of the actual type, even if this operator
has been overridden for the actual type. [The rules specific to formal
derived types are given in
12.5.1.]
8.a
Ramification: All properties
of the type are as for any type in the class. Some examples: The primitive
operations available are as defined by the language for each class. The
form of constraint applicable to
a formal type in a subtype_indication
depends on the class of the type as for a nonformal type. The formal
type is tagged if and only if it is declared as a tagged private type,
or as a type derived from a (visibly) tagged type. (Note that the actual
type might be tagged even if the formal type is not.)
9
7 Generic formal types,
like all types, are not named. Instead, a name
can denote a generic formal subtype. Within a generic unit, a generic
formal type is considered as being distinct from all other (formal or
nonformal) types.
9.a
Proof: This follows from
the fact that each formal_type_declaration
declares a type.
10
8 A discriminant_part
is allowed only for certain kinds of types, and therefore only for certain
kinds of generic formal types. See 3.7.
10.a
Ramification: The term
``formal floating point type'' refers to a type defined by a formal_floating_point_definition.
It does not include a formal derived type whose ancestor is floating
point. Similar terminology applies to the other kinds of formal_type_definition.
Examples
11
Examples of
generic formal types:
12
type Item is private;
type Buffer(Length : Natural) is limited private;
13
type Enum is (<>);
type Int is range <>;
type Angle is delta <>;
type Mass is digits <>;
14
type Table is array (Enum) of Item;
15
Example of a generic
formal part declaring a formal integer type:
16
generic
type Rank is range <>;
First : Rank := Rank'First;
Second : Rank := First + 1; -- the operator "+" of the type Rank
Wording Changes from Ada 83
16.a
RM83 has separate sections ``Generic
Formal Xs'' and ``Matching Rules for Formal Xs'' (for various X's) with
most of the text redundant between the two. We have combined the two
in order to reduce the redundancy. In RM83, there is no ``Matching Rules
for Formal Types'' section; nor is there a ``Generic Formal Y Types''
section (for Y = Private, Scalar, Array, and Access). This causes, for
example, the duplication across all the ``Matching Rules for Y Types''
sections of the rule that the actual passed to a formal type shall be
a subtype; the new organization avoids that problem.
16.b
The matching rules are stated
more concisely.
16.c
We no longer consider the multiplying
operators that deliver a result of type universal_fixed to be
predefined for the various types; there is only one of each in package
Standard. Therefore, we need not mention them here as RM83 had to.
Contents Index Search Previous Next Legal