Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 579263a52ab065d42a5208e15e3d707dd0d03798)
+++ src/InitTweak/FixInit.cc	(revision 6242335009c5d2ebee1bb50d1d228f5aacb0e5bd)
@@ -104,5 +104,6 @@
 			typedef AddStmtVisitor Parent;
 			using Parent::visit;
-			typedef std::set< ObjectDecl * > ObjectSet;
+			// use ordered data structure to maintain ordering for set_difference and for consistent error messages
+			typedef std::list< ObjectDecl * > ObjectSet;
 			virtual void visit( CompoundStmt *compoundStmt ) override;
 			virtual void visit( DeclStmt *stmt ) override;
@@ -116,10 +117,13 @@
 
 		// debug
-		struct printSet {
-			typedef ObjDeclCollector::ObjectSet ObjectSet;
-			printSet( const ObjectSet & objs ) : objs( objs ) {}
+		template<typename ObjectSet>
+		struct PrintSet {
+			PrintSet( const ObjectSet & objs ) : objs( objs ) {}
 			const ObjectSet & objs;
 		};
-		std::ostream & operator<<( std::ostream & out, const printSet & set) {
+		template<typename ObjectSet>
+		PrintSet<ObjectSet> printSet( const ObjectSet & objs ) { return PrintSet<ObjectSet>( objs ); }
+		template<typename ObjectSet>
+		std::ostream & operator<<( std::ostream & out, const PrintSet<ObjectSet> & set) {
 			out << "{ ";
 			for ( ObjectDecl * obj : set.objs ) {
@@ -745,6 +749,6 @@
 
 						Statement * dtor = ctorInit->get_dtor();
-						objDecl->set_init( NULL );
-						ctorInit->set_ctor( NULL );
+						objDecl->set_init( nullptr );
+						ctorInit->set_ctor( nullptr );
 						ctorInit->set_dtor( nullptr );
 						if ( dtor ) {
@@ -799,14 +803,14 @@
 						} else {
 							stmtsToAddAfter.push_back( ctor );
-							objDecl->set_init( NULL );
-							ctorInit->set_ctor( NULL );
+							objDecl->set_init( nullptr );
+							ctorInit->set_ctor( nullptr );
 						}
 					} // if
 				} else if ( Initializer * init = ctorInit->get_init() ) {
 					objDecl->set_init( init );
-					ctorInit->set_init( NULL );
+					ctorInit->set_init( nullptr );
 				} else {
 					// no constructor and no initializer, which is okay
-					objDecl->set_init( NULL );
+					objDecl->set_init( nullptr );
 				} // if
 				delete ctorInit;
@@ -816,5 +820,5 @@
 
 		void ObjDeclCollector::visit( CompoundStmt * compoundStmt ) {
-			std::set< ObjectDecl * > prevVars = curVars;
+			ObjectSet prevVars = curVars;
 			Parent::visit( compoundStmt );
 			curVars = prevVars;
@@ -824,5 +828,5 @@
 			// keep track of all variables currently in scope
 			if ( ObjectDecl * objDecl = dynamic_cast< ObjectDecl * > ( stmt->get_decl() ) ) {
-				curVars.insert( objDecl );
+				curVars.push_back( objDecl );
 			} // if
 			Parent::visit( stmt );
@@ -939,9 +943,12 @@
 			)
 			if ( ! diff.empty() ) {
+				// create an auxilliary set for fast lookup -- can't make diff a set, because diff ordering should be consistent for error messages.
+				std::unordered_set<ObjectDecl *> needsDestructor( diff.begin(), diff.end() );
+
 				// go through decl ordered list of objectdecl. for each element that occurs in diff, output destructor
 				OrderedDecls ordered;
 				for ( OrderedDecls & rdo : reverseDeclOrder ) {
 					// add elements from reverseDeclOrder into ordered if they occur in diff - it is key that this happens in reverse declaration order.
-					copy_if( rdo.begin(), rdo.end(), back_inserter( ordered ), [&]( ObjectDecl * objDecl ) { return diff.count( objDecl ); } );
+					copy_if( rdo.begin(), rdo.end(), back_inserter( ordered ), [&]( ObjectDecl * objDecl ) { return needsDestructor.count( objDecl ); } );
 				} // for
 				insertDtors( ordered.begin(), ordered.end(), back_inserter( stmtsToAdd ) );
