Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 80a7d48799fc4a072133fdd163de97b6228345d6)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 8a1289fd023271a69d12e542e9e6b150d99e2c6a)
@@ -338,5 +338,5 @@
 			if ( ss >> val && ! (ss >> tmp) ) {
 				if ( val >= 0 && (unsigned int)val < tupleType->size() ) {
-					alternatives.push_back( Alternative( new TupleIndexExpr( expr->clone(), val ), env, newCost ) );
+					alternatives.push_back( Alternative( new TupleIndexExpr( expr, val ), env, newCost ) );
 				} // if
 			} // if
@@ -347,5 +347,5 @@
 				int val;
 				ss >> val;
-				alternatives.push_back( Alternative( new TupleIndexExpr( expr->clone(), val ), env, newCost ) );
+				alternatives.push_back( Alternative( new TupleIndexExpr( expr, val ), env, newCost ) );
 			}
 		} // if
@@ -353,5 +353,5 @@
 
 	void AlternativeFinder::Finder::postvisit( ApplicationExpr *applicationExpr ) {
-		alternatives.push_back( Alternative( applicationExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( applicationExpr, env, Cost::zero ) );
 	}
 
@@ -664,5 +664,5 @@
 			while ( pack->tupleStart == 0 ) {
 				pack = &packs[pack->parent];
-				exprs.push_front( pack->expr->clone() );
+				exprs.push_front( pack->expr );
 				cost += pack->cost;
 			}
@@ -749,5 +749,5 @@
 							newResult.cost = results[i].cost;
 							newResult.tupleStart = results[i].tupleStart;
-							newResult.expr = results[i].expr->clone();
+							newResult.expr = results[i].expr;
 							argType = newResult.expr->get_result();
 
@@ -1219,5 +1219,5 @@
 			if ( isLvalue( alt.expr ) ) {
 				alternatives.push_back(
-					Alternative{ new AddressExpr( alt.expr->clone() ), alt.env, alt.cost } );
+					Alternative{ new AddressExpr( alt.expr ), alt.env, alt.cost } );
 			} // if
 		} // for
@@ -1225,5 +1225,5 @@
 
 	void AlternativeFinder::Finder::postvisit( LabelAddressExpr * expr ) {
-		alternatives.push_back( Alternative{ expr->clone(), env, Cost::zero } );
+		alternatives.push_back( Alternative{ expr, env, Cost::zero } );
 	}
 
@@ -1320,5 +1320,5 @@
 		for ( Alternative & alt : finder.alternatives ) {
 			alternatives.push_back( Alternative(
-				new VirtualCastExpr( alt.expr->clone(), castExpr->get_result()->clone() ),
+				new VirtualCastExpr( alt.expr, castExpr->get_result()->clone() ),
 				alt.env, alt.cost ) );
 		}
@@ -1355,5 +1355,5 @@
 
 	void AlternativeFinder::Finder::postvisit( MemberExpr *memberExpr ) {
-		alternatives.push_back( Alternative( memberExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( memberExpr, env, Cost::zero ) );
 	}
 
@@ -1386,5 +1386,5 @@
 
 	void AlternativeFinder::Finder::postvisit( ConstantExpr *constantExpr ) {
-		alternatives.push_back( Alternative( constantExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( constantExpr, env, Cost::zero ) );
 	}
 
@@ -1406,5 +1406,5 @@
 			Alternative &choice = winners.front();
 			referenceToRvalueConversion( choice.expr, choice.cost );
-			alternatives.push_back( Alternative( new SizeofExpr( choice.expr->clone() ), choice.env, Cost::zero ) );
+			alternatives.push_back( Alternative( new SizeofExpr( choice.expr ), choice.env, Cost::zero ) );
 		} // if
 	}
@@ -1427,5 +1427,5 @@
 			Alternative &choice = winners.front();
 			referenceToRvalueConversion( choice.expr, choice.cost );
-			alternatives.push_back( Alternative( new AlignofExpr( choice.expr->clone() ), choice.env, Cost::zero ) );
+			alternatives.push_back( Alternative( new AlignofExpr( choice.expr ), choice.env, Cost::zero ) );
 		} // if
 	}
