Index: src/ResolvExpr/Alternative.cc
===================================================================
--- src/ResolvExpr/Alternative.cc	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
+++ src/ResolvExpr/Alternative.cc	(revision f6f0cca3f172613989f420c40761026fe191b651)
@@ -37,4 +37,16 @@
 	Alternative::Alternative( Expression *expr, const TypeEnvironment &env, const Cost& cost, const Cost &cvtCost )
 		: cost( cost ), cvtCost( cvtCost ), expr( expr ), env( env ) {}
+	
+	Alternative::Alternative( const Alternative& o )
+		: cost( o.cost ), cvtCost( o.cvtCost ), expr( maybeClone( o.expr ) ), env( o.env ) {}
+	
+	Alternative & Alternative::operator= ( const Alternative& o ) {
+		if ( &o == this ) return *this;
+		cost = o.cost;
+		cvtCost = o.cvtCost;
+		expr = maybeClone( o.expr );
+		env = o.env;
+		return *this;
+	}
 
 	void Alternative::print( std::ostream &os, Indenter indent ) const {
Index: src/ResolvExpr/Alternative.h
===================================================================
--- src/ResolvExpr/Alternative.h	(revision 1cdfa82ab4efb64ed6273f4e8e3993bc8895a419)
+++ src/ResolvExpr/Alternative.h	(revision f6f0cca3f172613989f420c40761026fe191b651)
@@ -31,6 +31,8 @@
 		Alternative( Expression *expr, const TypeEnvironment &env, const Cost &cost );
 		Alternative( Expression *expr, const TypeEnvironment &env, const Cost &cost, const Cost &cvtCost );
-		Alternative( const Alternative &other ) = default;
-		Alternative &operator=( const Alternative &other ) = default;
+		Alternative( const Alternative &other );
+		Alternative & operator= ( const Alternative &other );
+		Alternative( Alternative&& other ) = default;
+		Alternative & operator= ( Alternative&& other ) = default;
 
 		void print( std::ostream &os, Indenter indent = {} ) const;
