Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 96a10cdd34eee83c07ea9c33d7699a3521eb03d9)
+++ src/InitTweak/FixInit.cc	(revision 9a8dfcc22a0cb55b65ad97ee728cfe06c2b62751)
@@ -50,5 +50,5 @@
 		const std::list<Expression*> noDesignators;
 
-		class InsertImplicitCalls : public GenPoly::PolyMutator {
+		class InsertImplicitCalls final : public GenPoly::PolyMutator {
 		public:
 			/// wrap function application expressions as ImplicitCopyCtorExpr nodes so that it is easy to identify which
@@ -56,8 +56,9 @@
 			static void insert( std::list< Declaration * > & translationUnit );
 
-			virtual Expression * mutate( ApplicationExpr * appExpr );
-		};
-
-		class ResolveCopyCtors : public SymTab::Indexer {
+			using GenPoly::PolyMutator::mutate;
+			virtual Expression * mutate( ApplicationExpr * appExpr ) override;
+		};
+
+		class ResolveCopyCtors final : public SymTab::Indexer {
 		public:
 			/// generate temporary ObjectDecls for each argument and return value of each ImplicitCopyCtorExpr,
@@ -66,5 +67,6 @@
 			static void resolveImplicitCalls( std::list< Declaration * > & translationUnit );
 
-			virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr );
+			using SymTab::Indexer::visit;
+			virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override;
 
 			/// create and resolve ctor/dtor expression: fname(var, [cpArg])
@@ -82,6 +84,6 @@
 			using Parent::visit;
 			typedef std::set< ObjectDecl * > ObjectSet;
-			virtual void visit( CompoundStmt *compoundStmt );
-			virtual void visit( DeclStmt *stmt );
+			virtual void visit( CompoundStmt *compoundStmt ) override;
+			virtual void visit( DeclStmt *stmt ) override;
 		  protected:
 			ObjectSet curVars;
@@ -103,5 +105,5 @@
 		}
 
