Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 9b1804455725323756434d8300b833edeac008a7)
+++ src/Common/utility.h	(revision 2bf9c37a121444757e12034a6a8371e9a5c1f075)
@@ -172,4 +172,19 @@
 auto filter(Args&&... args) -> decltype(std::copy_if(std::forward<Args>(args)...)) {
   return std::copy_if(std::forward<Args>(args)...);
+}
+
+template <typename E, typename UnaryPredicate, template< typename, typename...> class Container, typename... Args >
+void filter( Container< E *, Args... > & container, UnaryPredicate pred, bool doDelete ) {
+	auto i = begin( container );
+	while ( i != end( container ) ) {
+		auto it = next( i );
+		if ( pred( *i ) ) {
+			if ( doDelete ) {
+				delete *i;
+			} // if
+			container.erase( i );
+		} // if
+		i = it;
+	} // while
 }
 
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 9b1804455725323756434d8300b833edeac008a7)
+++ src/SymTab/Validate.cc	(revision 2bf9c37a121444757e12034a6a8371e9a5c1f075)
@@ -291,19 +291,4 @@
 
 	HoistStruct::HoistStruct() : inStruct( false ) {
-	}
-
-	void filter( std::list< Declaration * > &declList, bool (*pred)( Declaration * ), bool doDelete ) {
-		std::list< Declaration * >::iterator i = declList.begin();
-		while ( i != declList.end() ) {
-			std::list< Declaration * >::iterator next = i;
-			++next;
-			if ( pred( *i ) ) {
-				if ( doDelete ) {
-					delete *i;
-				} // if
-				declList.erase( i );
-			} // if
-			i = next;
-		} // while
 	}
 
@@ -797,15 +782,13 @@
 		CompoundStmt *ret = Mutator::mutate( compoundStmt );
 		scopeLevel -= 1;
-		std::list< Statement * >::iterator i = compoundStmt->get_kids().begin();
-		while ( i != compoundStmt->get_kids().end() ) {
-			std::list< Statement * >::iterator next = i+1;
-			if ( DeclStmt *declStmt = dynamic_cast< DeclStmt * >( *i ) ) {
+		// remove and delete decl stmts
+		filter( compoundStmt->kids, [](Statement * stmt) {
+			if ( DeclStmt *declStmt = dynamic_cast< DeclStmt * >( stmt ) ) {
 				if ( dynamic_cast< TypedefDecl * >( declStmt->get_decl() ) ) {
-					delete *i;
-					compoundStmt->get_kids().erase( i );
+					return true;
 				} // if
 			} // if
-			i = next;
-		} // while
+			return false;
+		}, true);
 		typedefNames.endScope();
 		return ret;
@@ -816,13 +799,5 @@
 	template<typename AggDecl>
 	AggDecl *EliminateTypedef::handleAggregate( AggDecl * aggDecl ) {
-		std::list<Declaration *>::iterator it = aggDecl->get_members().begin();
-		for ( ; it != aggDecl->get_members().end(); ) {
-			std::list< Declaration * >::iterator next = it+1;
-			if ( dynamic_cast< TypedefDecl * >( *it ) ) {
-				delete *it;
-				aggDecl->get_members().erase( it );
-			} // if
-			it = next;
-		}
+		filter( aggDecl->members, isTypedef, true );
 		return aggDecl;
 	}
