3.2.1 Type Declarations
Syntax
Legality Rules
A given type shall not have a subcomponent whose
type is the given type itself.
Static Semantics
{
AI95-00230-01}
{named type} A
type defined by a
type_declaration
is a
named type; such a type has one or more nameable subtypes.
{anonymous type} Certain
other forms of declaration also include type definitions as part of the
declaration for an object. The type defined by such a declaration is
anonymous — it has no nameable subtypes.
{italics
(pseudo-names of anonymous types)} For
explanatory purposes, this International Standard sometimes refers to
an anonymous type by a pseudo-name, written in italics, and uses such
pseudo-names at places where the syntax normally requires an
identifier.
For a named type whose first subtype is T, this International Standard
sometimes refers to the type of T as simply “the type T”.
Ramification: {
AI95-00230-01}
The only user-defined types that can be anonymous in the above sense
are array, access, task, and protected types. An anonymous array, task,
or protected type can be defined as part of an
object_declaration.
An anonymous access type can be defined as part of numerous other constructs.
To be honest: Class-wide, universal,
and root numeric types are full types.
{predefined operator
[partial]} The definition of a type implicitly
declares certain
predefined operators that operate on the type,
according to what classes the type belongs, as specified in
4.5,
“
Operators and Expression Evaluation”.
Discussion: We no longer talk about the
implicit declaration of basic operations. These are treated like an
if_statement
— they don't need to be declared, but are still applicable to only
certain classes of types.
{predefined type}
The
predefined types [(for example the types
Boolean, Wide_Character, Integer,
root_integer, and
universal_integer)]
are the types that are defined in [a predefined library package called]
Standard[; this package also includes the [(implicit)] declarations of
their predefined operators]. [The package Standard is described in
A.1.]
Ramification: We use the term “predefined”
to refer to entities declared in the visible part of Standard, to implicitly
declared operators of a type whose semantics are defined by the language,
to Standard itself, and to the “predefined environment”.
We do not use this term to refer to library packages other than Standard.
For example Text_IO is a language-defined package, not a predefined package,
and Text_IO.Put_Line is not a predefined operation.
Dynamic Semantics
{elaboration (full_type_declaration)
[partial]} The elaboration of a
full_type_declaration
consists of the elaboration of the full type definition.
{elaboration
(full type definition) [partial]} Each
elaboration of a full type definition creates a distinct type and its
first subtype.
Reason: The creation is associated with
the type definition, rather than the type declaration,
because there are types that are created by full type definitions that
are not immediately contained within a type declaration (e.g. an array
object declaration, a singleton task declaration, etc.).
Ramification: Any implicit declarations
that occur immediately following the full type definition are elaborated
where they (implicitly) occur.
Examples
Examples of type
definitions:
(White, Red, Yellow, Green, Blue, Brown, Black)
range 1 .. 72
array(1 .. 10) of Integer
Examples of type
declarations:
type Color is (White, Red, Yellow, Green, Blue, Brown, Black);
type Column is range 1 .. 72;
type Table is array(1 .. 10) of Integer;
3 Each of the above examples declares a
named type. The identifier given denotes the first subtype of the type.
Other named subtypes of the type can be declared with
subtype_declarations
(see
3.2.2). Although names do not directly
denote types, a phrase like “the type Column” is sometimes
used in this International Standard to refer to the type of Column, where
Column denotes the first subtype of the type. For an example of the definition
of an anonymous type, see the declaration of the array Color_Table in
3.3.1; its type is anonymous — it has
no nameable subtypes.
Wording Changes from Ada 83
We have generalized the concept of first-named
subtype (now called simply “first subtype”) to cover all
kinds of types, for uniformity of description elsewhere. RM83 defined
first-named subtype in Section 13. We define first subtype here, because
it is now a more fundamental concept. We renamed the term, because in
Ada 95 some first subtypes have no name.
{
AI95-00230-01}
We no longer elaborate
discriminant_parts,
because there is nothing to do, and it was complex to say that you only
wanted to elaborate it once for a private or incomplete type. This is
also consistent with the fact that subprogram specifications are not
elaborated (neither in Ada 83 nor in Ada 95). Note, however, that an
access_definition
appearing in a
discriminant_part
is elaborated at the
full_type_declaration
(for a nonlimited type) or when an object with such a discriminant is
created (for a limited type).
Wording Changes from Ada 95
{
AI95-00230-01}
Added wording so that anonymous access types are always full types, even
if they appear in renames.
{
AI95-00326-01}
Added a definition of full view, so that all types have a well-defined
full view.