Index: src/Parser/StatementNode.cpp
===================================================================
--- src/Parser/StatementNode.cpp	(revision 4117761a350b196fe0274bfd19c566b08a3969bc)
+++ src/Parser/StatementNode.cpp	(revision 6d2b3dcd9e518ea112923a8e83105ce7a4a77fd6)
@@ -216,5 +216,5 @@
 		return new ast::ForStmt( location,
 			std::move( astinit ),
-			range_over, forctl->kind == OperKinds::LThan,
+			range_over, forctl->kind == OperKinds::LEThan,
 			buildMoveSingle( stmt ),
 			buildMoveOptional( else_ )
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 4117761a350b196fe0274bfd19c566b08a3969bc)
+++ src/Parser/parser.yy	(revision 6d2b3dcd9e518ea112923a8e83105ce7a4a77fd6)
@@ -275,8 +275,9 @@
 } // forCtrl
 
-ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, __attribute__((unused)) OperKinds compop, ExpressionNode * range_over_expr ) {
+ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, OperKinds compop, ExpressionNode * range_over_expr, DeclarationNode * type ) {
+	assert( compop == OperKinds::LEThan || compop == OperKinds::GEThan );
 	if ( auto identifier = dynamic_cast<ast::NameExpr *>(index_expr->expr.get()) ) {
-		DeclarationNode * indexDecl = DeclarationNode::newName( new std::string(identifier->name) );
-		assert( range_over_expr );
+		DeclarationNode * indexDecl =
+			DeclarationNode::newName( new std::string(identifier->name) )->addType( type );
 		return new ForCtrl( new StatementNode( indexDecl ), range_over_expr, compop );
 	} else {
@@ -1605,7 +1606,7 @@
 		{ SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; }
 
-	| comma_expression ';' enum_key						// CFA, enum type
-		{
-			$$ = enumRangeCtrl( $1, OperKinds::LEThan, new ExpressionNode( new ast::TypeExpr( yylloc, $3->buildType() ) ) );
+	| comma_expression ';' type_type_specifier						// CFA, enum type
+		{
+			$$ = enumRangeCtrl( $1, OperKinds::LEThan, new ExpressionNode( new ast::TypeExpr( yylloc, $3->clone()->buildType() ) ), $3 );
 		}
 	| comma_expression ';' downupdowneq enum_key		// CFA, enum type, reverse direction
@@ -1615,5 +1616,5 @@
 				$3 = OperKinds::GEThan;
 			} // if
-			$$ = enumRangeCtrl( $1, $3, new ExpressionNode( new ast::TypeExpr( yylloc, $4->buildType() ) ) );
+			$$ = enumRangeCtrl( $1, $3, new ExpressionNode( new ast::TypeExpr( yylloc, $4->clone()->buildType() ) ), $4 );
 		}
 	;
@@ -1621,9 +1622,12 @@
 enum_key:
 	type_name
-		{ $$ = DeclarationNode::newEnum( $1->symbolic.name, nullptr, false, false ); }
+		{	typedefTable.makeTypedef( *$1->symbolic.name, "enum_type_nobody 1" );
+			$$ = DeclarationNode::newEnum( $1->symbolic.name, nullptr, false, false ); }
 	| ENUM identifier
-		{ $$ = DeclarationNode::newEnum( $2, nullptr, false, false ); }
+		{	typedefTable.makeTypedef( *$2, "enum_type_nobody 2" );
+			$$ = DeclarationNode::newEnum( $2, nullptr, false, false ); }
 	| ENUM type_name
-		{ $$ = DeclarationNode::newEnum( $2->symbolic.name, nullptr, false, false ); }
+		{	typedefTable.makeTypedef( *$2->symbolic.name, "enum_type_nobody 3" );
+			$$ = DeclarationNode::newEnum( $2->symbolic.name, nullptr, false, false ); }
 	;
 
