Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision c468150098b8a4da2737fa32e27d1f9bf6a0c179)
+++ src/AST/Pass.impl.hpp	(revision fac05b31ae7c455b2839ef9d67643f124ca1a48e)
@@ -2042,5 +2042,4 @@
 	if ( __visit_children() ) {
 		maybe_accept( node, &TupleType::types );
-		maybe_accept( node, &TupleType::members );
 	}
 
Index: src/AST/Type.cpp
===================================================================
--- src/AST/Type.cpp	(revision c468150098b8a4da2737fa32e27d1f9bf6a0c179)
+++ src/AST/Type.cpp	(revision fac05b31ae7c455b2839ef9d67643f124ca1a48e)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 13 15:00:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Nov 24  9:49:00 2022
-// Update Count     : 6
+// Last Modified On : Thu Apr  6 15:59:00 2023
+// Update Count     : 7
 //
 
@@ -199,23 +199,5 @@
 
 TupleType::TupleType( std::vector<ptr<Type>> && ts, CV::Qualifiers q )
-: Type( q ), types( std::move(ts) ), members() {
-	// This constructor is awkward. `TupleType` needs to contain objects so that members can be
-	// named, but members without initializer nodes end up getting constructors, which breaks
-	// things. This happens because the object decls have to be visited so that their types are
-	// kept in sync with the types listed here. Ultimately, the types listed here should perhaps
-	// be eliminated and replaced with a list-view over members. The temporary solution is to
-	// make a `ListInit` with `maybeConstructed = false`, so when the object is visited it is not
-	// constructed. Potential better solutions include:
-	//   a) Separate `TupleType` from its declarations, into `TupleDecl` and `Tuple{Inst?}Type`,
-	//      similar to the aggregate types.
-	//   b) Separate initializer nodes better, e.g. add a `MaybeConstructed` node that is replaced
-	//      by `genInit`, rather than the current boolean flag.
-	members.reserve( types.size() );
-	for ( const Type * ty : types ) {
-		members.emplace_back( new ObjectDecl{
-			CodeLocation(), "", ty, new ListInit( CodeLocation(), {}, {}, NoConstruct ),
-			Storage::Classes{}, Linkage::Cforall } );
-	}
-}
+: Type( q ), types( std::move(ts) ) {}
 
 bool isUnboundType(const Type * type) {
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision c468150098b8a4da2737fa32e27d1f9bf6a0c179)
+++ src/AST/Type.hpp	(revision fac05b31ae7c455b2839ef9d67643f124ca1a48e)
@@ -10,6 +10,6 @@
 // Created On       : Thu May 9 10:00:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Nov 24  9:47:00 2022
-// Update Count     : 8
+// Last Modified On : Thu Apr  6 15:58:00 2023
+// Update Count     : 9
 //
 
@@ -457,5 +457,4 @@
 public:
 	std::vector<ptr<Type>> types;
-	std::vector<ptr<Decl>> members;
 
 	TupleType( std::vector<ptr<Type>> && ts, CV::Qualifiers q = {} );
Index: src/ResolvExpr/CurrentObject.cc
===================================================================
--- src/ResolvExpr/CurrentObject.cc	(revision c468150098b8a4da2737fa32e27d1f9bf6a0c179)
+++ src/ResolvExpr/CurrentObject.cc	(revision fac05b31ae7c455b2839ef9d67643f124ca1a48e)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jun 13 15:28:32 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jul  1 09:16:01 2022
-// Update Count     : 15
+// Last Modified On : Thu Apr  6 16:03:00 2023
+// Update Count     : 16
 //
 
@@ -899,9 +899,33 @@
 
 	class TupleIterator final : public AggregateIterator {
+		MemberList * memberList;
+
+		TupleIterator( const CodeLocation & loc,
+			const ast::TupleType * inst, MemberList * memberList )
+		: AggregateIterator(
+			loc, "TupleIterator", toString("Tuple", inst->size()), inst, *memberList
+		), memberList( memberList ) {}
+
+		// The two layer constructor, this helper and the destructor
+		// are all to pretend that Tuples have members (they do not).
+		static MemberList * newImaginaryMembers( const ast::TupleType * inst ) {
+			auto ret = new MemberList();
+			ret->reserve( inst->types.size() );
+			for ( const ast::Type * type : inst->types ) {
+				ret->emplace_back( new ast::ObjectDecl(
+					CodeLocation(), "", type,
+					new ast::ListInit( CodeLocation(), {}, {}, ast::NoConstruct )
+				) );
+			}
+			return ret;
+		}
+
 	public:
 		TupleIterator( const CodeLocation & loc, const TupleType * inst )
-		: AggregateIterator(
-			loc, "TupleIterator", toString("Tuple", inst->size()), inst, inst->members
-		) {}
+		: TupleIterator( loc, inst, newImaginaryMembers( inst ) ) {}
+
+		virtual ~TupleIterator() {
+			delete memberList;
+		}
 
 		operator bool() const override {
