\chapter{Background}


\section{C-Style Enum}

The C-Style enumeration has the following syntax and semantics.
\begin{cfa}
enum Weekday { Monday, Tuesday, Wednesday, Thursday@ = 10@, Friday, Saturday, Sunday };
\end{cfa}
Enumerators without an explicitly designated constant value are \Newterm{auto-initialized} by the compiler: from left to right, starting at zero or the next explicitly initialized constant, incrementing by @1@.
For example, @Monday@ to @Wednesday@ are implicitly assigned with constants @0@--@2@, @Thursday@ is explicitly set to constant @10@, and @Friday@ to @Sunday@ are implicitly assigned with constants @11@--@13@.
Initialization may occur in any order.
\begin{cfa}
enum Weekday { Thursday@ = 10@, Friday, Saturday, Sunday, Monday@ = 0@, Tuesday, Wednesday };
\end{cfa}
Note, the comma in the enumerator list can be a terminator or a separator, allowing the list to end with a dangling comma.
\begin{cfa}
enum Weekday {
	Thursday = 10, Friday, Saturday, Sunday,
	Monday = 0, Tuesday, Wednesday@,@ // terminating comma
};
\end{cfa}
This feature allow enumerator lines to be interchanged without moving a comma.\footnote{
A terminating comma appears in other C syntax, \eg the initializer list.}
Finally, C enumerators are \Newterm{unscoped}, \ie enumerators declared inside of an @enum@ are visible (projected) into the enclosing scope of the @enum@ type.

In theory, a C enumeration \emph{variable} is an implementation-defined integral type large enough to hold all enumerated values.
In practice, since integral constants are used, which have type @int@ (unless qualified with a size suffix), C uses @int@ as the underlying type for enumeration variables.
Finally, there is an implicit bidirectional conversion between an enumeration and its integral type.
\begin{cfa}
{
	enum Weekday { /* as above */ };	$\C{// enumerators implicitly projected into local scope}$
	Weekday weekday = Monday;			$\C{// weekday == 0}$
	weekday = Friday;					$\C{// weekday == 11}$
	int i = Sunday;						$\C{// implicit conversion to int, i == 13}$
	weekday = 10000;					$\C{// UNDEFINED! implicit conversion to Weekday}$
}
int j = Wednesday;						$\C{// ERROR! Wednesday is not declared in this scope}$
\end{cfa}
The implicit conversion from @int@ to an enumeration type is an unnecessary source of error.

It is common for C programmers to ``believe'' there are 3 equivalent forms of constant enumeration.
\begin{cfa}
#define Monday 0
static const int Monday = 0;
enum { Monday };
\end{cfa}
For @#define@, the programmer has to play compiler and explicitly manage the enumeration values;
furthermore, these are independent constants outside of any language type mechanism.
The same explicit management is true for @const@ declarations, and the @const@ variable cannot appear in constant-expression locations, like @case@ labels, array dimensions,\footnote{
C allows variable-length array-declarations (VLA), so this case does work, but it fails in \CC, which does not support VLAs, unless it is \lstinline{g++}.} and immediate operands of assembler instructions.
Only the @enum@ form is managed by the compiler, is part of the language type-system, and works in all C constant-expression locations.
