Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision a4dd72844fbd2a790eb51b8a99662f3f01225fd7)
+++ src/InitTweak/FixInit.cc	(revision a28bc028a8ac17aa6424a10e57bb2666529c0306)
@@ -361,5 +361,5 @@
 					FunctionType * ftype = dynamic_cast< FunctionType * >( GenPoly::getFunctionType( funcDecl->get_type() ) );
 					assert( ftype );
-					if ( (isConstructor( funcDecl->get_name() ) || funcDecl->get_name() == "?=?") && ftype->get_parameters().size() == 2 ) {
+					if ( isConstructor( funcDecl->get_name() ) && ftype->get_parameters().size() == 2 ) {
 						Type * t1 = ftype->get_parameters().front()->get_type();
 						Type * t2 = ftype->get_parameters().back()->get_type();
@@ -367,6 +367,5 @@
 
 						if ( ResolvExpr::typesCompatible( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
-							// optimization: don't need to copy construct in order to call a copy constructor or
-							// assignment operator
+							// optimization: don't need to copy construct in order to call a copy constructor
 							return appExpr;
 						} // if
@@ -636,7 +635,9 @@
 				assert( ! stmtExpr->get_returnDecls().empty() );
 				body->get_kids().push_back( new ExprStmt( noLabels, new VariableExpr( stmtExpr->get_returnDecls().front() ) ) );
-			}
-			stmtExpr->get_returnDecls().clear();
-			stmtExpr->get_dtors().clear();
+				stmtExpr->get_returnDecls().clear();
+				stmtExpr->get_dtors().clear();
+			}
+			assert( stmtExpr->get_returnDecls().empty() );
+			assert( stmtExpr->get_dtors().empty() );
 			return stmtExpr;
 		}
@@ -667,4 +668,9 @@
 			stmtsToAdd.splice( stmtsToAdd.end(), fixer.stmtsToAdd );
 			unqMap[unqExpr->get_id()] = unqExpr;
+			if ( unqCount[ unqExpr->get_id() ] == 0 ) {  // insert destructor after the last use of the unique expression
+				stmtsToAdd.splice( stmtsToAddAfter.end(), dtors[ unqExpr->get_id() ] );
+			} else { // remember dtors for last instance of unique expr
+				dtors[ unqExpr->get_id() ] = fixer.stmtsToAddAfter;
+			}
 			if ( UntypedExpr * deref = dynamic_cast< UntypedExpr * >( unqExpr->get_expr() ) ) {
 				// unique expression is now a dereference, because the inner expression is an lvalue returning function call.
@@ -675,9 +681,4 @@
 				getCallArg( deref, 0 ) = unqExpr;
 				addDeref.insert( unqExpr->get_id() );
-				if ( unqCount[ unqExpr->get_id() ] == 0 ) {  // insert destructor after the last use of the unique expression
-					stmtsToAdd.splice( stmtsToAddAfter.end(), dtors[ unqExpr->get_id() ] );
-				} else { // remember dtors for last instance of unique expr
-					dtors[ unqExpr->get_id() ] = fixer.stmtsToAddAfter;
-				}
 				return deref;
 			}
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision a4dd72844fbd2a790eb51b8a99662f3f01225fd7)
+++ src/InitTweak/GenInit.cc	(revision a28bc028a8ac17aa6424a10e57bb2666529c0306)
@@ -142,6 +142,5 @@
 		// hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address
 		// is being returned
-		// Note: under the assumption that assignments return *this, checking for ?=? here is an optimization, since it shouldn't be necessary to copy construct `this`. This is a temporary optimization until reference types are added, at which point this should be removed, along with the analogous optimization in copy constructor generation.
-		if ( returnStmt->get_expr() && returnVals.size() == 1 && funcName != "?=?" && ! returnVals.front()->get_type()->get_lvalue() ) {
+		if ( returnStmt->get_expr() && returnVals.size() == 1 && ! returnVals.front()->get_type()->get_lvalue() ) {
 			// explicitly construct the return value using the return expression and the retVal object
 			assertf( returnVals.front()->get_name() != "", "Function %s has unnamed return value\n", funcName.c_str() );
