Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 4d4882af105c01a957552263fa5e039f2f2620f3)
+++ src/InitTweak/FixInit.cc	(revision 44f634105516d986619d99fb2c97409063553f7d)
@@ -200,4 +200,5 @@
 			ObjectDecl * thisParam = 0;
 			bool isCtor = false; // true if current function is a constructor
+			StructDecl * structDecl = 0;
 		};
 
@@ -744,4 +745,5 @@
 			ValueGuard< ObjectDecl * > oldThisParam( thisParam );
 			ValueGuard< bool > oldIsCtor( isCtor );
+			ValueGuard< StructDecl * > oldStructDecl( structDecl );
 
 			// need to start with fresh sets
@@ -758,5 +760,5 @@
 				StructInstType * structType = dynamic_cast< StructInstType * >( ptrType->get_base() );
 				if ( structType ) {
-					StructDecl * structDecl = structType->get_baseStruct();
+					structDecl = structType->get_baseStruct();
 					for ( Declaration * member : structDecl->get_members() ) {
 						if ( ObjectDecl * field = dynamic_cast< ObjectDecl * >( member ) ) {
@@ -775,5 +777,5 @@
 			std::set_difference( usedUninit.begin(), usedUninit.end(), unhandled.begin(), unhandled.end(), std::inserter( diff, diff.begin() ) );
 			for ( DeclarationWithType * member : diff ) {
-				emit( "in ", CodeGen::genType( function->get_functionType(), function->get_name(), false ), ", member ", member->get_name(), " used before being constructed" );
+				emit( "in ", CodeGen::genType( function->get_functionType(), function->get_name(), false ), ", field ", member->get_name(), " used before being constructed" );
 			}
 
@@ -782,6 +784,15 @@
 				enterScope();
 				// maybeAccept( function->get_functionType(), *this );
-				for ( DeclarationWithType * member : unhandled ) {
-					// insert and resolve default/copy constructor call for each member that's unhandled
+
+				// need to iterate through members in reverse in order for
+				// ctor/dtor statements to come out in the right order
+				for ( Declaration * member : ReverseIterate( structDecl->get_members() ) ) {
+					DeclarationWithType * field = dynamic_cast< DeclarationWithType * >( member );
+					// skip non-DWT members
+					if ( ! field ) continue;
+					// skip handled members
+					if ( ! unhandled.count( field ) ) continue;
+
+					// insert and resolve default/copy constructor call for each field that's unhandled
 					std::list< Statement * > stmt;
 					UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) );
@@ -790,11 +801,11 @@
 					Expression * arg2 = 0;
 					if ( isCopyConstructor( function ) ) {
-						// if copy ctor, need to pass second-param-of-this-function.member
+						// if copy ctor, need to pass second-param-of-this-function.field
 						std::list< DeclarationWithType * > & params = function->get_functionType()->get_parameters();
 						assert( params.size() == 2 );
-						arg2 = new MemberExpr( member, new VariableExpr( params.back() ) );
+						arg2 = new MemberExpr( field, new VariableExpr( params.back() ) );
 					}
 					InitExpander srcParam( arg2 );
-					SymTab::genImplicitCall( srcParam, new MemberExpr( member, deref ), function->get_name(), back_inserter( stmt ), member, isCtor );
+					SymTab::genImplicitCall( srcParam, new MemberExpr( field, deref ), function->get_name(), back_inserter( stmt ), field, isCtor );
 
 					assert( stmt.size() <= 1 );
@@ -813,5 +824,5 @@
 							}
 						} catch ( SemanticError & error ) {
-							emit( "in ", CodeGen::genType( function->get_functionType(), function->get_name(), false ), ", member ", member->get_name(), " not explicitly ", isCtor ? "constructed" : "destructed",  " and no ", isCtor ? "default constructor" : "destructor", " found" );
+							emit( "in ", CodeGen::genType( function->get_functionType(), function->get_name(), false ), ", field ", field->get_name(), " not explicitly ", isCtor ? "constructed" : "destructed",  " and no ", isCtor ? "default constructor" : "destructor", " found" );
 						}
 					}
