Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/AST/Expr.cpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -282,4 +282,9 @@
 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), expr( nullptr ), type( t ) {}
 
+// --- CountExpr
+
+CountExpr::CountExpr( const CodeLocation & loc, const Type * t )
+: Expr( loc, new BasicType( BasicKind::LongUnsignedInt) ), type( t ) {}
+
 // --- AlignofExpr
 
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/AST/Expr.hpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -494,4 +494,16 @@
 };
 
+class CountExpr final : public Expr {
+public:
+	ptr<Type> type;
+
+	CountExpr( const CodeLocation & loc, const Type * t );
+
+	const Expr * accept( Visitor & v )const override { return v.visit( this ); }
+private:
+	CountExpr * clone() const override { return new CountExpr( *this ); }
+	MUTATE_FRIEND
+};
+
 /// alignof expression, e.g. `alignof(int)`, `alignof 3+4`
 class AlignofExpr final : public Expr {
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/AST/Fwd.hpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -85,4 +85,5 @@
 class ConstantExpr;
 class SizeofExpr;
+class CountExpr;
 class AlignofExpr;
 class UntypedOffsetofExpr;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/AST/Pass.hpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -172,4 +172,5 @@
 	const ast::Expr *             visit( const ast::ConstantExpr         * ) override final;
 	const ast::Expr *             visit( const ast::SizeofExpr           * ) override final;
+	const ast::Expr *             visit( const ast::CountExpr            * ) override final;
 	const ast::Expr *             visit( const ast::AlignofExpr          * ) override final;
 	const ast::Expr *             visit( const ast::UntypedOffsetofExpr  * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/AST/Pass.impl.hpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -802,4 +802,5 @@
 		maybe_accept_top( node, &ForStmt::cond  );
 		maybe_accept_top( node, &ForStmt::inc   );
+		maybe_accept_top( node, &ForStmt::range_over );
 		maybe_accept_as_compound( node, &ForStmt::body  );
 	}
@@ -1323,4 +1324,19 @@
 	}
 
+	VISIT_END( Expr, node );
+}
+
+//--------------------------------------------------------------------------
+// CountExpr
+template< typename core_t >
+const ast::Expr * ast::Pass< core_t >::visit( const ast::CountExpr * node ) {
+	VISIT_START( node );
+	if ( __visit_children() ) {
+		{
+			guard_symtab guard { *this };
+			maybe_accept( node, &CountExpr::result );
+		}
+		maybe_accept( node, &CountExpr::type );
+	}
 	VISIT_END( Expr, node );
 }
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/AST/Print.cpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -1143,4 +1143,13 @@
 	}
 
