Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 35df5608a5c44c381d42285cef800bb03ab0ce61)
+++ src/Common/PassVisitor.h	(revision 65dc8635169a69696916835b7ef9060318cc4904)
@@ -18,5 +18,14 @@
 // Templated visitor type
 // To use declare a PassVisitor< YOUR VISITOR TYPE >
-// The visitor type should specify the previsit/postvisit for types that are desired.
+// The visitor type should specify the previsit/postvisit/premutate/postmutate for types that are desired.
+// Note: previsit/postvisit/premutate/postmutate must be **public** members
+//
+// Several additional features are available through inheritance
+// | WithTypeSubstitution - provides polymorphic TypeSubstitution * env for the current expression
+// | WithStmtsToAdd       - provides the ability to insert statements before or after the current statement by adding new statements into
+//                          stmtsToAddBefore or stmtsToAddAfter respectively.
+// | WithShortCircuiting  - provides the ability to skip visiting child nodes; set skip_children to true if pre{visit,mutate} to skip visiting children
+// | WithScopes           - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable
+//                          will automatically be restored to its previous value after the corresponding postvisit/postmutate teminates.
 //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 template< typename pass_type >
@@ -86,5 +95,4 @@
 	virtual void visit( ConstructorExpr * ctorExpr ) override final;
 	virtual void visit( CompoundLiteralExpr *compLitExpr ) override final;
-	virtual void visit( UntypedValofExpr *valofExpr ) override final;
 	virtual void visit( RangeExpr *rangeExpr ) override final;
 	virtual void visit( UntypedTupleExpr *tupleExpr ) override final;
@@ -172,5 +180,4 @@
 	virtual Expression* mutate( ConstructorExpr *ctorExpr ) override final;
 	virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ) override final;
-	virtual Expression* mutate( UntypedValofExpr *valofExpr ) override final;
 	virtual Expression* mutate( RangeExpr *rangeExpr ) override final;
 	virtual Expression* mutate( UntypedTupleExpr *tupleExpr ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 35df5608a5c44c381d42285cef800bb03ab0ce61)
+++ src/Common/PassVisitor.impl.h	(revision 65dc8635169a69696916835b7ef9060318cc4904)
@@ -6,8 +6,8 @@
 	call_previsit( node );                    \
 	if( visit_children() ) {                  \
-		reset_visit();                      \
 
 #define VISIT_END( node )                       \
 	}                                         \
+	reset_visit();                            \
 	call_postvisit( node );                   \
 
@@ -17,8 +17,8 @@
 	call_premutate( node );                   \
 	if( visit_children() ) {                  \
-		reset_visit();                      \
 
 #define MUTATE_END( type, node )                \
 	}                                         \
+	reset_visit();                            \
 	return call_postmutate< type * >( node ); \
 
