Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision ddbde341505b2fb04a0b5e0bb7d30a38fe431ded)
+++ src/CodeGen/CodeGenerator.h	(revision a28bc028a8ac17aa6424a10e57bb2666529c0306)
@@ -76,4 +76,5 @@
 		virtual void visit( UntypedTupleExpr *tupleExpr );
 		virtual void visit( TupleExpr *tupleExpr );
+		virtual void visit( TupleIndexExpr * tupleExpr );
 		virtual void visit( TypeExpr *typeExpr );
 		virtual void visit( AsmExpr * );
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision ddbde341505b2fb04a0b5e0bb7d30a38fe431ded)
+++ src/GenPoly/Box.cc	(revision a28bc028a8ac17aa6424a10e57bb2666529c0306)
@@ -1298,5 +1298,5 @@
 			FunctionType * ftype = functionDecl->get_functionType();
 			if ( ! ftype->get_returnVals().empty() && functionDecl->get_statements() ) {
-				if ( functionDecl->get_name() != "?=?" && ! isPrefix( functionDecl->get_name(), "_thunk" ) && ! isPrefix( functionDecl->get_name(), "_adapter" ) ) { // xxx - remove check for ?=? once reference types are in; remove check for prefix once thunks properly use ctor/dtors
+				if ( ! isPrefix( functionDecl->get_name(), "_thunk" ) && ! isPrefix( functionDecl->get_name(), "_adapter" ) ) { // xxx - remove check for prefix once thunks properly use ctor/dtors
 					assert( ftype->get_returnVals().size() == 1 );
 					DeclarationWithType * retval = ftype->get_returnVals().front();
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision ddbde341505b2fb04a0b5e0bb7d30a38fe431ded)
+++ 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 ddbde341505b2fb04a0b5e0bb7d30a38fe431ded)
+++ 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() );
