Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision ca9d65e54b7ed187b75dfe016b8d4e2debd19fa4)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision bad9c8f532ad2770cb6f41ac472905fcee283497)
@@ -52,4 +52,6 @@
 #include "Common/Stats/Counter.h"
 
+#include "AST/Inspect.hpp"             // for getFunctionName
+
 #define PRINT( text ) if ( resolvep ) { text }
 
@@ -656,4 +658,5 @@
 		void postvisit( const ast::OffsetofExpr * offsetofExpr );
 		void postvisit( const ast::OffsetPackExpr * offsetPackExpr );
+		void postvisit( const ast::EnumPosExpr * enumPosExpr );
 		void postvisit( const ast::LogicalExpr * logicalExpr );
 		void postvisit( const ast::ConditionalExpr * conditionalExpr );
@@ -1471,4 +1474,28 @@
 	void Finder::postvisit( const ast::OffsetPackExpr * offsetPackExpr ) {
 		addCandidate( offsetPackExpr, tenv );
+	}
+
+	void Finder::postvisit( const ast::EnumPosExpr * enumPosExpr ) {
+		CandidateFinder finder( context, tenv );
+		finder.find( enumPosExpr->expr );
+		CandidateList winners = findMinCost( finder.candidates );
+		if ( winners.size() != 1 ) SemanticError( enumPosExpr->expr.get(), "Ambiguous expression in position. ");
+		CandidateRef & choice = winners.front();
+		auto refExpr = referenceToRvalueConversion( choice->expr, choice->cost );
+		auto refResult = (refExpr->result).as<ast::EnumInstType>();
+		if ( !refResult ) {
+			SemanticError( refExpr, "Position for Non enum type is not supported" );
+		}
+		// determineEnumPosConstant( enumPosExpr, refResult );
+
+		const ast::NameExpr * const nameExpr = enumPosExpr->expr.strict_as<ast::NameExpr>();
+		const ast::EnumDecl * base = refResult->base;
+		if ( !base ) {
+			SemanticError( enumPosExpr, "Cannot be reference to a defined enumeration type" );
+		}
+		auto it = std::find_if( std::begin( base->members ), std::end( base->members ), 
+			[nameExpr]( ast::ptr<ast::Decl> decl ) { return decl->name == nameExpr->name; } );
+		unsigned position = it - base->members.begin();
+		addCandidate( ast::ConstantExpr::from_int( enumPosExpr->location, position ), tenv );
 	}
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision ca9d65e54b7ed187b75dfe016b8d4e2debd19fa4)
+++ src/ResolvExpr/Resolver.cc	(revision bad9c8f532ad2770cb6f41ac472905fcee283497)
@@ -420,4 +420,6 @@
 		const ast::ConstructorInit * previsit( const ast::ConstructorInit * );
 
+		const ast::EnumPosExpr *	 previsit( const ast::EnumPosExpr * );
+
 		void resolveWithExprs(std::vector<ast::ptr<ast::Expr>> & exprs, std::list<ast::ptr<ast::Stmt>> & stmtsToAdd);
 
@@ -1239,4 +1241,9 @@
 	}
 
+	const ast::EnumPosExpr * Resolver::previsit( const ast::EnumPosExpr * enumPos ) {
+		visitor->maybe_accept( enumPos, &ast::EnumPosExpr::expr );
+		return enumPos;
+	}
+
 	// suppress error on autogen functions and mark invalid autogen as deleted.
 	bool Resolver::on_error(ast::ptr<ast::Decl> & decl) {
