Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision a4ca48cb2a2bd7a18b74f59046bc85b612b8c212)
+++ src/InitTweak/FixInit.cc	(revision 9a707e4e43b264eeb55851eda9a8efc6c7c78dd1)
@@ -238,7 +238,5 @@
 		};
 
-		class GenStructMemberCalls final : public SymTab::Indexer {
-		  public:
-			typedef Indexer Parent;
+		struct GenStructMemberCalls final : public WithGuards, public WithShortCircuiting, public WithIndexer {
 			/// generate default/copy ctor and dtor calls for user-defined struct ctor/dtors
 			/// for any member that is missing a corresponding ctor/dtor call.
@@ -246,10 +244,9 @@
 			static void generate( std::list< Declaration * > & translationUnit );
 
-			using Parent::visit;
-
-			virtual void visit( FunctionDecl * funcDecl ) override;
-
-			virtual void visit( MemberExpr * memberExpr ) override;
-			virtual void visit( ApplicationExpr * appExpr ) override;
+			void previsit( FunctionDecl * funcDecl );
+			void postvisit( FunctionDecl * funcDecl );
+
+			void previsit( MemberExpr * memberExpr );
+			void previsit( ApplicationExpr * appExpr );
 
 			SemanticError errors;
@@ -360,5 +357,5 @@
 
 		void GenStructMemberCalls::generate( std::list< Declaration * > & translationUnit ) {
-			GenStructMemberCalls warner;
+			PassVisitor<GenStructMemberCalls> warner;
 			acceptAll( translationUnit, warner );
 		}
@@ -978,11 +975,11 @@
 		}
 
-		void GenStructMemberCalls::visit( FunctionDecl * funcDecl ) {
-			ValueGuard< FunctionDecl * > oldFunction( funcDecl );
-			ValueGuard< std::set< DeclarationWithType * > > oldUnhandled( unhandled );
-			ValueGuard< std::map< DeclarationWithType *, CodeLocation > > oldUsedUninit( usedUninit );
-			ValueGuard< ObjectDecl * > oldThisParam( thisParam );
-			ValueGuard< bool > oldIsCtor( isCtor );
-			ValueGuard< StructDecl * > oldStructDecl( structDecl );
+		void GenStructMemberCalls::previsit( FunctionDecl * funcDecl ) {
+			GuardValue( funcDecl );
+			GuardValue( unhandled );
+			GuardValue( usedUninit );
+			GuardValue( thisParam );
+			GuardValue( isCtor );
+			GuardValue( structDecl );
 			errors = SemanticError();  // clear previous errors
 
@@ -1010,6 +1007,20 @@
 				}
 			}
-			Parent::visit( function );
-
+		}
+
+		void addIds( SymTab::Indexer & indexer, const std::list< DeclarationWithType * > & decls ) {
+			for ( auto d : decls ) {
+				indexer.addId( d );
+			}
+		}
+
+		void addTypes( SymTab::Indexer & indexer, const std::list< TypeDecl * > & tds ) {
+			for ( auto td : tds ) {
+				indexer.addType( td );
+				addIds( indexer, td->assertions );
+			}
+		}
+
+		void GenStructMemberCalls::postvisit( FunctionDecl * funcDecl ) {
 			// remove the unhandled objects from usedUninit, because a call is inserted
 			// to handle them - only objects that are later constructed are used uninitialized.
@@ -1032,6 +1043,8 @@
 			if ( ! unhandled.empty() ) {
 				// need to explicitly re-add function parameters to the indexer in order to resolve copy constructors
-				enterScope();
-				maybeAccept( function->get_functionType(), *this );
+				auto guard = makeFuncGuard( [this]() { indexer.enterScope(); }, [this]() { indexer.leaveScope(); } );
+				addTypes( indexer, function->type->forall );
+				addIds( indexer, function->type->returnVals );
+				addIds( indexer, function->type->parameters );
 
 				// need to iterate through members in reverse in order for
@@ -1063,5 +1076,5 @@
 						Statement * callStmt = stmt.front();
 
-						MutatingResolver resolver( *this );
+						MutatingResolver resolver( indexer );
 						try {
 							callStmt->acceptMutator( resolver );
@@ -1077,5 +1090,4 @@
 					}
 				}
-				leaveScope();
 			}
 			if (! errors.isEmpty()) {
@@ -1107,6 +1119,9 @@
 		}
 
-		void GenStructMemberCalls::visit( ApplicationExpr * appExpr ) {
-			if ( ! checkWarnings( function ) ) return;
+		void GenStructMemberCalls::previsit( ApplicationExpr * appExpr ) {
+			if ( ! checkWarnings( function ) ) {
+				visit_children = false;
+				return;
+			}
 
 			std::string fname = getFunctionName( appExpr );
@@ -1127,10 +1142,11 @@
 				}
 			}
-			Parent::visit( appExpr );
-		}
-
-		void GenStructMemberCalls::visit( MemberExpr * memberExpr ) {
-			if ( ! checkWarnings( function ) ) return;
-			if ( ! isCtor ) return;
+		}
+
+		void GenStructMemberCalls::previsit( MemberExpr * memberExpr ) {
+			if ( ! checkWarnings( function ) || ! isCtor ) {
+				visit_children = false;
+				return;
+			}
 
 			if ( isThisExpression( memberExpr->get_aggregate(), thisParam ) ) {
@@ -1140,5 +1156,4 @@
 				}
 			}
-			Parent::visit( memberExpr );
 		}
 
