12.1 Generic Declarations

From OC Systems Wiki!
Jump to: navigation, search

A generic_declaration declares a generic unit, which is either a generic subprogram or a generic package. A generic_declaration includes a generic_formal_part declaring any generic formal parameters. A generic formal parameter can be an object; alternatively (unlike a parameter of a subprogram), it can be a type, a subprogram, or a package.


generic_declaration ::= generic_subprogram_declaration | generic_package_declaration

generic_subprogram_declaration ::=
    generic_formal_part  subprogram_specification;

generic_package_declaration ::=
    generic_formal_part  package_specification;

generic_formal_part ::= generic {generic_formal_parameter_declaration | use_clause}

generic_formal_parameter_declaration ::=
  | formal_type_declaration
  | formal_subprogram_declaration
  | formal_package_declaration

The only form of subtype_indication allowed within a generic_formal_part is a subtype_mark (that is, the subtype_indication shall not include an explicit constraint). The defining name of a generic subprogram shall be an identifier (not an operator_symbol).

Static Semantics

A generic_declaration declares a generic unit -- a generic package, generic procedure or generic function, as appropriate.

An entity is a generic formal entity if it is declared by a generic_formal_parameter_declaration. Generic formal, or simply formal, is used as a prefix in referring to objects, subtypes (and types), functions, procedures and packages, that are generic formal entities, as well as to their respective declarations. Examples: generic formal procedure or a formal integer type declaration.

Dynamic Semantics

The elaboration of a generic_declaration has no effect.


1  Outside a generic unit a name that denotes the generic_declaration denotes the generic unit. In contrast, within the declarative region of the generic unit, a name that denotes the generic_declaration denotes the current instance.

2  Within a generic subprogram_body, the name of this program unit acts as the name of a subprogram. Hence this name can be overloaded, and it can appear in a recursive call of the current instance. For the same reason, this name cannot appear after the reserved word new in a (recursive) generic_instantiation.

3  A default_expression or default_name appearing in a generic_formal_part is not evaluated during elaboration of the generic_formal_part; instead, it is evaluated when used. (The usual visibility rules apply to any name used in a default: the denoted declaration therefore has to be visible at the place of the expression.)


Examples of generic formal parts:

generic     --  parameterless 

    Size : Natural;  --  formal object 

    Length : Integer := 200;          -- formal object with a default expression

    Area   : Integer := Length*Length; -- formal object with a default expression

    type Item  is private;                       -- formal type     
    type Index is (<>);                          -- formal type 
    type Row   is array(Index range <>) of Item; -- formal type 
    with function "<"(X, Y : Item) return Boolean;    -- formal subprogram 

Examples of generic declarations declaring generic subprograms Exchange and Squaring:

    type Elem is private;
procedure Exchange(U, V in out Elem);

    type Item is private; 
    with function "*"(U, V : Item) return Item is <>;
function Squaring(X Item) return Item;

Example of a generic declaration declaring a generic package:

    type Item   is private;
    type Vector is array (Positive range <>) of Item;   
    with function Sum(X, Y : Item) return Item;
package On_Vectors is
    function Sum  (A, B Vector) return Vector;
    function Sigma(A    Vector) return Item; 
    Length_Error : exception;
end On_Vectors;

Copyright © 1992,1993,1994,1995 Intermetrics, Inc.
Copyright © 2000 The MITRE Corporation, Inc. Ada Reference Manual