Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision 68fe077a5764a46debddf5a5dc89ef3614748ccd)
+++ src/Tuples/TupleExpansion.cc	(revision 64ac636b5de5a469279d560f5378e5e32e271eec)
@@ -126,11 +126,12 @@
 		/// given a expression representing the member and an expression representing the aggregate,
 		/// reconstructs a flattened UntypedMemberExpr with the right precedence
-		Expression * reconstructMemberExpr( Expression * member, Expression * aggr ) {
+		Expression * reconstructMemberExpr( Expression * member, Expression * aggr, CodeLocation & loc ) {
 			if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * >( member ) ) {
 				// construct a new UntypedMemberExpr with the correct structure , and recursively
 				// expand that member expression.
 				MemberTupleExpander expander;
-				UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() ) );
-
+				UntypedMemberExpr * inner = new UntypedMemberExpr( memberExpr->get_aggregate(), aggr->clone() );
+				UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member(), inner );
+				inner->location = newMemberExpr->location = loc;
 				memberExpr->set_member(nullptr);
 				memberExpr->set_aggregate(nullptr);
@@ -139,5 +140,7 @@
 			} else {
 				// not a member expression, so there is nothing to do but attach and return
-				return new UntypedMemberExpr( member, aggr->clone() );
+				UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( member, aggr->clone() );
+				newMemberExpr->location = loc;
+				return newMemberExpr;
 			}
 		}
@@ -152,12 +155,16 @@
 			aggr = new UniqueExpr( aggr );
 			for ( Expression *& expr : tupleExpr->get_exprs() ) {
-				expr = reconstructMemberExpr( expr, aggr );
+				expr = reconstructMemberExpr( expr, aggr, memberExpr->location );
+				expr->location = memberExpr->location;
 			}
 			delete aggr;
+			tupleExpr->location = memberExpr->location;
 			return tupleExpr;
 		} else {
 			// there may be a tuple expr buried in the aggregate
 			// xxx - this is a memory leak
-			return new UntypedMemberExpr( memberExpr->get_member()->clone(), memberExpr->get_aggregate()->acceptMutator( *this ) );
+			UntypedMemberExpr * newMemberExpr = new UntypedMemberExpr( memberExpr->get_member()->clone(), memberExpr->get_aggregate()->acceptMutator( *this ) );
+			newMemberExpr->location = memberExpr->location;
+			return newMemberExpr;
 		}
 	}
