Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 23bb1b935afeee154439a3a5065ccd588e7c946e)
+++ src/SynTree/Expression.cc	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
@@ -609,23 +609,18 @@
 
 long long UniqueExpr::count = 0;
-UniqueExpr::UniqueExpr( Expression *expr, long long idVal ) : expr( new Expression* ), object( new ObjectDecl* ), id( idVal ) {
+UniqueExpr::UniqueExpr( Expression *expr, long long idVal ) : expr( expr ), object( nullptr ), var( nullptr ), id( idVal ) {
+	assert( expr );
 	assert( count != -1 );
 	if ( id == -1 ) id = count++;
-	set_expr( expr );
-	assert( expr );
 	if ( expr->get_result() ) {
 		set_result( expr->get_result()->clone() );
 	}
-	set_object( nullptr );
-}
-UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ), object( other.object ), id( other.id ) {
+}
+UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( maybeClone( other.expr ) ), object( maybeClone( other.object ) ), var( maybeClone( other.var ) ), id( other.id ) {
 }
 UniqueExpr::~UniqueExpr() {
-	if ( expr.unique() ) {
-		delete *expr;
-	}
-	if ( object.unique() ) {
-		delete *object;
-	}
+	delete expr;
+	delete object;
+	delete var;
 }
 void UniqueExpr::print( std::ostream &os, int indent ) const {
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 23bb1b935afeee154439a3a5065ccd588e7c946e)
+++ src/SynTree/Expression.h	(revision 141b7868c72c7947affae41e61e4bfcd7f9c6652)
@@ -742,9 +742,12 @@
 	~UniqueExpr();
 
-	Expression * get_expr() const { return *expr; }
-	UniqueExpr * set_expr( Expression * newValue ) { *expr = newValue; return this; }
-
-	ObjectDecl * get_object() const { return *object; }
-	UniqueExpr * set_object( ObjectDecl * newValue ) { *object = newValue; return this; }
+	Expression * get_expr() const { return expr; }
+	UniqueExpr * set_expr( Expression * newValue ) { expr = newValue; return this; }
+
+	ObjectDecl * get_object() const { return object; }
+	UniqueExpr * set_object( ObjectDecl * newValue ) { object = newValue; return this; }
+
+	VariableExpr * get_var() const { return var; }
+	UniqueExpr * set_var( VariableExpr * newValue ) { var = newValue; return this; }
 
 	int get_id() const { return id; }
@@ -755,6 +758,7 @@
 	virtual void print( std::ostream &os, int indent = 0 ) const;
 private:
-	std::shared_ptr< Expression * > expr;
-	std::shared_ptr< ObjectDecl * > object;
+	Expression * expr;
+	ObjectDecl * object;
+	VariableExpr * var;
 	int id;
 	static long long count;
