Ada Conformity Assessment Authority      Home Conformity Assessment   Test Suite ARGAda Standard
Annotated Ada Reference Manual (Ada 2022)Legal Information
Contents   Index   References   Search   Previous   Next 

3.5.1 Enumeration Types

[ An enumeration_type_definition defines an enumeration type.] 


enumeration_type_definition ::= 
   (enumeration_literal_specification {, enumeration_literal_specification})
enumeration_literal_specification ::= 
    defining_identifier | defining_character_literal
defining_character_literal ::= character_literal

Legality Rules

{AI05-0227-1} {AI05-0299-1} The defining_identifiers in upper case [and the defining_character_literals] listed in an enumeration_type_definition shall be distinct. 
Proof: {AI05-0227-1} For character literals, this is a ramification of the normal disallowance of homographs explicitly declared immediately in the same declarative region. 
Reason: {AI05-0227-1} To ease implementation of the attribute Wide_Wide_Value, we require that all enumeration literals have distinct images. 

Static Semantics

{AI05-0006-1} Each enumeration_literal_specification is the explicit declaration of the corresponding enumeration literal: it declares a parameterless function, whose defining name is the defining_identifier or defining_character_literal, and whose result subtype is the base subtype of the enumeration type. 
Reason: This rule defines the profile of the enumeration literal, which is used in the various types of conformance.
Ramification: The parameterless function associated with an enumeration literal is fully defined by the enumeration_type_definition; a body is not permitted for it, and it never fails the Elaboration_Check when called. 
Discussion: {AI05-0006-1} The result subtype is primarily a concern when an enumeration literal is used as the expression of a case statement, due to the full coverage requirement based on the nominal subtype. 
Each enumeration literal corresponds to a distinct value of the enumeration type, and to a distinct position number. The position number of the value of the first listed enumeration literal is zero; the position number of the value of each subsequent enumeration literal is one more than that of its predecessor in the list.
[The predefined order relations between values of the enumeration type follow the order of corresponding position numbers.]
[ If the same defining_identifier or defining_character_literal is specified in more than one enumeration_type_definition, the corresponding enumeration literals are said to be overloaded. At any place where an overloaded enumeration literal occurs in the text of a program, the type of the enumeration literal has to be determinable from the context (see 8.6).] 

Dynamic Semantics

The elaboration of an enumeration_type_definition creates the enumeration type and its first subtype, which is constrained to the base range of the type. 
Ramification: The first subtype of a discrete type is always constrained, except in the case of a derived type whose parent subtype is Whatever'Base. 
When called, the parameterless function associated with an enumeration literal returns the corresponding value of the enumeration type. 
NOTE   If an enumeration literal occurs in a context that does not otherwise suffice to determine the type of the literal, then qualification by the name of the enumeration type is one way to resolve the ambiguity (see 4.7).


Examples of enumeration types and subtypes: 
{AI12-0386-1} type Day        is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
type Month_Name is (January, February, March, April, May, June, July,
                    August, September, October, November, December);

type Suit       is (Clubs, Diamonds, Hearts, Spades);
type Gender     is (M, F);
type Level      is (Low, Medium, Urgent);
type Color      is (White, Red, Yellow, Green, Blue, Brown, Black);
type Light      is (Red, Amber, Green); -- Red and Green are overloaded
type Hexa       is ('A', 'B', 'C', 'D', 'E', 'F');
type Mixed      is ('A', 'B', '*', B, None, '?', '%');
subtype Weekday is Day   range Mon .. Fri;
subtype Major   is Suit  range Hearts .. Spades;
subtype Rainbow is Color range Red .. Blue;
                               -- the Color Red, not the Light

Wording Changes from Ada 83

The syntax rule for defining_character_literal is new. It is used for the defining occurrence of a character_literal, analogously to defining_identifier. Usage occurrences use the name or selector_name syntactic categories.
We emphasize the fact that an enumeration literal denotes a function, which is called to produce a value. 

Incompatibilities With Ada 2005

{AI05-0227-1} Correction: Required that all enumeration literals in a type have distinct images; this might not be the case since upper case conversion can map distinct characters to the same upper case character. This can only happen for identifiers using Unicode characters first allowed by Ada 2005; moreover, the original definition of Ada 2005 was confused and appeared to require inconsistent results from the Image attribute, so implementations that allowed problematic cases are rare; the problematic cases are very rare; so it is expected that this change would only affect test programs. 

Wording Changes from Ada 2005

{AI05-0006-1} Correction: Defined the result subtype of an enumeration literal to close a minor language hole. 

Contents   Index   References   Search   Previous   Next 
Ada-Europe Ada 2005 and 2012 Editions sponsored in part by Ada-Europe