Index: src/SynTree/ApplicationExpr.cc
===================================================================
--- src/SynTree/ApplicationExpr.cc	(revision 3ef35bd884d4a41b6dc4f4a4a2243f1e96843a20)
+++ src/SynTree/ApplicationExpr.cc	(revision cdc4d434eaa8d5b4aeaf69a97a56f029f675cd09)
@@ -42,4 +42,24 @@
 }
 
+ParamEntry::ParamEntry( ParamEntry && other ) :
+		decl( other.decl ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr ), inferParams( std::move( other.inferParams ) ) {
+	other.actualType = nullptr;
+	other.formalType = nullptr;
+	other.expr = nullptr;
+}
+
+ParamEntry & ParamEntry::operator=( ParamEntry && other ) {
+	if ( &other == this ) return *this;
+	decl = other.decl;
+	actualType = other.actualType;
+	formalType = other.formalType;
+	expr = other.expr;
+	other.actualType = nullptr;
+	other.formalType = nullptr;
+	other.expr = nullptr;
+	inferParams = std::move( other.inferParams );
+	return *this;
+}
+
 ApplicationExpr::ApplicationExpr( Expression *funcExpr, const std::list<Expression *> & args ) : function( funcExpr ), args( args ) {
 	PointerType *pointer = strict_dynamic_cast< PointerType* >( funcExpr->get_result() );
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 3ef35bd884d4a41b6dc4f4a4a2243f1e96843a20)
+++ src/SynTree/Expression.cc	(revision cdc4d434eaa8d5b4aeaf69a97a56f029f675cd09)
@@ -50,4 +50,11 @@
 }
 
+void Expression::spliceInferParams( Expression * other ) {
+	if ( ! other ) return;
+	for ( auto p : other->inferParams ) {
+		inferParams[p.first] = std::move( p.second );
+	}
+}
+
 Expression::~Expression() {
 	delete env;
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 3ef35bd884d4a41b6dc4f4a4a2243f1e96843a20)
+++ src/SynTree/Expression.h	(revision cdc4d434eaa8d5b4aeaf69a97a56f029f675cd09)
@@ -41,5 +41,7 @@
 	ParamEntry( UniqueId decl, Type * actualType, Type * formalType, Expression* expr ): decl( decl ), actualType( actualType ), formalType( formalType ), expr( expr ), inferParams( new InferredParams ) {}
 	ParamEntry( const ParamEntry & other );
+	ParamEntry( ParamEntry&& other );
 	ParamEntry & operator=( const ParamEntry & other );
+	ParamEntry & operator=( ParamEntry && other );
 
 	UniqueId decl;
@@ -74,4 +76,7 @@
 
 	InferredParams & get_inferParams() { return inferParams; }
+
+	// move other's inferParams to this
+	void spliceInferParams( Expression * other );
 
 	virtual Expression * clone() const override = 0;
