Index: src/CodeGen/Generate.cc
===================================================================
--- src/CodeGen/Generate.cc	(revision b3c796366b707de21c95ee20102dd82d1d0d0c87)
+++ src/CodeGen/Generate.cc	(revision acdfb4519df953ddab9076276b4f00ec543dfe2f)
@@ -33,5 +33,6 @@
 		/// Removes misc. nodes that should not exist in CodeGen
 		struct TreeCleaner {
-			void previsit( CompoundStmt * stmt );
+			void premutate( CompoundStmt * stmt );
+			Statement * postmutate( ImplicitCtorDtorStmt * stmt );
 
 			static bool shouldClean( Declaration * );
@@ -41,5 +42,5 @@
 			PassVisitor<TreeCleaner> cleaner;
 			filter( translationUnit, [](Declaration * decl) { return TreeCleaner::shouldClean(decl); }, false );
-			acceptAll( translationUnit, cleaner );
+			mutateAll( translationUnit, cleaner );
 		} // cleanTree
 	} // namespace
@@ -65,5 +66,5 @@
 			os << CodeGen::genPrettyType( type, "" );
 		} else {
-			CodeGen::CodeGenerator cgv( os, true, false, false );
+			PassVisitor<CodeGenerator> cgv( os, true, false, false );
 			node->accept( cgv );
 		}
@@ -72,5 +73,5 @@
 
 	namespace {
-		void TreeCleaner::previsit( CompoundStmt * cstmt ) {
+		void TreeCleaner::premutate( CompoundStmt * cstmt ) {
 			filter( cstmt->kids, [](Statement * stmt) {
 				if ( DeclStmt * declStmt = dynamic_cast< DeclStmt * >( stmt ) ) {
@@ -79,4 +80,11 @@
 				return false;
 			}, false );
+		}
+
+		Statement * TreeCleaner::postmutate( ImplicitCtorDtorStmt * stmt ) {
+			Statement * callStmt = nullptr;
+			std::swap( stmt->callStmt, callStmt );
+			delete stmt;
+			return callStmt;
 		}
 
