Index: src/SynTree/ApplicationExpr.cc
===================================================================
--- src/SynTree/ApplicationExpr.cc	(revision aaeacf4b17e26df880b846210c264be0d6cc771b)
+++ src/SynTree/ApplicationExpr.cc	(revision 462a7c71b73f09a9b66be205a97e657e38d1196c)
@@ -28,18 +28,10 @@
 #include "Type.h"                // for Type, PointerType, FunctionType
 
+ParamEntry::ParamEntry( UniqueId decl, Declaration * declptr, Type * actualType, Type * formalType, Expression* expr )
+		: decl( decl ), declptr( declptr ), actualType( actualType ), formalType( formalType ), expr( expr ) {
+	}
+
 ParamEntry::ParamEntry( const ParamEntry &other ) :
-		decl( other.decl ), declptr( maybeClone( other.declptr ) ), actualType( maybeClone( other.actualType ) ), formalType( maybeClone( other.formalType ) ), expr( maybeClone( other.expr ) )/*, inferParams( new InferredParams( *other.inferParams ) )*/ {
-}
-
-ParamEntry &ParamEntry::operator=( const ParamEntry &other ) {
-	if ( &other == this ) return *this;
-	const_cast<UniqueId &>(decl) = other.decl;
-	const_cast<Declaration * &>(declptr) = maybeClone( other.declptr );
-	// xxx - this looks like a memory leak
-	const_cast<Type * &>(actualType) = maybeClone( other.actualType );
-	const_cast<Type * &>(formalType) = maybeClone( other.formalType );
-	expr = maybeClone( other.expr );
-	// *inferParams = *other.inferParams;
-	return *this;
+		decl( other.decl ), declptr( maybeClone( other.declptr ) ), actualType( maybeClone( other.actualType ) ), formalType( maybeClone( other.formalType ) ), expr( maybeClone( other.expr ) ) {
 }
 
@@ -52,27 +44,14 @@
 
 ParamEntry::ParamEntry( ParamEntry && other ) :
-		decl( other.decl ), declptr( other.declptr ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr )/*, inferParams( std::move( other.inferParams ) )*/ {
-	const_cast<Declaration * &>(other.declptr) = nullptr;
-	const_cast<Type * &>(other.actualType) = nullptr;
-	const_cast<Type * &>(other.formalType) = nullptr;
-	other.expr = nullptr;
+		decl( other.decl ), declptr( other.declptr ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr ) {
+	new (&other) ParamEntry();
 }
 
 ParamEntry & ParamEntry::operator=( ParamEntry && other ) {
 	if ( &other == this ) return *this;
-	delete declptr;
-	delete actualType;
-	delete formalType;
-	delete expr;
-	const_cast<UniqueId &>(decl) = other.decl;
-	const_cast<Declaration * &>(declptr) = other.declptr;
-	const_cast<Type * &>(actualType) = other.actualType;
-	const_cast<Type * &>(formalType) = other.formalType;
-	expr = other.expr;
-	const_cast<Declaration * &>(other.declptr) = nullptr;
-	const_cast<Type * &>(other.actualType) = nullptr;
-	const_cast<Type * &>(other.formalType) = nullptr;
-	other.expr = nullptr;
-	// inferParams = std::move( other.inferParams );
+	this->~ParamEntry();
+	new (this) ParamEntry(other.decl, other.declptr, other.actualType, other.formalType, other.expr);
+	new (&other) ParamEntry();
+
 	return *this;
 }
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision aaeacf4b17e26df880b846210c264be0d6cc771b)
+++ src/SynTree/Expression.h	(revision 462a7c71b73f09a9b66be205a97e657e38d1196c)
@@ -39,12 +39,9 @@
 /// but subject to decay-to-pointer and type parameter renaming
 struct ParamEntry {
-	ParamEntry(): decl( 0 ), declptr(nullptr), actualType( 0 ), formalType( 0 ), expr( 0 )/*, inferParams( new InferredParams )*/ {}
-	ParamEntry( UniqueId decl, Declaration * declptr, Type * actualType, Type * formalType, Expression* expr )
-		: decl( decl ), declptr( declptr ), actualType( actualType ), formalType( formalType ), expr( expr )/*, inferParams( new InferredParams )*/ {
-	}
+	ParamEntry(): decl( 0 ), declptr( nullptr ), actualType( nullptr ), formalType( nullptr ), expr( nullptr ) {}
+	ParamEntry( UniqueId decl, Declaration * declptr, Type * actualType, Type * formalType, Expression* expr );
 	ParamEntry( const ParamEntry & other );
 	ParamEntry( ParamEntry && other );
 	~ParamEntry();
-	ParamEntry & operator=( const ParamEntry & other );
 	ParamEntry & operator=( ParamEntry && other );
 
@@ -54,5 +51,4 @@
 	Type * const formalType;
 	Expression * expr;
-	// std::unique_ptr< InferredParams > inferParams;
 };
 
