Index: src/ResolvExpr/ResolveTypeof.cc
===================================================================
--- src/ResolvExpr/ResolveTypeof.cc	(revision 93fe71415c43a87afa87a0b68520b22c26540814)
+++ src/ResolvExpr/ResolveTypeof.cc	(revision 9d79f93feba80fa8dad090444ec65f5916b13bd5)
@@ -18,4 +18,5 @@
 #include <cassert>               // for assert
 
+#include "Common/PassVisitor.h"  // for PassVisitor
 #include "Resolver.h"            // for resolveInVoidContext
 #include "SynTree/Expression.h"  // for Expression
@@ -41,8 +42,9 @@
 	}
 
-	class ResolveTypeof : public Mutator {
+	class ResolveTypeof : public WithShortCircuiting {
 	  public:
 		ResolveTypeof( const SymTab::Indexer &indexer ) : indexer( indexer ) {}
-		Type *mutate( TypeofType *typeofType );
+		void premutate( TypeofType *typeofType );
+		Type * postmutate( TypeofType *typeofType );
 
 	  private:
@@ -50,20 +52,24 @@
 	};
 
-	Type *resolveTypeof( Type *type, const SymTab::Indexer &indexer ) {
-		ResolveTypeof mutator( indexer );
+	Type * resolveTypeof( Type *type, const SymTab::Indexer &indexer ) {
+		PassVisitor<ResolveTypeof> mutator( indexer );
 		return type->acceptMutator( mutator );
 	}
 
-	Type *ResolveTypeof::mutate( TypeofType *typeofType ) {
+	void ResolveTypeof::premutate( TypeofType * ) {
+		visit_children = false;
+	}
+
+	Type * ResolveTypeof::postmutate( TypeofType *typeofType ) {
 #if 0
-		std::cout << "resolving typeof: ";
-		typeofType->print( std::cout );
-		std::cout << std::endl;
+		std::cerr << "resolving typeof: ";
+		typeofType->print( std::cerr );
+		std::cerr << std::endl;
 #endif
-		if ( typeofType->get_expr() ) {
-			Expression *newExpr = resolveInVoidContext( typeofType->get_expr(), indexer );
-			assert( newExpr->result && ! newExpr->get_result()->isVoid() );
-			Type *newType = newExpr->get_result();
-			newExpr->set_result( nullptr );
+		if ( typeofType->expr ) {
+			Expression * newExpr = resolveInVoidContext( typeofType->expr, indexer );
+			assert( newExpr->result && ! newExpr->result->isVoid() );
+			Type * newType = newExpr->result;
+			newExpr->result = nullptr;
 			delete typeofType;
 			delete newExpr;
