Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 08da53dc33a9524abd5a449278fcad633ee0261c)
+++ src/InitTweak/GenInit.cc	(revision bd7e60918ad2d7fa73046569632b064782dac72e)
@@ -129,9 +129,14 @@
 		// hands off if the function returns a reference - we don't want to allocate a temporary if a variable's address
 		// is being returned
-		if ( returnStmt->get_expr() && returnVals.size() == 1 && isConstructable( returnVals.front()->get_type() ) ) {
+		if ( returnStmt->expr && returnVals.size() == 1 && isConstructable( returnVals.front()->get_type() ) ) {
 			// 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() );
 
-			stmtsToAddBefore.push_back( genCtorDtor( "?{}", dynamic_cast< ObjectDecl *>( returnVals.front() ), returnStmt->get_expr() ) );
+			ObjectDecl * retVal = strict_dynamic_cast< ObjectDecl * >( returnVals.front() );
+			if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( returnStmt->expr ) ) {
+				// return statement has already been mutated - don't need to do it again
+				if ( varExpr->var == retVal ) return;
+			}
+			stmtsToAddBefore.push_back( genCtorDtor( "?{}", retVal, returnStmt->get_expr() ) );
 
 			// return the retVal object
