Index: src/ResolvExpr/FindOpenVars.cc
===================================================================
--- src/ResolvExpr/FindOpenVars.cc	(revision a180ded007fd6e5c40436d958be413982fb4f1ae)
+++ src/ResolvExpr/FindOpenVars.cc	(revision ce7ed2c471e181877b9a80ae0c960ec1bc581a8e)
@@ -19,18 +19,16 @@
 #include <map>                    // for map<>::mapped_type
 
+#include "Common/PassVisitor.h"
 #include "SynTree/Declaration.h"  // for TypeDecl, DeclarationWithType (ptr ...
 #include "SynTree/Type.h"         // for Type, Type::ForallList, ArrayType
-#include "SynTree/Visitor.h"      // for Visitor
 
 namespace ResolvExpr {
-	class FindOpenVars : public Visitor {
-	  public:
+	struct FindOpenVars : public WithGuards {
 		FindOpenVars( OpenVarSet &openVars, OpenVarSet &closedVars, AssertionSet &needAssertions, AssertionSet &haveAssertions, bool firstIsOpen );
 
-	  private:
-		virtual void visit(PointerType *pointerType);
-		virtual void visit(ArrayType *arrayType);
-		virtual void visit(FunctionType *functionType);
-		virtual void visit(TupleType *tupleType);
+		void previsit( PointerType * pointerType );
+		void previsit( ArrayType * arrayType );
+		void previsit( FunctionType * functionType );
+		void previsit( TupleType * tupleType );
 
 		void common_action( Type *type );
@@ -42,5 +40,5 @@
 
 	void findOpenVars( Type *type, OpenVarSet &openVars, OpenVarSet &closedVars, AssertionSet &needAssertions, AssertionSet &haveAssertions, bool firstIsOpen ) {
-		FindOpenVars finder( openVars, closedVars, needAssertions, haveAssertions, firstIsOpen );
+		PassVisitor<FindOpenVars> finder( openVars, closedVars, needAssertions, haveAssertions, firstIsOpen );
 		type->accept( finder );
 	}
@@ -70,32 +68,28 @@
 			} // for
 		} // if
-///   std::cout << "type is ";
-///   type->print( std::cout );
-///   std::cout << std::endl << "need is" << std::endl;
-///   printAssertionSet( needAssertions, std::cout );
-///   std::cout << std::endl << "have is" << std::endl;
-///   printAssertionSet( haveAssertions, std::cout );
+///   std::cerr << "type is ";
+///   type->print( std::cerr );
+///   std::cerr << std::endl << "need is" << std::endl;
+///   printAssertionSet( needAssertions, std::cerr );
+///   std::cerr << std::endl << "have is" << std::endl;
+///   printAssertionSet( haveAssertions, std::cerr );
 	}
 
-	void FindOpenVars::visit(PointerType *pointerType) {
+	void FindOpenVars::previsit(PointerType *pointerType) {
 		common_action( pointerType );
-		Visitor::visit( pointerType );
 	}
 
-	void FindOpenVars::visit(ArrayType *arrayType) {
+	void FindOpenVars::previsit(ArrayType *arrayType) {
 		common_action( arrayType );
-		Visitor::visit( arrayType );
 	}
 
-	void FindOpenVars::visit(FunctionType *functionType) {
+	void FindOpenVars::previsit(FunctionType *functionType) {
 		common_action( functionType );
 		nextIsOpen = ! nextIsOpen;
-		Visitor::visit( functionType );
-		nextIsOpen = ! nextIsOpen;
+		GuardAction( [this](){ nextIsOpen = ! nextIsOpen; } );
 	}
 
-	void FindOpenVars::visit(TupleType *tupleType) {
+	void FindOpenVars::previsit(TupleType *tupleType) {
 		common_action( tupleType );
-		Visitor::visit( tupleType );
 	}
 } // namespace ResolvExpr