+	virtual const ast::Expr * visit( const ast::CountExpr * node ) override final {
+		os << "Count Expression on: ";
+		++indent;
+		node->type->accept( *this );
+		--indent;
+		postprint( node );
+		return node;
+	}
+
 	virtual const ast::Expr * visit( const ast::AlignofExpr * node ) override final {
 		os << "Alignof Expression on: ";
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/AST/Stmt.hpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -237,4 +237,5 @@
 	ptr<Expr> cond;
 	ptr<Expr> inc;
+	ptr<Expr> range_over;
 	ptr<Stmt> body;
 	ptr<Stmt> else_;
@@ -242,9 +243,15 @@
 	ForStmt( const CodeLocation & loc, const std::vector<ptr<Stmt>> && inits, const Expr * cond,
 			 const Expr * inc, const Stmt * body, const std::vector<Label> && label = {} )
-		: Stmt(loc, std::move(label)), inits(std::move(inits)), cond(cond), inc(inc), body(body), else_(nullptr) {}
+		: Stmt(loc, std::move(label)), inits(std::move(inits)), cond(cond), inc(inc),
+			range_over(nullptr), body(body), else_(nullptr) {}
 
 	ForStmt( const CodeLocation & loc, const std::vector<ptr<Stmt>> && inits, const Expr * cond,
 			 const Expr * inc, const Stmt * body, const Stmt * else_, const std::vector<Label> && labels = {} )
-		: Stmt(loc, std::move(labels)), inits(std::move(inits)), cond(cond), inc(inc), body(body), else_(else_) {}
+		: Stmt(loc, std::move(labels)), inits(std::move(inits)), cond(cond), inc(inc),
+			range_over(nullptr), body(body), else_(else_) {}
+
+	ForStmt( const CodeLocation & loc, const std::vector<ptr<Stmt>> && inits, const Expr * range_over, 
+			 const Stmt * body, const Stmt * else_ )
+		: Stmt(loc, std::move(labels)), inits(std::move(inits)), range_over(range_over), body(body), else_(else_) {}
 
 	const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/AST/Visitor.hpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -75,4 +75,5 @@
     virtual const ast::Expr *             visit( const ast::ConstantExpr         * ) = 0;
     virtual const ast::Expr *             visit( const ast::SizeofExpr           * ) = 0;
+    virtual const ast::Expr *             visit( const ast::CountExpr            * ) = 0;
     virtual const ast::Expr *             visit( const ast::AlignofExpr          * ) = 0;
     virtual const ast::Expr *             visit( const ast::UntypedOffsetofExpr  * ) = 0;
Index: src/Common/CodeLocationTools.cpp
===================================================================
--- src/Common/CodeLocationTools.cpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/Common/CodeLocationTools.cpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -153,4 +153,5 @@
     macro(ConstantExpr, Expr) \
     macro(SizeofExpr, Expr) \
+    macro(CountExpr, Expr ) \
     macro(AlignofExpr, Expr) \
     macro(UntypedOffsetofExpr, Expr) \
Index: src/ControlStruct/module.mk
===================================================================
--- src/ControlStruct/module.mk	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/ControlStruct/module.mk	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -27,4 +27,6 @@
 	ControlStruct/LabelGenerator.hpp \
 	ControlStruct/MultiLevelExit.cpp \
-	ControlStruct/MultiLevelExit.hpp
+	ControlStruct/MultiLevelExit.hpp \
+	ControlStruct/TranslateEnumRange.cpp \
+	ControlStruct/TranslateEnumRange.hpp
 
Index: src/Parser/StatementNode.cpp
===================================================================
--- src/Parser/StatementNode.cpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/Parser/StatementNode.cpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -211,4 +211,15 @@
 	buildMoveList( forctl->init, astinit );
 
+	if ( forctl->range_over ) {
+		ast::Expr * range_over = maybeMoveBuild( forctl->range_over );
+		delete forctl;
+		return new ast::ForStmt( location,
+			std::move( astinit ),
+			range_over,
+			buildMoveSingle( stmt ),
+			buildMoveOptional( else_ )
+		);
+	}
+
 	ast::Expr * astcond = nullptr;						// maybe empty
 	astcond = maybeMoveBuild( forctl->condition );
Index: src/Parser/StatementNode.hpp
===================================================================
--- src/Parser/StatementNode.hpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/Parser/StatementNode.hpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -63,9 +63,12 @@
 struct ForCtrl {
 	ForCtrl( StatementNode * stmt, ExpressionNode * condition, ExpressionNode * change ) :
-		init( stmt ), condition( condition ), change( change ) {}
+		init( stmt ), condition( condition ), change( change ), range_over( nullptr ) {}
+	ForCtrl( StatementNode * decl, ExpressionNode * _range_over) :
+		init( decl ), condition( nullptr ), change( nullptr ),  range_over( _range_over ) {}
 
 	StatementNode * init;
 	ExpressionNode * condition;
 	ExpressionNode * change;
+	ExpressionNode * range_over;
 };
 
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/Parser/lex.ll	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -321,4 +321,5 @@
 __signed__		{ KEYWORD_RETURN(SIGNED); }				// GCC
 sizeof			{ KEYWORD_RETURN(SIZEOF); }
+__count_e__		{ KEYWORD_RETURN(COUNT); }				// GCC
 static			{ KEYWORD_RETURN(STATIC); }
 _Static_assert	{ KEYWORD_RETURN(STATICASSERT); }		// C11
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/Parser/parser.yy	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -284,4 +284,26 @@
 } // forCtrl
 
