Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision dfc13bb95282aa918307dacd460305d08f62afc6)
+++ src/AST/Pass.hpp	(revision e6b42e7a226ea0d0e4d4f46d30734a2ee84d96cb)
@@ -67,4 +67,8 @@
 // | WithSymbolTable       - provides symbol table functionality
 // | WithForallSubstitutor - maintains links between TypeInstType and TypeDecl under mutation
+//
+// Other Special Members:
+// | result                - Either a method that takes no parameters or a field. If a method (or
+//                           callable field) get_result calls it, otherwise the value is returned.
 //-------------------------------------------------------------------------------------------------
 template< typename core_t >
@@ -89,4 +93,12 @@
 	virtual ~Pass() = default;
 
+	/// Storage for the actual pass.
+	core_t core;
+
+	/// If the core defines a result, call it if possible, otherwise return it.
+	inline auto get_result() -> decltype( __pass::get_result( core, '0' ) ) {
+		return __pass::get_result( core, '0' );
+	}
+
 	/// Construct and run a pass on a translation unit.
 	template< typename... Args >
@@ -96,5 +108,14 @@
 	}
 
-	template< typename... Args >
+	/// Contruct and run a pass on a pointer to extract a value.
+	template< typename node_type, typename... Args >
+	static auto read( node_type const * node, Args&&... args ) {
+		Pass<core_t> visitor( std::forward<Args>( args )... );
+		node_type const * temp = node->accept( visitor );
+		assert( temp == node );
+		return visitor.get_result();
+	}
+
+	// Versions of the above for older compilers.
 	static void run( std::list< ptr<Decl> > & decls ) {
 		Pass<core_t> visitor;
@@ -102,6 +123,10 @@
 	}
 
-	/// Storage for the actual pass
-	core_t core;
+	static auto read( Node const * node ) {
+		Pass<core_t> visitor;
+		Node const * temp = node->accept( visitor );
+		assert( temp == node );
+		return visitor.get_result();
+	}
 
 	/// Visit function declarations
Index: src/AST/Pass.proto.hpp
===================================================================
--- src/AST/Pass.proto.hpp	(revision dfc13bb95282aa918307dacd460305d08f62afc6)
+++ src/AST/Pass.proto.hpp	(revision e6b42e7a226ea0d0e4d4f46d30734a2ee84d96cb)
@@ -421,4 +421,17 @@
 
 	} // namespace forall
+
+	template<typename core_t>
+	static inline auto get_result( core_t & core, char ) -> decltype( core.result() ) {
+		return core.result();
+	}
+
+	template<typename core_t>
+	static inline auto get_result( core_t & core, int ) -> decltype( core.result ) {
+		return core.result;
+	}
+
+	template<typename core_t>
+	static inline void get_result( core_t &, long ) {}
 } // namespace __pass
 } // namespace ast
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision dfc13bb95282aa918307dacd460305d08f62afc6)
+++ src/ResolvExpr/ConversionCost.cc	(revision e6b42e7a226ea0d0e4d4f46d30734a2ee84d96cb)
@@ -520,7 +520,5 @@
 		return convertToReferenceCost( src, refType, srcIsLvalue, symtab, env, localPtrsAssignable );
 	} else {
-		ast::Pass<ConversionCost_new> converter( dst, srcIsLvalue, symtab, env, localConversionCost );
-		src->accept( converter );
-		return converter.core.cost;
+		return ast::Pass<ConversionCost_new>::read( src, dst, srcIsLvalue, symtab, env, localConversionCost );
 	}
 }
@@ -563,7 +561,5 @@
 			}
 		} else {
-			ast::Pass<ConversionCost_new> converter( dst, srcIsLvalue, symtab, env, localConversionCost );
-			src->accept( converter );
-			return converter.core.cost;
+			return ast::Pass<ConversionCost_new>::read( src, dst, srcIsLvalue, symtab, env, localConversionCost );
 		}
 	} else {
Index: src/ResolvExpr/ConversionCost.h
===================================================================
--- src/ResolvExpr/ConversionCost.h	(revision dfc13bb95282aa918307dacd460305d08f62afc6)
+++ src/ResolvExpr/ConversionCost.h	(revision e6b42e7a226ea0d0e4d4f46d30734a2ee84d96cb)
@@ -88,4 +88,5 @@
 	static size_t traceId;
 	Cost cost;
+	Cost result() { return cost; }
 
 	ConversionCost_new( const ast::Type * dst, bool srcIsLvalue, const ast::SymbolTable & symtab,
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision dfc13bb95282aa918307dacd460305d08f62afc6)
+++ src/ResolvExpr/Resolver.cc	(revision e6b42e7a226ea0d0e4d4f46d30734a2ee84d96cb)
@@ -965,13 +965,13 @@
 		/// Finds deleted expressions in an expression tree
 		struct DeleteFinder_new final : public ast::WithShortCircuiting {
-			const ast::DeletedExpr * delExpr = nullptr;
+			const ast::DeletedExpr * result = nullptr;
 
 			void previsit( const ast::DeletedExpr * expr ) {
-				if ( delExpr ) { visit_children = false; }
-				else { delExpr = expr; }
+				if ( result ) { visit_children = false; }
+				else { result = expr; }
 			}
 
 			void previsit( const ast::Expr * ) {
-				if ( delExpr ) { visit_children = false; }
+				if ( result ) { visit_children = false; }
 			}
 		};
@@ -980,7 +980,5 @@
 	/// Check if this expression is or includes a deleted expression
 	const ast::DeletedExpr * findDeletedExpr( const ast::Expr * expr ) {
-		ast::Pass<DeleteFinder_new> finder;
-		expr->accept( finder );
-		return finder.core.delExpr;
+		return ast::Pass<DeleteFinder_new>::read( expr );
 	}
 
