Index: src/ControlStruct/LabelFixer.h
===================================================================
--- src/ControlStruct/LabelFixer.h	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/ControlStruct/LabelFixer.h	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -26,5 +26,5 @@
 namespace ControlStruct {
 	/// normalizes label definitions and generates multi-level exit labels
-	class LabelFixer : public Visitor {
+	class LabelFixer final : public Visitor {
 		typedef Visitor Parent;
 	  public:
@@ -33,24 +33,26 @@
 		std::map < Label, Statement * > *resolveJumps() throw ( SemanticError );
 
+		using Visitor::visit;
+
 		// Declarations
-		virtual void visit( FunctionDecl *functionDecl );
+		virtual void visit( FunctionDecl *functionDecl ) override;
 
 		// Statements
 		void visit( Statement *stmt );
 
-		virtual void visit( CompoundStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( NullStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( ExprStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( IfStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( WhileStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( ForStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( SwitchStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( CaseStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( ReturnStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( TryStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( CatchStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( DeclStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
-		virtual void visit( BranchStmt *branchStmt );
-		virtual void visit( UntypedExpr *untyped );
+		virtual void visit( CompoundStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( NullStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( ExprStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( IfStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( WhileStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( ForStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( SwitchStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( CaseStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( ReturnStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( TryStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( CatchStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( DeclStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); }
+		virtual void visit( BranchStmt *branchStmt ) override;
+		virtual void visit( UntypedExpr *untyped ) override;
 
 		Label setLabelsDef( std::list< Label > &, Statement *definition );
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/GenPoly/Box.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -64,31 +64,34 @@
 
 		/// Adds layout-generation functions to polymorphic types
-		class LayoutFunctionBuilder : public DeclMutator {
+		class LayoutFunctionBuilder final : public DeclMutator {
 			unsigned int functionNesting;  // current level of nested functions
 		public:
 			LayoutFunctionBuilder() : functionNesting( 0 ) {}
 
-			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
-			virtual Declaration *mutate( StructDecl *structDecl );
-			virtual Declaration *mutate( UnionDecl *unionDecl );
+			using DeclMutator::mutate;
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
+			virtual Declaration *mutate( StructDecl *structDecl ) override;
+			virtual Declaration *mutate( UnionDecl *unionDecl ) override;
 		};
 
 		/// Replaces polymorphic return types with out-parameters, replaces calls to polymorphic functions with adapter calls as needed, and adds appropriate type variables to the function call
-		class Pass1 : public PolyMutator {
+		class Pass1 final : public PolyMutator {
 		  public:
 			Pass1();
-			virtual Expression *mutate( ApplicationExpr *appExpr );
-			virtual Expression *mutate( AddressExpr *addrExpr );
-			virtual Expression *mutate( UntypedExpr *expr );
-			virtual DeclarationWithType* mutate( FunctionDecl *functionDecl );
-			virtual TypeDecl *mutate( TypeDecl *typeDecl );
-			virtual Expression *mutate( CommaExpr *commaExpr );
-			virtual Expression *mutate( ConditionalExpr *condExpr );
-			virtual Statement * mutate( ReturnStmt *returnStmt );
-			virtual Type *mutate( PointerType *pointerType );
-			virtual Type * mutate( FunctionType *functionType );
-
-			virtual void doBeginScope();
-			virtual void doEndScope();
+
+			using PolyMutator::mutate;
+			virtual Expression *mutate( ApplicationExpr *appExpr ) override;
+			virtual Expression *mutate( AddressExpr *addrExpr ) override;
+			virtual Expression *mutate( UntypedExpr *expr ) override;
+			virtual DeclarationWithType* mutate( FunctionDecl *functionDecl ) override;
+			virtual TypeDecl *mutate( TypeDecl *typeDecl ) override;
+			virtual Expression *mutate( CommaExpr *commaExpr ) override;
+			virtual Expression *mutate( ConditionalExpr *condExpr ) override;
+			virtual Statement * mutate( ReturnStmt *returnStmt ) override;
+			virtual Type *mutate( PointerType *pointerType ) override;
+			virtual Type * mutate( FunctionType *functionType ) override;
+
+			virtual void doBeginScope() override;
+			virtual void doEndScope() override;
 		  private:
 			/// Pass the extra type parameters from polymorphic generic arguments or return types into a function application
@@ -135,14 +138,16 @@
 		/// * Moves polymorphic returns in function types to pointer-type parameters
 		/// * adds type size and assertion parameters to parameter lists
-		class Pass2 : public PolyMutator {
+		class Pass2 final : public PolyMutator {
 		  public:
 			template< typename DeclClass >
 			DeclClass *handleDecl( DeclClass *decl, Type *type );
-			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
-			virtual ObjectDecl *mutate( ObjectDecl *objectDecl );
-			virtual TypeDecl *mutate( TypeDecl *typeDecl );
-			virtual TypedefDecl *mutate( TypedefDecl *typedefDecl );
-			virtual Type *mutate( PointerType *pointerType );
-			virtual Type *mutate( FunctionType *funcType );
+
+			using PolyMutator::mutate;
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
+			virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
+			virtual TypeDecl *mutate( TypeDecl *typeDecl ) override;
+			virtual TypedefDecl *mutate( TypedefDecl *typedefDecl ) override;
+			virtual Type *mutate( PointerType *pointerType ) override;
+			virtual Type *mutate( FunctionType *funcType ) override;
 
 		  private:
@@ -156,5 +161,5 @@
 		/// * Calculates polymorphic offsetof expressions from offset array
 		/// * Inserts dynamic calculation of polymorphic type layouts where needed
-		class PolyGenericCalculator : public PolyMutator {
+		class PolyGenericCalculator final : public PolyMutator {
 		public:
 			typedef PolyMutator Parent;
@@ -163,19 +168,19 @@
 			template< typename DeclClass >
 			DeclClass *handleDecl( DeclClass *decl, Type *type );
-			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
-			virtual ObjectDecl *mutate( ObjectDecl *objectDecl );
-			virtual TypedefDecl *mutate( TypedefDecl *objectDecl );
-			virtual TypeDecl *mutate( TypeDecl *objectDecl );
-			virtual Statement *mutate( DeclStmt *declStmt );
-			virtual Type *mutate( PointerType *pointerType );
-			virtual Type *mutate( FunctionType *funcType );
-			virtual Expression *mutate( MemberExpr *memberExpr );
-			virtual Expression *mutate( SizeofExpr *sizeofExpr );
-			virtual Expression *mutate( AlignofExpr *alignofExpr );
-			virtual Expression *mutate( OffsetofExpr *offsetofExpr );
-			virtual Expression *mutate( OffsetPackExpr *offsetPackExpr );
-
-			virtual void doBeginScope();
-			virtual void doEndScope();
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
+			virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
+			virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override;
+			virtual TypeDecl *mutate( TypeDecl *objectDecl ) override;
+			virtual Statement *mutate( DeclStmt *declStmt ) override;
+			virtual Type *mutate( PointerType *pointerType ) override;
+			virtual Type *mutate( FunctionType *funcType ) override;
+			virtual Expression *mutate( MemberExpr *memberExpr ) override;
+			virtual Expression *mutate( SizeofExpr *sizeofExpr ) override;
+			virtual Expression *mutate( AlignofExpr *alignofExpr ) override;
+			virtual Expression *mutate( OffsetofExpr *offsetofExpr ) override;
+			virtual Expression *mutate( OffsetPackExpr *offsetPackExpr ) override;
+
+			virtual void doBeginScope() override;
+			virtual void doEndScope() override;
 
 		private:
@@ -197,14 +202,16 @@
 
 		/// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, and sizeof expressions of polymorphic types with the proper variable
-		class Pass3 : public PolyMutator {
+		class Pass3 final : public PolyMutator {
 		  public:
 			template< typename DeclClass >
 			DeclClass *handleDecl( DeclClass *decl, Type *type );
-			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
-			virtual ObjectDecl *mutate( ObjectDecl *objectDecl );
-			virtual TypedefDecl *mutate( TypedefDecl *objectDecl );
-			virtual TypeDecl *mutate( TypeDecl *objectDecl );
-			virtual Type *mutate( PointerType *pointerType );
-			virtual Type *mutate( FunctionType *funcType );
+
+			using PolyMutator::mutate;
+			virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
+			virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
+			virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override;
+			virtual TypeDecl *mutate( TypeDecl *objectDecl ) override;
+			virtual Type *mutate( PointerType *pointerType ) override;
+			virtual Type *mutate( FunctionType *funcType ) override;
 		  private:
 		};
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/GenPoly/InstantiateGeneric.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -147,5 +147,5 @@
 
 	/// Mutator pass that replaces concrete instantiations of generic types with actual struct declarations, scoped appropriately
-	class GenericInstantiator : public DeclMutator {
+	class GenericInstantiator final : public DeclMutator {
 		/// Map of (generic type, parameter list) pairs to concrete type instantiations
 		InstantiationMap< AggregateDecl, AggregateDecl > instantiations;
@@ -158,9 +158,10 @@
 		GenericInstantiator() : DeclMutator(), instantiations(), dtypeStatics(), typeNamer("_conc_") {}
 
-		virtual Type* mutate( StructInstType *inst );
-		virtual Type* mutate( UnionInstType *inst );
-
-		virtual void doBeginScope();
-		virtual void doEndScope();
+		using DeclMutator::mutate;
+		virtual Type* mutate( StructInstType *inst ) override;
+		virtual Type* mutate( UnionInstType *inst ) override;
+
+		virtual void doBeginScope() override;
+		virtual void doEndScope() override;
 	private:
 		/// Wrap instantiation lookup for structs
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/GenPoly/Specialize.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -36,11 +36,12 @@
 	const std::list<Label> noLabels;
 
-	class Specialize : public PolyMutator {
+	class Specialize final : public PolyMutator {
 	  public:
 		Specialize( std::string paramPrefix = "_p" );
 
-		virtual Expression * mutate( ApplicationExpr *applicationExpr );
-		virtual Expression * mutate( AddressExpr *castExpr );
-		virtual Expression * mutate( CastExpr *castExpr );
+		using PolyMutator::mutate;
+		virtual Expression * mutate( ApplicationExpr *applicationExpr ) override;
+		virtual Expression * mutate( AddressExpr *castExpr ) override;
+		virtual Expression * mutate( CastExpr *castExpr ) override;
 		// virtual Expression * mutate( LogicalExpr *logicalExpr );
 		// virtual Expression * mutate( ConditionalExpr *conditionalExpr );
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/InitTweak/FixInit.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -49,5 +49,5 @@
 namespace InitTweak {
 	namespace {
-		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
@@ -55,8 +55,9 @@
 			static void insert( std::list< Declaration * > & translationUnit );
 
-			virtual Expression * mutate( ApplicationExpr * appExpr );
+			using GenPoly::PolyMutator::mutate;
+			virtual Expression * mutate( ApplicationExpr * appExpr ) override;
 		};
 
-		class ResolveCopyCtors : public SymTab::Indexer {
+		class ResolveCopyCtors final : public SymTab::Indexer {
 		public:
 			/// generate temporary ObjectDecls for each argument and return value of each ImplicitCopyCtorExpr,
@@ -68,5 +69,5 @@
 			using Parent::visit;
 
-			virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr );
+			virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override;
 			virtual void visit( UniqueExpr * unqExpr );
 
@@ -88,6 +89,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;
@@ -109,5 +110,5 @@
 		}
 
-		class LabelFinder : public ObjDeclCollector {
+		class LabelFinder final : public ObjDeclCollector {
 		  public:
 			typedef ObjDeclCollector Parent;
@@ -123,23 +124,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 ); }
+			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 : public ObjDeclCollector {
+		class InsertDtors final : public ObjDeclCollector {
 		public:
 			/// insert destructor calls at the appropriate places.  must happen before CtorInit nodes are removed
@@ -153,9 +155,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 );
@@ -165,15 +169,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,
@@ -181,9 +186,10 @@
 			static void fixCopyCtors( std::list< Declaration * > &translationUnit );
 
-			virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr );
-			virtual Expression * mutate( UniqueExpr * unqExpr );
+			using GenPoly::PolyMutator::mutate;
+			virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr ) override;
+			virtual Expression * mutate( UniqueExpr * unqExpr ) override;
 		};
 
-		class GenStructMemberCalls : public SymTab::Indexer {
+		class GenStructMemberCalls final : public SymTab::Indexer {
 		  public:
 			typedef Indexer Parent;
@@ -193,8 +199,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;
@@ -214,21 +222,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 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/InitTweak/GenInit.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -37,5 +37,5 @@
 	}
 
-	class ReturnFixer : public GenPoly::PolyMutator {
+	class ReturnFixer final : public GenPoly::PolyMutator {
 	  public:
 		/// consistently allocates a temporary variable for the return value
@@ -46,7 +46,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:
@@ -56,5 +56,5 @@
 	};
 
-	class CtorDtor : public GenPoly::PolyMutator {
+	class CtorDtor final : public GenPoly::PolyMutator {
 	  public:
 		typedef GenPoly::PolyMutator Parent;
@@ -66,18 +66,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:
@@ -93,5 +93,5 @@
 	};
 
-	class HoistArrayDimension : public GenPoly::DeclMutator {
+	class HoistArrayDimension final : public GenPoly::DeclMutator {
 	  public:
 		typedef GenPoly::DeclMutator Parent;
@@ -103,16 +103,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 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/InitTweak/InitTweak.h	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -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;
 	};
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/Makefile.am	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -6,11 +6,11 @@
 ## file "LICENCE" distributed with Cforall.
 ##
-## Makefile.am -- 
+## Makefile.am --
 ##
 ## Author           : Peter A. Buhr
 ## Created On       : Sun May 31 08:51:46 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Sat Sep 24 15:03:52 2016
-## Update Count     : 73
+## Last Modified On : Thu Oct 27 20:41:25 2016
+## Update Count     : 75
 ###############################################################################
 
@@ -41,5 +41,6 @@
 driver_cfa_cpp_SOURCES = ${SRC}
 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl			# yywrap
-driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -rdynamic -I${abs_top_srcdir}/src/include
+driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT
+driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
 
 MAINTAINERCLEANFILES += ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/Makefile.in	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -198,5 +198,5 @@
 driver_cfa_cpp_DEPENDENCIES = $(am__DEPENDENCIES_1)
 driver_cfa_cpp_LINK = $(CXXLD) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+	$(driver_cfa_cpp_LDFLAGS) $(LDFLAGS) -o $@
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/automake/depcomp
@@ -267,5 +267,4 @@
 CFA_PREFIX = @CFA_PREFIX@
 CFLAGS = @CFLAGS@
-CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -419,5 +418,6 @@
 driver_cfa_cpp_SOURCES = ${SRC}
 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl			# yywrap
-driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -rdynamic -I${abs_top_srcdir}/src/include
+driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT
+driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
 all: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) all-am
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/Parser/ParseNode.h	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -109,5 +109,5 @@
 	ExpressionNode * set_extension( bool exten ) { extension = exten; return this; }
 
-	void print( std::ostream &os, int indent = 0 ) const {}
+	virtual void print( std::ostream &os, int indent = 0 ) const override {}
 	void printOneLine( std::ostream &os, int indent = 0 ) const {}
 
@@ -191,5 +191,5 @@
 //##############################################################################
 
-class TypeData;
+struct TypeData;
 
 class DeclarationNode : public ParseNode {
@@ -275,6 +275,6 @@
 	}
 
-	void print( std::ostream &os, int indent = 0 ) const;
-	void printList( std::ostream &os, int indent = 0 ) const;
+	virtual void print( std::ostream &os, int indent = 0 ) const override;
+	virtual void printList( std::ostream &os, int indent = 0 ) const override;
 
 	Declaration * build() const;
@@ -349,6 +349,6 @@
 	virtual StatementNode * append_last_case( StatementNode * );
 
-	virtual void print( std::ostream &os, int indent = 0 ) {}
-	virtual void printList( std::ostream &os, int indent = 0 ) {}
+	virtual void print( std::ostream &os, int indent = 0 ) const override {}
+	virtual void printList( std::ostream &os, int indent = 0 ) const override {}
   private:
 	std::unique_ptr<Statement> stmt;
Index: src/ResolvExpr/AlternativeFinder.h
===================================================================
--- src/ResolvExpr/AlternativeFinder.h	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/ResolvExpr/AlternativeFinder.h	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -95,6 +95,4 @@
 	Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env );
 
-	void resolveObject( const SymTab::Indexer & indexer, ObjectDecl * objectDecl );
-
 	template< typename InputIterator, typename OutputIterator >
 	void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) {
Index: src/ResolvExpr/AlternativePrinter.h
===================================================================
--- src/ResolvExpr/AlternativePrinter.h	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/ResolvExpr/AlternativePrinter.h	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// AlternativePrinter.h -- 
+// AlternativePrinter.h --
 //
 // Author           : Richard C. Bilson
@@ -23,8 +23,10 @@
 
 namespace ResolvExpr {
-	class AlternativePrinter : public SymTab::Indexer {
+	class AlternativePrinter final : public SymTab::Indexer {
 	  public:
 		AlternativePrinter( std::ostream &os );
-		virtual void visit( ExprStmt *exprStmt );
+
+		using SymTab::Indexer::visit;
+		virtual void visit( ExprStmt *exprStmt ) override;
 	  private:
 		std::ostream &os;
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/ResolvExpr/Resolver.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -33,31 +33,31 @@
 
 namespace ResolvExpr {
-	class Resolver : public SymTab::Indexer {
+	class Resolver final : public SymTab::Indexer {
 	  public:
 		Resolver() : SymTab::Indexer( false ) {}
-		Resolver( const SymTab::Indexer & indexer ) : SymTab::Indexer( indexer ) {}
-
-		virtual void visit( FunctionDecl *functionDecl );
-		virtual void visit( ObjectDecl *objectDecl );
-		virtual void visit( TypeDecl *typeDecl );
-		virtual void visit( EnumDecl * enumDecl );
-
-		virtual void visit( ArrayType * at );
-		virtual void visit( PointerType * at );
-
-		virtual void visit( ExprStmt *exprStmt );
-		virtual void visit( AsmExpr *asmExpr );
-		virtual void visit( AsmStmt *asmStmt );
-		virtual void visit( IfStmt *ifStmt );
-		virtual void visit( WhileStmt *whileStmt );
-		virtual void visit( ForStmt *forStmt );
-		virtual void visit( SwitchStmt *switchStmt );
-		virtual void visit( CaseStmt *caseStmt );
-		virtual void visit( BranchStmt *branchStmt );
-		virtual void visit( ReturnStmt *returnStmt );
-
-		virtual void visit( SingleInit *singleInit );
-		virtual void visit( ListInit *listInit );
-		virtual void visit( ConstructorInit *ctorInit );
+
+		using SymTab::Indexer::visit;
+		virtual void visit( FunctionDecl *functionDecl ) override;
+		virtual void visit( ObjectDecl *functionDecl ) override;
+		virtual void visit( TypeDecl *typeDecl ) override;
+		virtual void visit( EnumDecl * enumDecl ) override;
+
+		virtual void visit( ArrayType * at ) override;
+		virtual void visit( PointerType * at ) override;
+
+		virtual void visit( ExprStmt *exprStmt ) override;
+		virtual void visit( AsmExpr *asmExpr ) override;
+		virtual void visit( AsmStmt *asmStmt ) override;
+		virtual void visit( IfStmt *ifStmt ) override;
+		virtual void visit( WhileStmt *whileStmt ) override;
+		virtual void visit( ForStmt *forStmt ) override;
+		virtual void visit( SwitchStmt *switchStmt ) override;
+		virtual void visit( CaseStmt *caseStmt ) override;
+		virtual void visit( BranchStmt *branchStmt ) override;
+		virtual void visit( ReturnStmt *returnStmt ) override;
+
+		virtual void visit( SingleInit *singleInit ) override;
+		virtual void visit( ListInit *listInit ) override;
+		virtual void visit( ConstructorInit *ctorInit ) override;
 	  private:
   	typedef std::list< Initializer * >::iterator InitIterator;
@@ -69,4 +69,5 @@
 	  void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & );
 	  void fallbackInit( ConstructorInit * ctorInit );
+
 		Type * functionReturn = nullptr;
 		Type *initContext = nullptr;
@@ -533,9 +534,4 @@
 	}
 
-	void resolveObject( const SymTab::Indexer & indexer, ObjectDecl * objectDecl ) {
-		Resolver resolver( indexer );
-		objectDecl->accept( resolver );
-	}
-
 	void Resolver::visit( ConstructorInit *ctorInit ) {
 		// xxx - fallback init has been removed => remove fallbackInit function and remove complexity from FixInit and remove C-init from ConstructorInit
Index: src/ResolvExpr/TypeMap.h
===================================================================
--- src/ResolvExpr/TypeMap.h	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/ResolvExpr/TypeMap.h	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -38,5 +38,5 @@
 		typedef typename std::map< std::string, Value* > ValueMap;
 		typedef typename ValueMap::iterator ValueMapIterator;
-		
+
 		Value *voidValue;                                     ///< Value for void type
 		Value *basicValue[BasicType::NUMBER_OF_BASIC_TYPES];  ///< Values for basic types
@@ -54,5 +54,5 @@
 			/// One scope of map rollbacks
 			typedef std::vector< std::pair< ValueMapIterator, Value* > > MapScope;
-			
+
 			PointerScope pointers;  ///< Value pointers to roll back to their previous state
 			MapScope mapNodes;      ///< Value map iterators to roll back to their previous state
@@ -68,5 +68,5 @@
 
 		std::vector< Rollback > scopes;  ///< Scope rollback information
-		
+
 		struct Lookup : public Visitor {
 			Lookup( TypeMap<Value> &typeMap ) : typeMap( typeMap ), found( 0 ), toInsert( 0 ) {}
@@ -87,5 +87,5 @@
 				return found;
 			}
-			
+
 			void findAndReplace( Value *&loc ) {
 				found = loc;
@@ -109,13 +109,13 @@
 				}
 			}
-			
+
 			virtual void visit( VoidType *voidType ) {
 				findAndReplace( typeMap.voidValue );
 			}
-			
+
 			virtual void visit( BasicType *basicType ) {
 				findAndReplace( typeMap.basicValue[basicType->get_kind()] );
 			}
-			
+
 			virtual void visit( PointerType *pointerType ) {
 				// NOTE This is one of the places where the apporoximation of the resolver is (deliberately) poor;
@@ -129,5 +129,5 @@
 				}
 			}
-			
+
 			virtual void visit( ArrayType *arrayType ) {
 				if ( dynamic_cast< FunctionType* >( arrayType->get_base() ) ) {
@@ -137,17 +137,17 @@
 				}
 			}
-			
+
 			virtual void visit( FunctionType *functionType ) {
 				findAndReplace( typeMap.functionPointerValue );
 			}
-			
+
 			virtual void visit( StructInstType *structType ) {
 				findAndReplace( typeMap.structValue, structType->get_name() );
 			}
-			
+
 			virtual void visit( UnionInstType *unionType ) {
 				findAndReplace( typeMap.unionValue, unionType->get_name() );
 			}
-			
+
 			virtual void visit( EnumInstType *enumType ) {
 				findAndReplace( typeMap.enumValue, enumType->get_name() );
@@ -157,7 +157,7 @@
 			Value *found;             ///< Value found (NULL if none yet)
 			Value *toInsert;          ///< Value to insert (NULL if a lookup)
-		};  // class Lookup
-		friend class Lookup;
-		
+		};  // struct Lookup
+		friend struct Lookup;
+
 	public:
 		/// Starts a new scope
@@ -180,5 +180,5 @@
 			scopes.pop_back();
 		}
-		
+
 		TypeMap() : voidValue( 0 ), pointerValue( 0 ), voidPointerValue( 0 ), functionPointerValue( 0 ), structValue(), unionValue(), enumValue(), scopes() {
 			beginScope();
@@ -199,5 +199,5 @@
 			return searcher.find( key );
 		}
-		
+
 	}; // class TypeMap
 
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/ResolvExpr/Unify.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -73,5 +73,4 @@
 		const OpenVarSet &openVars;
 		WidenMode widenMode;
-		Type *commonType;
 		const SymTab::Indexer &indexer;
 	};
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/SymTab/Validate.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -94,15 +94,16 @@
 
 	/// Associates forward declarations of aggregates with their definitions
-	class Pass2 : public Indexer {
+	class Pass2 final : public Indexer {
 		typedef Indexer Parent;
 	  public:
 		Pass2( bool doDebug, const Indexer *indexer );
 	  private:
-		virtual void visit( StructInstType *structInst );
-		virtual void visit( UnionInstType *unionInst );
-		virtual void visit( TraitInstType *contextInst );
-		virtual void visit( StructDecl *structDecl );
-		virtual void visit( UnionDecl *unionDecl );
-		virtual void visit( TypeInstType *typeInst );
+  		using Indexer::visit;
+		void visit( StructInstType *structInst ) final;
+		void visit( UnionInstType *unionInst ) final;
+		void visit( TraitInstType *contextInst ) final;
+		void visit( StructDecl *structDecl ) final;
+		void visit( UnionDecl *unionDecl ) final;
+		void visit( TypeInstType *typeInst ) final;
 
 		const Indexer *indexer;
@@ -182,9 +183,10 @@
 	};
 
-	class CompoundLiteral : public GenPoly::DeclMutator {
+	class CompoundLiteral final : public GenPoly::DeclMutator {
 		DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass;
 
-		virtual DeclarationWithType * mutate( ObjectDecl *objectDecl );
-		virtual Expression *mutate( CompoundLiteralExpr *compLitExpr );
+		using GenPoly::DeclMutator::mutate;
+		DeclarationWithType * mutate( ObjectDecl *objectDecl ) final;
+		Expression *mutate( CompoundLiteralExpr *compLitExpr ) final;
 	};
 
@@ -652,5 +654,5 @@
 	void EliminateTypedef::addImplicitTypedef( AggDecl * aggDecl ) {
 		if ( typedefNames.count( aggDecl->get_name() ) == 0 ) {
-			Type *type;
+			Type *type = nullptr;
 			if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( aggDecl ) ) {
 				type = new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() );
Index: src/driver/Makefile.am
===================================================================
--- src/driver/Makefile.am	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/driver/Makefile.am	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 08:49:31 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Thu Jan 28 09:04:40 2016
-## Update Count     : 7
+## Last Modified On : Fri Oct 28 13:46:06 2016
+## Update Count     : 10
 ###############################################################################
 
@@ -26,6 +26,3 @@
 cc1_SOURCES = cc1.cc
 
-cfa.cc : ${abs_top_srcdir}/version
-	@true
-
 MAINTAINERCLEANFILES = @CFA_PREFIX@/bin/${bin_PROGRAMS} @CFA_PREFIX@/lib/${cc1lib_PROGRAMS}
Index: src/driver/Makefile.in
===================================================================
--- src/driver/Makefile.in	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/driver/Makefile.in	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -100,5 +100,4 @@
 CFA_PREFIX = @CFA_PREFIX@
 CFLAGS = @CFLAGS@
-CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
@@ -543,7 +542,4 @@
 
 
-cfa.cc : ${abs_top_srcdir}/version
-	@true
-
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
Index: src/driver/cfa.cc
===================================================================
--- src/driver/cfa.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/driver/cfa.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 20 13:44:49 2002
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Oct 25 21:29:48 2016
-// Update Count     : 152
+// Last Modified On : Thu Oct 27 22:19:37 2016
+// Update Count     : 154
 //
 
@@ -50,7 +50,9 @@
 
 
+#define str(s) #s
+
 int main( int argc, char *argv[] ) {
-	string Version( CFA_VERSION_LONG );							// current version number from CONFIG
-	string Major( to_string( CFA_VERSION_MAJOR ) ), Minor( to_string( CFA_VERSION_MINOR ) ), Patch( to_string( CFA_VERSION_PATCH ) );
+	string Version( CFA_VERSION_LONG );					// current version number from CONFIG
+	string Major( str( CFA_VERSION_MAJOR ) ), Minor( str( CFA_VERSION_MINOR ) ), Patch( str( CFA_VERSION_PATCH ) );
 
 	string installincdir( CFA_INCDIR );					// fixed location of include files
Index: src/examples/Makefile.in
===================================================================
--- src/examples/Makefile.in	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/examples/Makefile.in	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -111,5 +111,4 @@
 # applies to both programs
 CFLAGS = -g -Wall -Wno-unused-function # TEMPORARY: does not build with -O2
-CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
Index: src/libcfa/Makefile.in
===================================================================
--- src/libcfa/Makefile.in	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/libcfa/Makefile.in	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -137,5 +137,4 @@
 CFA_PREFIX = @CFA_PREFIX@
 CFLAGS = -quiet -no-include-stdhdr -g -Wall -Wno-unused-function @CFA_FLAGS@ -B${abs_top_srcdir}/src/driver -XCFA -t # TEMPORARY: does not build with -O2
-CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/main.cc	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 15 23:12:02 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Aug 29 17:34:39 2016
-// Update Count     : 426
+// Last Modified On : Sun Oct 30 10:11:38 2016
+// Update Count     : 435
 //
 
@@ -18,6 +18,7 @@
 #include <signal.h>										// signal
 #include <getopt.h>										// getopt
-#include <execinfo.h>									// backtrace, backtrace_symbols_fd
+#include <execinfo.h>									// backtrace, backtrace_symbols
 #include <cxxabi.h>										// __cxa_demangle
+#include <cstring>										// index
 
 using namespace std;
@@ -76,9 +77,12 @@
 static void dump( list< Declaration * > & translationUnit, ostream & out = cout );
 
-void backtrace( int start ) {							// skip first N stack frames
+static void backtrace( int start ) {					// skip first N stack frames
 	enum { Frames = 50 };
 	void * array[Frames];
-	int size = backtrace( array, Frames );
-	char ** messages = backtrace_symbols( array, size );
+	int size = ::backtrace( array, Frames );
+	char ** messages = ::backtrace_symbols( array, size ); // does not demangle names
+
+	*index( messages[0], '(' ) = '\0';					// find executable name
+	cerr << "Stack back trace for: " << messages[0] << endl;
 
 	// skip last 2 stack frames after main
@@ -86,9 +90,9 @@
 		char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
 		for ( char *p = messages[i]; *p; ++p ) {        // find parantheses and +offset
-			if (*p == '(') {
+			if ( *p == '(' ) {
 				mangled_name = p;
-			} else if (*p == '+') {
+			} else if ( *p == '+' ) {
 				offset_begin = p;
-			} else if (*p == ')') {
+			} else if ( *p == ')' ) {
 				offset_end = p;
 				break;
@@ -99,18 +103,19 @@
 		int frameNo = i - start;
 		if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin ) {
-			*mangled_name++ = '\0';
+			*mangled_name++ = '\0';						// delimit strings
 			*offset_begin++ = '\0';
 			*offset_end++ = '\0';
 
-			int status, frameNo = i - start;
+			int status;
 			char * real_name = __cxxabiv1::__cxa_demangle( mangled_name, 0, 0, &status );
+			// bug in __cxa_demangle for single-character lower-case non-mangled names
 			if ( status == 0 ) {						// demangling successful ?
 				cerr << "(" << frameNo << ") " << messages[i] << " : "
 					 << real_name << "+" << offset_begin << offset_end << endl;
-
 			} else {									// otherwise, output mangled name
 				cerr << "(" << frameNo << ") " << messages[i] << " : "
-					 << mangled_name << "+" << offset_begin << offset_end << endl;
+					 << mangled_name << "(/*unknown*/)+" << offset_begin << offset_end << endl;
 			} // if
+
 			free( real_name );
 		} else {										// otherwise, print the whole line
@@ -125,5 +130,5 @@
 	cerr << "*CFA runtime error* program cfa-cpp terminated with "
 		 <<	(sig_num == SIGSEGV ? "segment fault" : "bus error")
-		 << " backtrace:" << endl;
+		 << "." << endl;
 	backtrace( 2 );										// skip first 2 stack frames
 	exit( EXIT_FAILURE );
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
+++ src/tests/Makefile.in	(revision d073e3c65a9c5cb79e8326fbb68259b1de9b88a3)
@@ -121,5 +121,4 @@
 # applies to both programs
 CFLAGS = -g -Wall -Wno-unused-function @CFA_FLAGS@ # TEMPORARY: does not build with -O2
-CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