@@ -159,45 +159,45 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ObjectDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( FunctionDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( StructDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( UnionDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( EnumDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TraitDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TypeDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TypedefDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( AsmDecl * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
@@ -250,5 +250,5 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( AsmStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
@@ -257,5 +257,5 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( IfStmt * node ) {
-	VISIT_START( node ); 
+	VISIT_START( node );
 
 	visitExpression( node->get_condition() );
@@ -268,5 +268,5 @@
 template< typename pass_type >
 Statement * PassVisitor< pass_type >::mutate( IfStmt * node ) {
-	MUTATE_START( node ); 
+	MUTATE_START( node );
 
 	node->set_condition( mutateExpression( node->get_condition() ) );
@@ -281,5 +281,5 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( WhileStmt * node ) {
-	VISIT_START( node ); 
+	VISIT_START( node );
 
 	visitExpression( node->get_condition() );
@@ -291,5 +291,5 @@
 template< typename pass_type >
 Statement * PassVisitor< pass_type >::mutate( WhileStmt * node ) {
-	MUTATE_START( node ); 
+	MUTATE_START( node );
 
 	node->set_condition( mutateExpression( node->get_condition() ) );
@@ -303,5 +303,5 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ForStmt * node ) {
-	VISIT_START( node ); 
+	VISIT_START( node );
 
 	acceptAll( node->get_initialization(), *this );
@@ -315,5 +315,5 @@
 template< typename pass_type >
 Statement * PassVisitor< pass_type >::mutate( ForStmt * node ) {
-	MUTATE_START( node ); 
+	MUTATE_START( node );
 
 	mutateAll( node->get_initialization(), *this );
@@ -329,5 +329,5 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
-	VISIT_START( node ); 
+	VISIT_START( node );
 
 	visitExpression( node->get_condition() );
@@ -339,9 +339,9 @@
 template< typename pass_type >
 Statement * PassVisitor< pass_type >::mutate( SwitchStmt * node ) {
-	MUTATE_START( node ); 
-	
+	MUTATE_START( node );
+
 	node->set_condition( mutateExpression( node->get_condition() ) );
 	mutateStatementList( node->get_statements() );
-	
+
 	MUTATE_END( Statement, node );
 }
@@ -351,9 +351,9 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( CaseStmt * node ) {
-	VISIT_START( node ); 
-	
+	VISIT_START( node );
+
 	visitExpression( node->get_condition() );
 	visitStatementList( node->get_statements() );
-	
+
 	VISIT_END( node );
 }
@@ -361,9 +361,9 @@
 template< typename pass_type >
 Statement * PassVisitor< pass_type >::mutate( CaseStmt * node ) {
-	MUTATE_START( node ); 
-	
+	MUTATE_START( node );
+
 	node->set_condition(  mutateExpression( node->get_condition() ) );
 	mutateStatementList( node->get_statements() );
-	
+
 	MUTATE_END( Statement, node );
 }
@@ -371,5 +371,5 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( BranchStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
@@ -425,5 +425,5 @@
 	node->set_block(  maybeMutate( node->get_block(), *this ) );
 	mutateAll( node->get_catchers(), *this );
-	
+
 	MUTATE_END( Statement, node );
 }
@@ -444,8 +444,8 @@
 Statement * PassVisitor< pass_type >::mutate( CatchStmt * node ) {
 	MUTATE_START( node );
-	
+
 	node->set_body(  mutateStatement( node->get_body() ) );
 	node->set_decl(  maybeMutate( node->get_decl(), *this ) );
-	
+
 	MUTATE_END( Statement, node );
 }
@@ -453,25 +453,25 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( FinallyStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( NullStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( DeclStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ImplicitCtorDtorStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ApplicationExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
@@ -502,140 +502,135 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( NameExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( CastExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( AddressExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( LabelAddressExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( UntypedMemberExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( MemberExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( VariableExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ConstantExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( SizeofExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( AlignofExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( UntypedOffsetofExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( OffsetofExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( OffsetPackExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( AttrExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( LogicalExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ConditionalExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( CommaExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TypeExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( AsmExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ImplicitCopyCtorExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ConstructorExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( CompoundLiteralExpr * node ) {
-	VISIT_BODY( node ); 
-}
-
-template< typename pass_type >
-void PassVisitor< pass_type >::visit( UntypedValofExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( RangeExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( UntypedTupleExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TupleExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TupleIndexExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TupleAssignExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
@@ -659,5 +654,5 @@
 Expression * PassVisitor< pass_type >::mutate( StmtExpr * node ) {
 	MUTATE_START( node );
-	
+
 	// don't want statements from outer CompoundStmts to be added to this StmtExpr
 	ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
@@ -672,85 +667,85 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( UniqueExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( VoidType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( BasicType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( PointerType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ArrayType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( FunctionType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( StructInstType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( UnionInstType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( EnumInstType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TraitInstType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TypeInstType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TupleType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TypeofType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( AttrType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( VarArgsType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ZeroType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( OneType * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
@@ -777,20 +772,20 @@
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ListInit * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ConstructorInit * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( Subrange * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( Constant * node ) {
-	VISIT_BODY( node ); 
+	VISIT_BODY( node );
 }
 
@@ -988,9 +983,4 @@
 
 template< typename pass_type >
-Expression * PassVisitor< pass_type >::mutate( UntypedValofExpr * node ) {
-	MUTATE_BODY( Expression, node );
-}
-
-template< typename pass_type >
 Expression * PassVisitor< pass_type >::mutate( RangeExpr * node ) {
 	MUTATE_BODY( Expression, node );
