Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 1132b62939ee72e624dd65d3bacb0e67cb1a0347)
+++ src/SynTree/Expression.h	(revision 65660bd065cbc0b68c92db2425b5984d675dff58)
@@ -696,5 +696,5 @@
 };
 
-/// TupleAssignExpr represents a multiple assignment operation, where both sides of the assignment have tuple type, e.g. [a, b, c] = [d, e, f];, or a mass assignment operation, where the left hand side has tuple type and the right hand side does not, e.g. [a, b, c] = 5.0;
+/// TupleAssignExpr represents a multiple assignment operation, where both sides of the assignment have tuple type, e.g. [a, b, c] = [d, e, f];, a mass assignment operation, where the left hand side has tuple type and the right hand side does not, e.g. [a, b, c] = 5.0;, or a tuple ctor/dtor expression
 class TupleAssignExpr : public Expression {
   public:
Index: src/SynTree/TupleExpr.cc
===================================================================
--- src/SynTree/TupleExpr.cc	(revision 1132b62939ee72e624dd65d3bacb0e67cb1a0347)
+++ src/SynTree/TupleExpr.cc	(revision 65660bd065cbc0b68c92db2425b5984d675dff58)
@@ -88,10 +88,5 @@
 
 TupleAssignExpr::TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname ) : Expression( _aname ), assigns( assigns ), tempDecls( tempDecls ) {
-	TupleType * type = new TupleType( Type::Qualifiers() );
-	for ( Expression * expr : assigns ) {
-		assert( expr->has_result() );
-		type->get_types().push_back( expr->get_result()->clone() );
-	}
-	set_result( type );
+	set_result( Tuples::makeTupleType( assigns ) );
 }
 
