Go to the first, previous, next, last section, table of contents.

12.1 Generic Declarations

  1. 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.


  2. generic_declaration ::=
       generic_subprogram_declaration | generic_package_declaration
  3. generic_subprogram_declaration ::=
       generic_formal_part subprogram_specification;
  4. generic_package_declaration ::=
       generic_formal_part package_specification;
  5. generic_formal_part ::=
       generic {generic_formal_parameter_declaration | use_clause}
  6. generic_formal_parameter_declaration ::=
        | formal_type_declaration
        | formal_subprogram_declaration
        | formal_package_declaration
    1. 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

  1. A generic_declaration declares a generic unit -- a generic package, generic procedure or generic function, as appropriate.
  2. 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

  3. The elaboration of a generic_declaration has no effect.


  4. (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.
  5. (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.
  6. (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.)


  7. Examples of generic formal parts:
  8. generic     --  parameterless
  9. generic
        Size : Natural;  --  formal object
  10. generic
       Length : Integer := 200;
       --  formal object with a default expression
  11.    Area : Integer := Length*Length;
       --  formal object with a default expression
  12. generic
       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
  13. Examples of generic declarations declaring generic subprograms Exchange and Squaring:
  14. generic
       type Elem is private;
    procedure Exchange(U, V : in out Elem);
  15. generic
       type Item is private;
       with function "*"(U, V : Item) return Item is <>;
    function Squaring(X : Item) return Item;
  16. Example of a generic declaration declaring a generic package:
  17. generic
       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;

Go to the first, previous, next, last section, table of contents.