Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision d20a3438750cae4921b6136971494220a78c44ca)
+++ src/Tuples/TupleExpansion.cc	(revision aee472e006d2234bbe00d4ed41506f8d49ab1e0f)
@@ -30,4 +30,5 @@
 #include "SynTree/Type.h"         // for Type, Type::Qualifiers, TupleType
 #include "SynTree/Visitor.h"      // for Visitor
+#include "Tuples.h"
 
 class CompoundStmt;
@@ -128,7 +129,5 @@
 			Expression * aggr = memberExpr->aggregate->clone()->acceptMutator( *visitor );
 			// aggregate expressions which might be impure must be wrapped in unique expressions
-			// xxx - if there's a member-tuple expression nested in the aggregate, this currently generates the wrong code if a UniqueExpr is not used, and it's purely an optimization to remove the UniqueExpr
-			// if ( Tuples::maybeImpureIgnoreUnique( memberExpr->get_aggregate() ) ) aggr = new UniqueExpr( aggr );
-			aggr = new UniqueExpr( aggr );
+			if ( Tuples::maybeImpureIgnoreUnique( memberExpr->aggregate ) ) aggr = new UniqueExpr( aggr );
 			for ( Expression *& expr : tupleExpr->exprs ) {
 				expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
@@ -235,4 +234,17 @@
 		delete tupleExpr;
 
+		if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * > ( tuple ) ) {
+			if ( ! maybeImpureIgnoreUnique( tupleExpr ) ) {
+				// optimization: definitely pure tuple expr => can reduce to the only relevant component.
+				assert( tupleExpr->exprs.size() > idx );
+				Expression *& expr = *std::next(tupleExpr->exprs.begin(), idx);
+				Expression * ret = expr;
+				ret->env = env;
+				expr = nullptr; // remove from list so it can safely be deleted
+				delete tupleExpr;
+				return ret;
+			}
+		}
+
 		StructInstType * type = strict_dynamic_cast< StructInstType * >( tuple->result );
 		StructDecl * structDecl = type->baseStruct;
