7.5 Limited Types
A limited type is (a view of) a type for which copying
(such as for an assignment_statement
is not allowed. A nonlimited type is a (view of a) type for which copying
If a tagged record type has any limited components,
then the reserved word limited
shall appear in its record_type_definition
If the reserved word limited
appears in the definition of a derived_type_definition
its parent type and any progenitor interfaces shall be limited.
type is limited
if it is one of the following:
- a type with the reserved word limited,
synchronized, task, or protected in its definition;
paragraph was deleted.
- a composite type with a limited component;
- a derived type whose parent is limited
and is not an interface.
Otherwise, the type is nonlimited.
There are no predefined equality operators for a
For an aggregate
of a limited type used to initialize an object as allowed above, the
implementation shall not create a separate anonymous object for the aggregate
For a function_call
of a type with a part that is of a task, protected, or explicitly limited
record type that is used to initialize an object as allowed above, the
implementation shall not create a separate return object (see 6.5) for
shall be constructed directly in the new object.
14 While it is allowed to write initializations
of limited objects, such initializations never copy a limited object.
The source of such an assignment operation must be an aggregate
and such aggregate
must be built directly in the target object.
Paragraphs 10 through
15 were deleted.
illustrated in 7.3.1
, an untagged limited
type can become nonlimited under certain circumstances.
Example of a package
with a limited type:
package IO_Package is
type File_Name is limited private;
procedure Open (F : in out File_Name);
procedure Close(F : in out File_Name);
procedure Read (F : in File_Name; Item : out Integer);
procedure Write(F : in File_Name; Item : in Integer);
type File_Name is
Internal_Name : Integer := 0;
package body IO_Package is
Limit : constant := 200;
type File_Descriptor is record ... end record;
Directory : array (1 .. Limit) of File_Descriptor;
procedure Open (F : in out File_Name) is ... end;
procedure Close(F : in out File_Name) is ... end;
procedure Read (F : in File_Name; Item : out Integer) is ... end;
procedure Write(F : in File_Name; Item : in Integer) is ... end;
16 Notes on the example: In the
example above, an outside subprogram making use of IO_Package may obtain
a file name by calling Open and later use it in calls to Read and Write.
Thus, outside the package, a file name obtained from Open acts as a kind
of password; its internal properties (such as containing a numeric value)
are not known and no other operations (such as addition or comparison
of internal names) can be performed on a file name. Most importantly,
clients of the package cannot make copies of objects of type File_Name.
This example is characteristic of any case where complete
control over the operations of a type is desired. Such packages serve
a dual purpose. They prevent a user from making use of the internal structure
of the type. They also implement the notion of an encapsulated data type
where the only operations on the type are those given in the package
The fact that the full view of File_Name is explicitly
means that parameter passing will always be by
reference and function results will always be built directly in the result
object (see 6.2