Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision 17fa94fc6137fe38192c7283b80f37fec136dd24)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 98a5ee7757aa2f110b4759d6fd9b56048dd79e8e)
@@ -2150,37 +2150,32 @@
 }
 
-const ast::Expr * CandidateFinder::makeEnumOffsetCast( const ast::EnumInstType * src, 
-	const ast::EnumInstType * dst, const ast::Expr * expr, Cost minCost ) {
+const ast::Expr * CandidateFinder::makeEnumOffsetCast( const ast::EnumInstType * src,
+		const ast::EnumInstType * dst, const ast::Expr * expr, Cost minCost ) {
 	auto srcDecl = src->base;
 	auto dstDecl = dst->base;
 
-	if (srcDecl->name == dstDecl->name) return expr;
-
-	for (auto& dstChild: dstDecl->inlinedDecl) {
+	if ( srcDecl->name == dstDecl->name ) return expr;
+
+	for ( auto& dstChild : dstDecl->inlinedDecl ) {
 		Cost c = castCost(src, dstChild, false, context.symtab, env);
-		ast::CastExpr * castToDst;
-		if (c<minCost) {
-			unsigned offset = findChildOffset( dstDecl, dstChild.get()->base );
-			if (offset > 0) {
-				auto untyped = ast::UntypedExpr::createCall(
-					expr->location,
-					"?+?",
-					{ new ast::CastExpr( expr->location,
-						expr,
-						new ast::BasicType(ast::BasicKind::SignedInt),
-						ast::GeneratedFlag::ExplicitCast ),
-						ast::ConstantExpr::from_int(expr->location, offset)} );
-				CandidateFinder finder(context, env);
-				finder.find( untyped );
-				CandidateList winners = findMinCost( finder.candidates );
-				CandidateRef & choice = winners.front();
-				choice->expr = new ast::CastExpr(expr->location, choice->expr, dstChild, ast::GeneratedFlag::ExplicitCast);
-				auto destExpr = makeEnumOffsetCast( src, dstChild, choice->expr, minCost );
-				if ( !destExpr ) continue;
-				castToDst = new ast::CastExpr( destExpr, dst );
-			} else {
-				castToDst = new ast::CastExpr( expr, dst );
-			}
-			return castToDst;
+		if ( minCost <= c ) continue;
+		unsigned offset = findChildOffset( dstDecl, dstChild.get()->base );
+		if ( offset <= 0 ) return new ast::CastExpr( expr, dst );
+
+		auto untyped = ast::UntypedExpr::createCall(
+			expr->location,
+			"?+?",
+			{ new ast::CastExpr( expr->location,
+				expr,
+				new ast::BasicType( ast::BasicKind::SignedInt ),
+				ast::GeneratedFlag::ExplicitCast ),
+				ast::ConstantExpr::from_int( expr->location, offset ) } );
+		CandidateFinder finder(context, env);
+		finder.find( untyped );
+		CandidateList winners = findMinCost( finder.candidates );
+		CandidateRef & choice = winners.front();
+		choice->expr = new ast::CastExpr( expr->location, choice->expr, dstChild, ast::GeneratedFlag::ExplicitCast );
+		if ( auto destExpr = makeEnumOffsetCast( src, dstChild, choice->expr, minCost ) ) {
+			return new ast::CastExpr( destExpr, dst );
 		}
 	}
Index: src/ResolvExpr/ConversionCost.cpp
===================================================================
--- src/ResolvExpr/ConversionCost.cpp	(revision 17fa94fc6137fe38192c7283b80f37fec136dd24)
+++ src/ResolvExpr/ConversionCost.cpp	(revision 98a5ee7757aa2f110b4759d6fd9b56048dd79e8e)
@@ -518,9 +518,9 @@
 	auto srcDecl = src->base;
 	auto dstDecl = dst->base;
-	if (srcDecl->name == dstDecl->name) return Cost::safe;
+	if ( srcDecl->name == dstDecl->name ) return Cost::safe;
 	Cost minCost = Cost::infinity;
-	for (auto child: dstDecl->inlinedDecl) {
-		Cost c = enumCastCost(src, child, symtab, env) + Cost::safe;
-		if (c<minCost) minCost = c;
+	for ( auto child : dstDecl->inlinedDecl ) {
+		Cost c = enumCastCost( src, child, symtab, env ) + Cost::safe;
+		if ( c < minCost ) minCost = c;
 	}
 	return minCost;
Index: src/ResolvExpr/Cost.hpp
===================================================================
--- src/ResolvExpr/Cost.hpp	(revision 17fa94fc6137fe38192c7283b80f37fec136dd24)
+++ src/ResolvExpr/Cost.hpp	(revision 98a5ee7757aa2f110b4759d6fd9b56048dd79e8e)
@@ -169,4 +169,8 @@
 }
 
+inline bool operator<=( const Cost lhs, const Cost rhs ) {
+	return !(rhs < lhs);
+}
+
 inline Cost operator+( const Cost lhs, const Cost rhs ) {
 	if ( lhs.all == Cost::infinity || rhs.all == Cost::infinity ) return Cost{ Cost::infinity };
