Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ 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 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ 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 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ 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 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ 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 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ 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 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ 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 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ 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 85855b0f02c6f17de398969fbe7ab4810d76737a)
+++ 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;