+ForCtrl * enumRangeCtrl( ExpressionNode * index_expr, ExpressionNode * range_over_expr ) {
+	if ( auto identifier = dynamic_cast<ast::NameExpr *>(index_expr->expr.get()) ) {
+		DeclarationNode * indexDecl =
+			DeclarationNode::newName( new std::string(identifier->name) );
+		assert( range_over_expr );
+		auto node = new StatementNode( indexDecl ); // <- this cause this error
+		return new ForCtrl( node, range_over_expr );
+	} else if (auto commaExpr = dynamic_cast<ast::CommaExpr *>( index_expr->expr.get() )) {
+		if ( auto identifier = commaExpr->arg1.as<ast::NameExpr>() ) {
+			assert( range_over_expr );
+			DeclarationNode * indexDecl = distAttr(
+				DeclarationNode::newTypeof( range_over_expr, true ),
+				DeclarationNode::newName( new std::string( identifier->name) ) );
+			return new ForCtrl( new StatementNode( indexDecl ), range_over_expr );
+		} else {
+			SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed." ); return nullptr;
+		} // if
+	} else {
+		SemanticError( yylloc, "syntax error, loop-index name missing. Expression disallowed." ); return nullptr;
+	} // if
+} // enumRangeCtrl
+
 static void IdentifierBeforeIdentifier( string & identifier1, string & identifier2, const char * kind ) {
 	SemanticError( yylloc, "syntax error, adjacent identifiers \"%s\" and \"%s\" are not meaningful in an %s.\n"
@@ -368,5 +390,5 @@
 %token DECIMAL32 DECIMAL64 DECIMAL128					// GCC
 %token ZERO_T ONE_T										// CFA
-%token SIZEOF TYPEOF VA_LIST VA_ARG AUTO_TYPE			// GCC
+%token SIZEOF TYPEOF VA_LIST VA_ARG AUTO_TYPE COUNT		// GCC
 %token OFFSETOF BASETYPEOF TYPEID						// CFA
 %token ENUM STRUCT UNION
@@ -968,4 +990,9 @@
 			// $$ = new ExpressionNode( build_offsetOf( $3, build_varref( $5 ) ) );
 		}
+	| COUNT '(' type ')'
+		{
+			// SemanticError( yylloc, "Count is currently unimplemented. "); $$ = nullptr;
+			$$ = new ExpressionNode( new ast::CountExpr( yylloc, maybeMoveBuildType( $3 ) ) );
+		}
 	;
 
@@ -1599,10 +1626,9 @@
 		{ SemanticError( yylloc, "syntax error, missing low/high value for up/down-to range so index is uninitialized." ); $$ = nullptr; }
 
-	| 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 enum_key		// CFA, enum type, reverse direction
+	| comma_expression ';' enum_type					// CFA, enum type
+		{
+			$$ = enumRangeCtrl( $1, new ExpressionNode( new ast::TypeExpr(yylloc, $3->buildType() ) ) );
+		}
+	| comma_expression ';' downupdowneq enum_type		// CFA, enum type, reverse direction
 		{
 			if ( $3 == OperKinds::LEThan || $3 == OperKinds::GEThan ) {
@@ -1611,9 +1637,4 @@
 			SemanticError( yylloc, "Type iterator is currently unimplemented." ); $$ = nullptr;
 		}
-	;
-
-enum_key:
-	TYPEDEFname
-	| ENUM identifier_or_type_name
 	;
 
Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -696,4 +696,5 @@
 		void postvisit( const ast::UntypedInitExpr * initExpr );
 		void postvisit( const ast::QualifiedNameExpr * qualifiedExpr );
+		void postvisit( const ast::CountExpr * countExpr );
 
 		const ast::Expr * makeEnumOffsetCast( const ast::EnumInstType * src, 
@@ -1527,4 +1528,13 @@
 			addCandidate( *choice, new ast::SizeofExpr{ sizeofExpr->location, choice->expr } );
 		}
+	}
+
+	void Finder::postvisit( const ast::CountExpr * countExpr ) {
+		assert( countExpr->type );
+		auto enumInst = countExpr->type.as<ast::EnumInstType>();
+		if ( !enumInst ) {
+			SemanticError( countExpr, "Count Expression only supports Enum Type as operand: ");
+		}
+		addCandidate( ast::ConstantExpr::from_ulong(countExpr->location, enumInst->base->members.size()), tenv );
 	}
 
Index: src/main.cpp
===================================================================
--- src/main.cpp	(revision 12f115660af199443846e0eaf25044dc38abc565)
+++ src/main.cpp	(revision 525f7ad65aaee3be785c86c188b191a2450ac8cc)
@@ -53,4 +53,5 @@
 #include "ControlStruct/FixLabels.hpp"      // for fixLabels
 #include "ControlStruct/HoistControlDecls.hpp" //  hoistControlDecls
+#include "ControlStruct/TrasnlateEnumRange.hpp" // translateEnumRange
 #include "GenPoly/Box.hpp"                  // for box
 #include "GenPoly/InstantiateGeneric.hpp"   // for instantiateGeneric
@@ -323,4 +324,5 @@
 		PASS( "Hoist Struct", Validate::hoistStruct, transUnit );
 		PASS( "Validate Generic Parameters", Validate::fillGenericParameters, transUnit );
+		PASS( "Translate Enum Range Expression", ControlStruct::translateEnumRange, transUnit );
 		PASS( "Translate Dimensions", Validate::translateDimensionParameters, transUnit );
 		// Need to happen before fixing returns because implementEnumFunc has ReturnStmt