-		class LabelFinder : public ObjDeclCollector {
+		class LabelFinder final : public ObjDeclCollector {
 		  public:
 			typedef ObjDeclCollector Parent;
@@ -117,23 +119,24 @@
 			// subclasses are added, there is only one place that the code has to be updated, rather than ensure that
 			// every specialized class knows about every new kind of statement that might be added.
-			virtual void visit( CompoundStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( ExprStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( AsmStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( IfStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( WhileStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( ForStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( SwitchStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( CaseStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( BranchStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( ReturnStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( TryStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( CatchStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( FinallyStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( NullStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( DeclStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-			virtual void visit( ImplicitCtorDtorStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); }
-		};
-
-		class InsertDtors : public ObjDeclCollector {
+			using Parent::visit;
+			virtual void visit( CompoundStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( ExprStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( AsmStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( IfStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( WhileStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( ForStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( SwitchStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( CaseStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( BranchStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( ReturnStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( TryStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( CatchStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( FinallyStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( NullStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( DeclStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+			virtual void visit( ImplicitCtorDtorStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); }
+		};
+
+		class InsertDtors final : public ObjDeclCollector {
 		public:
 			/// insert destructor calls at the appropriate places.  must happen before CtorInit nodes are removed
@@ -147,9 +150,11 @@
 			InsertDtors( LabelFinder & finder ) : labelVars( finder.vars ) {}
 
-			virtual void visit( ObjectDecl * objDecl );
-
-			virtual void visit( CompoundStmt * compoundStmt );
-			virtual void visit( ReturnStmt * returnStmt );
-			virtual void visit( BranchStmt * stmt );
+			using Parent::visit;
+
+			virtual void visit( ObjectDecl * objDecl ) override;
+
+			virtual void visit( CompoundStmt * compoundStmt ) override;
+			virtual void visit( ReturnStmt * returnStmt ) override;
+			virtual void visit( BranchStmt * stmt ) override;
 		private:
 			void handleGoto( BranchStmt * stmt );
@@ -159,15 +164,16 @@
 		};
 
-		class FixInit : public GenPoly::PolyMutator {
+		class FixInit final : public GenPoly::PolyMutator {
 		  public:
 			/// expand each object declaration to use its constructor after it is declared.
 			static void fixInitializers( std::list< Declaration * > &translationUnit );
 
-			virtual DeclarationWithType * mutate( ObjectDecl *objDecl );
+			using GenPoly::PolyMutator::mutate;
+			virtual DeclarationWithType * mutate( ObjectDecl *objDecl ) override;
 
 			std::list< Declaration * > staticDtorDecls;
 		};
 
-		class FixCopyCtors : public GenPoly::PolyMutator {
+		class FixCopyCtors final : public GenPoly::PolyMutator {
 		  public:
 			/// expand ImplicitCopyCtorExpr nodes into the temporary declarations, copy constructors, call expression,
@@ -175,8 +181,9 @@
 			static void fixCopyCtors( std::list< Declaration * > &translationUnit );
 
-			virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr );
-		};
-
-		class GenStructMemberCalls : public SymTab::Indexer {
+			using GenPoly::PolyMutator::mutate;
+			virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr ) override;
+		};
+
+		class GenStructMemberCalls final : public SymTab::Indexer {
 		  public:
 			typedef Indexer Parent;
@@ -186,8 +193,10 @@
 			static void generate( std::list< Declaration * > & translationUnit );
 
-			virtual void visit( FunctionDecl * funcDecl );
-
-			virtual void visit( MemberExpr * memberExpr );
-			virtual void visit( ApplicationExpr * appExpr );
+			using Parent::visit;
+
+			virtual void visit( FunctionDecl * funcDecl ) override;
+
+			virtual void visit( MemberExpr * memberExpr ) override;
+			virtual void visit( ApplicationExpr * appExpr ) override;
 
 			SemanticError errors;
@@ -207,21 +216,23 @@
 		// resolve UntypedExprs that are found within newly
 		// generated constructor/destructor calls
-		class MutatingResolver : public Mutator {
+		class MutatingResolver final : public Mutator {
 		  public:
 			MutatingResolver( SymTab::Indexer & indexer ) : indexer( indexer ) {}
 
-			virtual DeclarationWithType* mutate( ObjectDecl *objectDecl );
-
-			virtual Expression* mutate( UntypedExpr *untypedExpr );
-			private:
+			using Mutator::mutate;
+			virtual DeclarationWithType* mutate( ObjectDecl *objectDecl ) override;
+			virtual Expression* mutate( UntypedExpr *untypedExpr ) override;
+
+		  private:
 			SymTab::Indexer & indexer;
 		};
 
-		class FixCtorExprs : public GenPoly::DeclMutator {
+		class FixCtorExprs final : public GenPoly::DeclMutator {
 		  public:
 			/// expands ConstructorExpr nodes into comma expressions, using a temporary for the first argument
 			static void fix( std::list< Declaration * > & translationUnit );
 
-			virtual Expression * mutate( ConstructorExpr * ctorExpr );
+			using GenPoly::DeclMutator::mutate;
+			virtual Expression * mutate( ConstructorExpr * ctorExpr ) override;
 		};
 	} // namespace
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 96a10cdd34eee83c07ea9c33d7699a3521eb03d9)
+++ src/InitTweak/GenInit.cc	(revision 9a8dfcc22a0cb55b65ad97ee728cfe06c2b62751)
@@ -36,5 +36,5 @@
 	}
 
-	class ReturnFixer : public GenPoly::PolyMutator {
+	class ReturnFixer final : public GenPoly::PolyMutator {
 	  public:
 		/// consistently allocates a temporary variable for the return value
@@ -45,7 +45,7 @@
 		ReturnFixer();
 
-		virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
-
-		virtual Statement * mutate( ReturnStmt * returnStmt );
+		using GenPoly::PolyMutator::mutate;
+		virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
+		virtual Statement * mutate( ReturnStmt * returnStmt ) override;
 
 	  protected:
@@ -55,5 +55,5 @@
 	};
 
-	class CtorDtor : public GenPoly::PolyMutator {
+	class CtorDtor final : public GenPoly::PolyMutator {
 	  public:
 		typedef GenPoly::PolyMutator Parent;
@@ -65,18 +65,18 @@
 		static void generateCtorDtor( std::list< Declaration * > &translationUnit );
 
-		virtual DeclarationWithType * mutate( ObjectDecl * );
-		virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
+		virtual DeclarationWithType * mutate( ObjectDecl * ) override;
+		virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
 		// should not traverse into any of these declarations to find objects
 		// that need to be constructed or destructed
-		virtual Declaration* mutate( StructDecl *aggregateDecl );
-		virtual Declaration* mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }
-		virtual Declaration* mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }
-		virtual Declaration* mutate( TraitDecl *aggregateDecl ) { return aggregateDecl; }
-		virtual TypeDecl* mutate( TypeDecl *typeDecl ) { return typeDecl; }
-		virtual Declaration* mutate( TypedefDecl *typeDecl ) { return typeDecl; }
-
-		virtual Type * mutate( FunctionType *funcType ) { return funcType; }
-
-		virtual CompoundStmt * mutate( CompoundStmt * compoundStmt );
+		virtual Declaration* mutate( StructDecl *aggregateDecl ) override;
+		virtual Declaration* mutate( UnionDecl *aggregateDecl ) override { return aggregateDecl; }
+		virtual Declaration* mutate( EnumDecl *aggregateDecl ) override { return aggregateDecl; }
+		virtual Declaration* mutate( TraitDecl *aggregateDecl ) override { return aggregateDecl; }
+		virtual TypeDecl* mutate( TypeDecl *typeDecl ) override { return typeDecl; }
+		virtual Declaration* mutate( TypedefDecl *typeDecl ) override { return typeDecl; }
+
+		virtual Type * mutate( FunctionType *funcType ) override { return funcType; }
+
+		virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) override;
 
 	  private:
@@ -91,5 +91,5 @@
 	};
 
-	class HoistArrayDimension : public GenPoly::DeclMutator {
+	class HoistArrayDimension final : public GenPoly::DeclMutator {
 	  public:
 		typedef GenPoly::DeclMutator Parent;
@@ -101,16 +101,18 @@
 
 	  private:
-		virtual DeclarationWithType * mutate( ObjectDecl * objectDecl );
-		virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
+		using Parent::mutate;
+
+		virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override;
+		virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
 		// should not traverse into any of these declarations to find objects
 		// that need to be constructed or destructed
-		virtual Declaration* mutate( StructDecl *aggregateDecl ) { return aggregateDecl; }
-		virtual Declaration* mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }
-		virtual Declaration* mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }
-		virtual Declaration* mutate( TraitDecl *aggregateDecl ) { return aggregateDecl; }
-		virtual TypeDecl* mutate( TypeDecl *typeDecl ) { return typeDecl; }
-		virtual Declaration* mutate( TypedefDecl *typeDecl ) { return typeDecl; }
-
-		virtual Type* mutate( FunctionType *funcType ) { return funcType; }
+		virtual Declaration* mutate( StructDecl *aggregateDecl ) override { return aggregateDecl; }
+		virtual Declaration* mutate( UnionDecl *aggregateDecl ) override { return aggregateDecl; }
+		virtual Declaration* mutate( EnumDecl *aggregateDecl ) override { return aggregateDecl; }
+		virtual Declaration* mutate( TraitDecl *aggregateDecl ) override { return aggregateDecl; }
+		virtual TypeDecl* mutate( TypeDecl *typeDecl ) override { return typeDecl; }
+		virtual Declaration* mutate( TypedefDecl *typeDecl ) override { return typeDecl; }
+
+		virtual Type* mutate( FunctionType *funcType ) override { return funcType; }
 
 		void hoist( Type * type );
Index: src/InitTweak/InitTweak.h
===================================================================
--- src/InitTweak/InitTweak.h	(revision 96a10cdd34eee83c07ea9c33d7699a3521eb03d9)
+++ src/InitTweak/InitTweak.h	(revision 9a8dfcc22a0cb55b65ad97ee728cfe06c2b62751)
@@ -100,4 +100,5 @@
 
 		class ExpanderImpl;
+		typedef std::list< Expression * > IndexList;
 	private:
 		std::shared_ptr< ExpanderImpl > expander;
@@ -105,5 +106,4 @@
 
 		// invariant: list of size 2N (elements come in pairs [index, dimension])
-		typedef std::list< Expression * > IndexList;
 		IndexList indices;
 	};