@@ -1456,9 +1456,9 @@
 
 	void AlternativeFinder::Finder::postvisit( OffsetofExpr *offsetofExpr ) {
-		alternatives.push_back( Alternative( offsetofExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( offsetofExpr, env, Cost::zero ) );
 	}
 
 	void AlternativeFinder::Finder::postvisit( OffsetPackExpr *offsetPackExpr ) {
-		alternatives.push_back( Alternative( offsetPackExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( offsetPackExpr, env, Cost::zero ) );
 	}
 
@@ -1538,5 +1538,5 @@
 				compositeEnv.simpleCombine( second.env );
 
-				LogicalExpr *newExpr = new LogicalExpr( first.expr->clone(), second.expr->clone(), logicalExpr->get_isAnd() );
+				LogicalExpr *newExpr = new LogicalExpr( first.expr, second.expr, logicalExpr->get_isAnd() );
 				alternatives.push_back( Alternative( newExpr, compositeEnv, first.cost + second.cost ) );
 			}
@@ -1571,5 +1571,5 @@
 					Type* commonType = nullptr;
 					if ( unify( second.expr->result, third.expr->result, newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) {
-						ConditionalExpr *newExpr = new ConditionalExpr( first.expr->clone(), second.expr->clone(), third.expr->clone() );
+						ConditionalExpr *newExpr = new ConditionalExpr( first.expr, second.expr, third.expr );
 						newExpr->result = commonType ? commonType : second.expr->result->clone();
 						// convert both options to the conditional result type
@@ -1590,5 +1590,5 @@
 		secondFinder.findWithAdjustment( commaExpr->get_arg2() );
 		for ( const Alternative & alt : secondFinder.alternatives ) {
-			alternatives.push_back( Alternative( new CommaExpr( newFirstArg->clone(), alt.expr->clone() ), alt.env, alt.cost ) );
+			alternatives.push_back( Alternative( new CommaExpr( newFirstArg, alt.expr ), alt.env, alt.cost ) );
 		} // for
 	}
@@ -1612,5 +1612,5 @@
 				Type* commonType = nullptr;
 				if ( unify( first.expr->result, second.expr->result, newAlt.env, needAssertions, haveAssertions, openVars, indexer, commonType ) ) {
-					RangeExpr * newExpr = new RangeExpr( first.expr->clone(), second.expr->clone() );
+					RangeExpr * newExpr = new RangeExpr( first.expr, second.expr );
 					newExpr->result = commonType ? commonType : first.expr->result->clone();
 					newAlt.expr = newExpr;
@@ -1640,9 +1640,9 @@
 
 	void AlternativeFinder::Finder::postvisit( TupleExpr *tupleExpr ) {
-		alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( tupleExpr, env, Cost::zero ) );
 	}
 
 	void AlternativeFinder::Finder::postvisit( ImplicitCopyCtorExpr * impCpCtorExpr ) {
-		alternatives.push_back( Alternative( impCpCtorExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( impCpCtorExpr, env, Cost::zero ) );
 	}
 
@@ -1653,14 +1653,14 @@
 		finder.findWithoutPrune( ctorExpr->get_callExpr() );
 		for ( Alternative & alt : finder.alternatives ) {
-			alternatives.push_back( Alternative( new ConstructorExpr( alt.expr->clone() ), alt.env, alt.cost ) );
+			alternatives.push_back( Alternative( new ConstructorExpr( alt.expr ), alt.env, alt.cost ) );
 		}
 	}
 
 	void AlternativeFinder::Finder::postvisit( TupleIndexExpr *tupleExpr ) {
-		alternatives.push_back( Alternative( tupleExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( tupleExpr, env, Cost::zero ) );
 	}
 
 	void AlternativeFinder::Finder::postvisit( TupleAssignExpr *tupleAssignExpr ) {
-		alternatives.push_back( Alternative( tupleAssignExpr->clone(), env, Cost::zero ) );
+		alternatives.push_back( Alternative( tupleAssignExpr, env, Cost::zero ) );
 	}
 
@@ -1670,5 +1670,5 @@
 		for ( Alternative & alt : finder.alternatives ) {
 			// ensure that the id is passed on to the UniqueExpr alternative so that the expressions are "linked"
-			UniqueExpr * newUnqExpr = new UniqueExpr( alt.expr->clone(), unqExpr->get_id() );
+			UniqueExpr * newUnqExpr = new UniqueExpr( alt.expr, unqExpr->get_id() );
 			alternatives.push_back( Alternative( newUnqExpr, alt.env, alt.cost ) );
 		}
@@ -1721,5 +1721,5 @@
 					// count one safe conversion for each value that is thrown away
 					thisCost.incSafe( discardedValues );
-					Alternative newAlt( new InitExpr( restructureCast( alt.expr->clone(), toType, true ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost );
+					Alternative newAlt( new InitExpr( restructureCast( alt.expr, toType, true ), initAlt.designation ), newEnv, alt.cost, thisCost );
 					inferParameters( needAssertions, haveAssertions, newAlt, openVars, back_inserter( candidates ) );
 				}
