Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision c7ebbec0b2465582b53d918f1a2b2c24f69f7ef1)
+++ src/AST/Expr.cpp	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -307,4 +307,18 @@
 }
 
+// 
+
+// --- EnumPosExpr
+EnumPosExpr::EnumPosExpr( const CodeLocation & loc, const EnumInstType * ty)
+: Expr( loc, new BasicType{ BasicType::UnsignedInt }), type( ty ) {
+	assert( ty );
+}
+
+EnumPosExpr::EnumPosExpr( const CodeLocation & loc, const Expr * expr )
+: Expr( loc, new BasicType{ BasicType::UnsignedInt }), expr(expr) {
+	assert( expr );
+}
+
+
 // --- LogicalExpr
 
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision c7ebbec0b2465582b53d918f1a2b2c24f69f7ef1)
+++ src/AST/Expr.hpp	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -548,4 +548,17 @@
 };
 
+class EnumPosExpr final : public Expr {
+public:
+	ptr<EnumInstType> type;
+	ptr<Expr> expr;
+	
+	EnumPosExpr( const CodeLocation & loc, const EnumInstType * ty );
+	EnumPosExpr( const CodeLocation & loc, const Expr * expr );
+	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
+private:
+	EnumPosExpr * clone() const override { return new EnumPosExpr{ *this }; }
+	MUTATE_FRIEND
+};
+
 /// Variants of short-circuiting logical expression
 enum LogicalFlag { OrExpr, AndExpr };
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision c7ebbec0b2465582b53d918f1a2b2c24f69f7ef1)
+++ src/AST/Fwd.hpp	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -89,4 +89,5 @@
 class OffsetofExpr;
 class OffsetPackExpr;
+class EnumPosExpr;
 class LogicalExpr;
 class ConditionalExpr;
Index: src/AST/Node.cpp
===================================================================
--- src/AST/Node.cpp	(revision c7ebbec0b2465582b53d918f1a2b2c24f69f7ef1)
+++ src/AST/Node.cpp	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -232,4 +232,6 @@
 template class ast::ptr_base< ast::OffsetPackExpr, ast::Node::ref_type::weak >;
 template class ast::ptr_base< ast::OffsetPackExpr, ast::Node::ref_type::strong >;
+template class ast::ptr_base< ast::EnumPosExpr, ast::Node::ref_type::weak >;
+template class ast::ptr_base< ast::EnumPosExpr, ast::Node::ref_type::strong >;
 template class ast::ptr_base< ast::LogicalExpr, ast::Node::ref_type::weak >;
 template class ast::ptr_base< ast::LogicalExpr, ast::Node::ref_type::strong >;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision c7ebbec0b2465582b53d918f1a2b2c24f69f7ef1)
+++ src/AST/Pass.hpp	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -191,4 +191,5 @@
 	const ast::Expr *             visit( const ast::OffsetofExpr         * ) override final;
 	const ast::Expr *             visit( const ast::OffsetPackExpr       * ) override final;
+	const ast::Expr *             visit( const ast::EnumPosExpr          * ) override final;
 	const ast::Expr *             visit( const ast::LogicalExpr          * ) override final;
 	const ast::Expr *             visit( const ast::ConditionalExpr      * ) override final;
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision c7ebbec0b2465582b53d918f1a2b2c24f69f7ef1)
+++ src/AST/Pass.impl.hpp	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -1452,4 +1452,19 @@
 
 //--------------------------------------------------------------------------
+// EnumPosExpr
+template< typename core_t>
+const ast::Expr * ast::Pass< core_t >::visit( const ast::EnumPosExpr * node ) {
+	VISIT_START( node );
+
+	if ( __visit_children() ) {
+		guard_symtab guard { *this };
+		maybe_accept( node, &EnumPosExpr::type );
+		maybe_accept( node, &EnumPosExpr::expr );
+	}
+
+	VISIT_END( Expr, node );
+}
+
+//--------------------------------------------------------------------------
 // LogicalExpr
 template< typename core_t >
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision c7ebbec0b2465582b53d918f1a2b2c24f69f7ef1)
+++ src/AST/Print.cpp	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -1183,4 +1183,13 @@
 	}
 
+	virtual const ast::Expr * visit( const ast::EnumPosExpr * node ) override final {
+		os << "Enum Position Expression on: ";
+		++indent;
+		safe_print( node->type );
+		--indent;
+		postprint( node );
+		return node;
+	}
+
 	virtual const ast::Expr * visit( const ast::LogicalExpr * node ) override final {
 		os << "Short-circuited operation (" << (node->isAnd ? "and" : "or") << ") on: ";
Index: src/AST/Visitor.hpp
===================================================================
--- src/AST/Visitor.hpp	(revision c7ebbec0b2465582b53d918f1a2b2c24f69f7ef1)
+++ src/AST/Visitor.hpp	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -79,4 +79,5 @@
     virtual const ast::Expr *             visit( const ast::OffsetofExpr         * ) = 0;
     virtual const ast::Expr *             visit( const ast::OffsetPackExpr       * ) = 0;
+    virtual const ast::Expr *             visit( const ast::EnumPosExpr          * ) = 0;
     virtual const ast::Expr *             visit( const ast::LogicalExpr          * ) = 0;
     virtual const ast::Expr *             visit( const ast::ConditionalExpr      * ) = 0;
