Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision e048ece8ba334125dcccebb214f58a23f0e29d8a)
+++ src/Parser/parser.yy	(revision a8853574dd2ba32ccb73b2d92c8ae8d2996bc657)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar  6 10:51:55 2024
-// Update Count     : 6588
+// Last Modified On : Mon Mar 11 18:30:03 2024
+// Update Count     : 6589
 //
 
@@ -1270,5 +1270,5 @@
 // parenthesis:
 //
-//   if x + y + z; => "if ( x + y ) + z" or "if ( x ) + y + z"
+//   if x + y + z; => if ( x ) + y + z or if ( x + y ) + z
 //
 //   switch O { }
@@ -1596,10 +1596,10 @@
 		{ SemanticError( yylloc, "syntax error, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; }
 
-	| comma_expression ';' TYPEDEFname					// CFA, array type
+	| comma_expression ';' enum_key						// CFA, enum type
 		{
 			SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr;
 			//$$ = forCtrl( new ExpressionNode( build_varref( $3 ) ), $1, nullptr, OperKinds::Range, nullptr, nullptr );
 		}
-	| comma_expression ';' downupdowneq TYPEDEFname		// CFA, array type
+	| comma_expression ';' downupdowneq enum_key		// CFA, enum type, reverse direction
 		{
 			if ( $3 == OperKinds::LEThan || $3 == OperKinds::GEThan ) {
@@ -1608,4 +1608,9 @@
 			SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr;
 		}
+	;
+
+enum_key:
+	TYPEDEFname
+	| ENUM TYPEDEFname
 	;
 
@@ -2240,5 +2245,5 @@
 		{ $$ = build_type_qualifier( ast::CV::Atomic ); }
 
-		// forall must be a CV qualifier because it can appear in places where SC qualifiers are disallowed.
+		// forall is a CV qualifier because it can appear in places where SC qualifiers are disallowed.
 		//
 		//   void foo( forall( T ) T (*)( T ) ); // forward declaration
@@ -2572,4 +2577,5 @@
 			// Create new generic declaration with same name as previous forward declaration, where the IDENTIFIER is
 			// switched to a TYPEGENname. Link any generic arguments from typegen_name to new generic declaration and
+			// delete newFromTypeGen.
 			if ( $3->kind == TypeData::SymbolicInst && ! $3->symbolic.isTypedef ) {
 				$$ = DeclarationNode::newFromTypeData( $3 )->addQualifiers( $2 );
@@ -4027,5 +4033,6 @@
 	abstract_parameter_ptr
 	| '&' MUTEX attribute_list_opt
-		{ $$ = DeclarationNode::newPointer( DeclarationNode::newFromTypeData( build_type_qualifier( ast::CV::Mutex ) ), OperKinds::AddressOf )->addQualifiers( $3 ); }
+		{ $$ = DeclarationNode::newPointer( DeclarationNode::newFromTypeData( build_type_qualifier( ast::CV::Mutex ) ),
+											OperKinds::AddressOf )->addQualifiers( $3 ); }
 	| abstract_parameter_array attribute_list_opt
 		{ $$ = $1->addQualifiers( $2 ); }
