Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/CodeGen/CodeGenerator.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -112,14 +112,4 @@
 
 	CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {}
-
-	CodeGenerator::CodeGenerator( std::ostream & os, std::string init, int indentation, bool infunp )
-			: indent( *this), cur_indent( indentation ), insideFunction( infunp ), output( os ), printLabels( *this ) {
-		//output << std::string( init );
-	}
-
-	CodeGenerator::CodeGenerator( std::ostream & os, char * init, int indentation, bool infunp )
-			: indent( *this ), cur_indent( indentation ), insideFunction( infunp ), output( os ), printLabels( *this ) {
-		//output << std::string( init );
-	}
 
 	string CodeGenerator::mangleName( DeclarationWithType * decl ) {
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/Common/PassVisitor.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -90,5 +90,4 @@
 	virtual void visit( TupleExpr *tupleExpr ) override final;
 	virtual void visit( TupleIndexExpr *tupleExpr ) override final;
-	virtual void visit( MemberTupleExpr *tupleExpr ) override final;
 	virtual void visit( TupleAssignExpr *assignExpr ) override final;
 	virtual void visit( StmtExpr * stmtExpr ) override final;
@@ -176,5 +175,4 @@
 	virtual Expression* mutate( TupleExpr *tupleExpr ) override final;
 	virtual Expression* mutate( TupleIndexExpr *tupleExpr ) override final;
-	virtual Expression* mutate( MemberTupleExpr *tupleExpr ) override final;
 	virtual Expression* mutate( TupleAssignExpr *assignExpr ) override final;
 	virtual Expression* mutate( StmtExpr * stmtExpr ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/Common/PassVisitor.impl.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -617,9 +617,4 @@
 
 template< typename pass_type >
-void PassVisitor< pass_type >::visit( MemberTupleExpr * node ) {
-	VISIT_BODY( node ); 
-}
-
-template< typename pass_type >
 void PassVisitor< pass_type >::visit( TupleAssignExpr * node ) {
 	VISIT_BODY( node ); 
@@ -999,9 +994,4 @@
 
 template< typename pass_type >
-Expression * PassVisitor< pass_type >::mutate( MemberTupleExpr * node ) {
-	MUTATE_BODY( Expression, node );
-}
-
-template< typename pass_type >
 Expression * PassVisitor< pass_type >::mutate( TupleAssignExpr * node ) {
 	MUTATE_BODY( Expression, node );
Index: src/Common/PassVisitor.proto.h
===================================================================
--- src/Common/PassVisitor.proto.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/Common/PassVisitor.proto.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -18,5 +18,5 @@
 // Visit
 template<typename pass_type, typename node_type>
-static inline auto previsit_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) ->decltype( pass.previsit( node ), void() ) {
+static inline auto previsit_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) -> decltype( pass.previsit( node ), void() ) {
 	pass.previsit( node );
 }
@@ -27,5 +27,5 @@
 
 template<typename pass_type, typename node_type>
-static inline auto postvisit_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) ->decltype( pass.postvisit( node ), void() ) {
+static inline auto postvisit_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) -> decltype( pass.postvisit( node ), void() ) {
 	pass.postvisit( node );
 }
@@ -36,5 +36,5 @@
 // Mutate
 template<typename pass_type, typename node_type>
-static inline auto premutate_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) ->decltype( pass.premutate( node ), void() ) {
+static inline auto premutate_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) -> decltype( pass.premutate( node ), void() ) {
 	return pass.premutate( node );
 }
@@ -45,5 +45,5 @@
 
 template<typename return_type, typename pass_type, typename node_type>
-static inline auto postmutate_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) ->decltype( pass.postmutate( node ) ) {
+static inline auto postmutate_impl( pass_type& pass, node_type * node, __attribute__((unused)) int unused ) -> decltype( pass.postmutate( node ) ) {
 	return pass.postmutate( node );
 }
@@ -54,5 +54,5 @@
 // Begin/End scope
 template<typename pass_type>
-static inline auto begin_scope_impl( pass_type& pass, __attribute__((unused)) int unused ) ->decltype( pass.beginScope(), void() ) {
+static inline auto begin_scope_impl( pass_type& pass, __attribute__((unused)) int unused ) -> decltype( pass.beginScope(), void() ) {
 	pass.beginScope();
 }
@@ -63,5 +63,5 @@
 
 template<typename pass_type>
-static inline auto end_scope_impl( pass_type& pass, __attribute__((unused)) int unused ) ->decltype( pass.endScope(), void() ) {
+static inline auto end_scope_impl( pass_type& pass, __attribute__((unused)) int unused ) -> decltype( pass.endScope(), void() ) {
 	pass.endScope();
 }
@@ -73,5 +73,5 @@
 #define FIELD_PTR( type, name )                                                                                                        \
 template<typename pass_type>                                                                                                           \
-static inline auto name##_impl( pass_type& pass, __attribute__((unused)) int unused ) ->decltype( &pass.name ) { return &pass.name; }  \
+static inline auto name##_impl( pass_type& pass, __attribute__((unused)) int unused ) -> decltype( &pass.name ) { return &pass.name; }  \
                                                                                                                                        \
 template<typename pass_type>                                                                                                           \
Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/GenPoly/Box.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -110,5 +110,5 @@
 			Type *replaceWithConcrete( ApplicationExpr *appExpr, Type *type, bool doClone = true );
 			/// wraps a function application returning a polymorphic type with a new temporary for the out-parameter return value
-			Expression *addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *polyType, std::list< Expression *>::iterator &arg );
+			Expression *addDynRetParam( ApplicationExpr *appExpr, Type *polyType, std::list< Expression *>::iterator &arg );
 			Expression *applyAdapter( ApplicationExpr *appExpr, FunctionType *function, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars );
 			void boxParam( Type *formal, Expression *&arg, const TyVarMap &exprTyVars );
@@ -728,5 +728,5 @@
 		}
 
-		Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *dynType, std::list< Expression *>::iterator &arg ) {
+		Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, Type *dynType, std::list< Expression *>::iterator &arg ) {
 			assert( env );
 			Type *concrete = replaceWithConcrete( appExpr, dynType );
@@ -1148,5 +1148,5 @@
 			if ( dynRetType ) {
 				Type *concRetType = appExpr->get_result()->isVoid() ? nullptr : appExpr->get_result();
-				ret = addDynRetParam( appExpr, function, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType
+				ret = addDynRetParam( appExpr, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType
 			} else if ( needsAdapter( function, scopeTyVars ) && ! needsAdapter( function, exprTyVars) ) { // xxx - exprTyVars is used above...?
 				// xxx - the ! needsAdapter check may be incorrect. It seems there is some situation where an adapter is applied where it shouldn't be, and this fixes it for some cases. More investigation is needed.
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/GenPoly/Specialize.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -93,5 +93,5 @@
 	}
 
-	bool needsTupleSpecialization( Type *formalType, Type *actualType, TypeSubstitution *env ) {
+	bool needsTupleSpecialization( Type *formalType, Type *actualType ) {
 		// Needs tuple specialization if the structure of the formal type and actual type do not match.
 		// This is the case if the formal type has ttype polymorphism, or if the structure  of tuple types
@@ -112,5 +112,5 @@
 
 	bool needsSpecialization( Type *formalType, Type *actualType, TypeSubstitution *env ) {
-		return needsPolySpecialization( formalType, actualType, env ) || needsTupleSpecialization( formalType, actualType, env );
+		return needsPolySpecialization( formalType, actualType, env ) || needsTupleSpecialization( formalType, actualType );
 	}
 
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/InitTweak/FixInit.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -902,5 +902,5 @@
 		}
 
-		void InsertDtors::visit( ReturnStmt * returnStmt ) {
+		void InsertDtors::visit( __attribute((unused)) ReturnStmt * returnStmt ) {
 			// return exits all scopes, so dump destructors for all scopes
 			for ( OrderedDecls & od : reverseDeclOrder ) {
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/Parser/ExpressionNode.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -223,5 +223,5 @@
 } // build_field_name_REALDECIMALconstant
 
-NameExpr * build_varref( const string *name, bool labelp ) {
+NameExpr * build_varref( const string *name ) {
 	NameExpr *expr = new NameExpr( *name, nullptr );
 	delete name;
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/Parser/ParseNode.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -166,5 +166,5 @@
 Expression * build_field_name_REALDECIMALconstant( const std::string & str );
 
-NameExpr * build_varref( const std::string * name, bool labelp = false );
+NameExpr * build_varref( const std::string * name );
 Expression * build_typevalue( DeclarationNode * decl );
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/Parser/parser.yy	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -547,5 +547,5 @@
 		{ $$ = new ExpressionNode( build_attrtype( build_varref( $1 ), $3 ) ); }
 //	| ANDAND IDENTIFIER									// GCC, address of label
-//		{ $$ = new ExpressionNode( new OperatorNode( OperKinds::LabelAddress ), new ExpressionNode( build_varref( $2, true ) ); }
+//		{ $$ = new ExpressionNode( new OperatorNode( OperKinds::LabelAddress ), new ExpressionNode( build_varref( $2 ) ); }
 	;
 
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -97,5 +97,5 @@
 		/// Prunes a list of alternatives down to those that have the minimum conversion cost for a given return type; skips ambiguous interpretations
 		template< typename InputIterator, typename OutputIterator >
-		void pruneAlternatives( InputIterator begin, InputIterator end, OutputIterator out, const SymTab::Indexer &indexer ) {
+		void pruneAlternatives( InputIterator begin, InputIterator end, OutputIterator out ) {
 			// select the alternatives that have the minimum conversion cost for a particular set of result types
 			std::map< std::string, PruneStruct > selected;
@@ -183,5 +183,5 @@
 			)
 			AltList::iterator oldBegin = alternatives.begin();
-			pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ), indexer );
+			pruneAlternatives( alternatives.begin(), alternatives.end(), front_inserter( alternatives ) );
 			if ( alternatives.begin() == oldBegin ) {
 				std::ostringstream stream;
Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/ResolvExpr/CommonType.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -157,7 +157,7 @@
 	void CommonType::visit( PointerType *pointerType ) {
 		if ( PointerType *otherPointer = dynamic_cast< PointerType* >( type2 ) ) {
-			if ( widenFirst && dynamic_cast< VoidType* >( otherPointer->get_base() ) && ! isFtype(pointerType->get_base(), indexer) ) {
+			if ( widenFirst && dynamic_cast< VoidType* >( otherPointer->get_base() ) && ! isFtype(pointerType->get_base()) ) {
 				getCommonWithVoidPointer( otherPointer, pointerType );
-			} else if ( widenSecond && dynamic_cast< VoidType* >( pointerType->get_base() ) && ! isFtype(otherPointer->get_base(), indexer) ) {
+			} else if ( widenSecond && dynamic_cast< VoidType* >( pointerType->get_base() ) && ! isFtype(otherPointer->get_base()) ) {
 				getCommonWithVoidPointer( pointerType, otherPointer );
 			} else if ( ( pointerType->get_base()->get_qualifiers() >= otherPointer->get_base()->get_qualifiers() || widenFirst )
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/ResolvExpr/Unify.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -114,5 +114,5 @@
 	}
 
-	bool isFtype( Type *type, const SymTab::Indexer &indexer ) {
+	bool isFtype( Type *type ) {
 		if ( dynamic_cast< FunctionType* >( type ) ) {
 			return true;
@@ -123,5 +123,5 @@
 	}
 
-	bool tyVarCompatible( const TypeDecl::Data & data, Type *type, const SymTab::Indexer &indexer ) {
+	bool tyVarCompatible( const TypeDecl::Data & data, Type *type ) {
 		switch ( data.kind ) {
 		  case TypeDecl::Any:
@@ -131,7 +131,7 @@
 			// type must also be complete
 			// xxx - should this also check that type is not a tuple type and that it's not a ttype?
-			return ! isFtype( type, indexer ) && (! data.isComplete || type->isComplete() );
+			return ! isFtype( type ) && (! data.isComplete || type->isComplete() );
 		  case TypeDecl::Ftype:
-			return isFtype( type, indexer );
+			return isFtype( type );
 		  case TypeDecl::Ttype:
 			// ttype unifies with any tuple type
@@ -144,5 +144,5 @@
 		OpenVarSet::const_iterator tyvar = openVars.find( typeInst->get_name() );
 		assert( tyvar != openVars.end() );
-		if ( ! tyVarCompatible( tyvar->second, other, indexer ) ) {
+		if ( ! tyVarCompatible( tyvar->second, other ) ) {
 			return false;
 		} // if
Index: src/ResolvExpr/typeops.h
===================================================================
--- src/ResolvExpr/typeops.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/ResolvExpr/typeops.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -118,5 +118,5 @@
 
 	// in Unify.cc
-	bool isFtype( Type *type, const SymTab::Indexer &indexer );
+	bool isFtype( Type *type );
 	bool typesCompatible( Type *, Type *, const SymTab::Indexer &indexer, const TypeEnvironment &env );
 	bool typesCompatibleIgnoreQualifiers( Type *, Type *, const SymTab::Indexer &indexer, const TypeEnvironment &env );
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SymTab/Autogen.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -262,5 +262,5 @@
 	// E ?=?(E volatile*, int),
 	//   ?=?(E _Atomic volatile*, int);
-	void makeEnumFunctions( EnumDecl *enumDecl, EnumInstType *refType, unsigned int functionNesting, std::list< Declaration * > &declsToAdd ) {
+	void makeEnumFunctions( EnumInstType *refType, unsigned int functionNesting, std::list< Declaration * > &declsToAdd ) {
 
 		// T ?=?(E *, E);
@@ -486,5 +486,5 @@
 
 	/// generates the body of a union assignment/copy constructor/field constructor
-	void makeUnionAssignBody( FunctionDecl * funcDecl, bool isDynamicLayout ) {
+	void makeUnionAssignBody( FunctionDecl * funcDecl ) {
 		FunctionType * ftype = funcDecl->get_functionType();
 		assert( ftype->get_parameters().size() == 2 );
@@ -506,6 +506,5 @@
 		// Make function polymorphic in same parameters as generic union, if applicable
 		const std::list< TypeDecl* > & typeParams = aggregateDecl->get_parameters(); // List of type variables to be placed on the generated functions
-		bool isDynamicLayout = hasDynamicLayout( aggregateDecl );  // NOTE this flag is an incredibly ugly kludge; we should fix the assignment signature instead (ditto for struct)
-
+		
 		// default ctor/dtor need only first parameter
 		// void ?{}(T *); void ^?{}(T *);
@@ -533,8 +532,8 @@
 		FunctionDecl *dtorDecl = genFunc( "^?{}", dtorType, functionNesting );
 
-		makeUnionAssignBody( assignDecl, isDynamicLayout );
+		makeUnionAssignBody( assignDecl );
 
 		// body of assignment and copy ctor is the same
-		makeUnionAssignBody( copyCtorDecl, isDynamicLayout );
+		makeUnionAssignBody( copyCtorDecl );
 
 		// create a constructor which takes the first member type as a parameter.
@@ -551,5 +550,5 @@
 				FunctionDecl * ctor = genFunc( "?{}", memCtorType, functionNesting );
 
-				makeUnionAssignBody( ctor, isDynamicLayout );
+				makeUnionAssignBody( ctor );
 				memCtors.push_back( ctor );
 				// only generate a ctor for the first field
@@ -578,5 +577,5 @@
 			EnumInstType *enumInst = new EnumInstType( Type::Qualifiers(), enumDecl->get_name() );
 			// enumInst->set_baseEnum( enumDecl );
-			makeEnumFunctions( enumDecl, enumInst, functionNesting, declsToAddAfter );
+			makeEnumFunctions( enumInst, functionNesting, declsToAddAfter );
 		}
 	}
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SymTab/Indexer.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -518,10 +518,4 @@
 		acceptNewScope( tupleExpr->get_result(), *this );
 		maybeAccept( tupleExpr->get_tuple(), *this );
-	}
-
-	void Indexer::visit( MemberTupleExpr *tupleExpr ) {
-		acceptNewScope( tupleExpr->get_result(), *this );
-		maybeAccept( tupleExpr->get_member(), *this );
-		maybeAccept( tupleExpr->get_aggregate(), *this );
 	}
 
Index: src/SymTab/Indexer.h
===================================================================
--- src/SymTab/Indexer.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SymTab/Indexer.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -74,5 +74,4 @@
 		virtual void visit( TupleExpr *tupleExpr );
 		virtual void visit( TupleIndexExpr *tupleExpr );
-		virtual void visit( MemberTupleExpr *tupleExpr );
 		virtual void visit( TupleAssignExpr *tupleExpr );
 		virtual void visit( StmtExpr * stmtExpr );
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/Expression.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -690,25 +690,4 @@
 };
 
-/// MemberTupleExpr represents a tuple member selection operation on a struct type, e.g. s.[a, b, c] after processing by the expression analyzer
-class MemberTupleExpr : public Expression {
-  public:
-	MemberTupleExpr( Expression * member, Expression * aggregate, Expression * _aname = nullptr );
-	MemberTupleExpr( const MemberTupleExpr & other );
-	virtual ~MemberTupleExpr();
-
-	Expression * get_member() const { return member; }
-	Expression * get_aggregate() const { return aggregate; }
-	MemberTupleExpr * set_member( Expression * newValue ) { member = newValue; return this; }
-	MemberTupleExpr * set_aggregate( Expression * newValue ) { aggregate = newValue; return this; }
-
-	virtual MemberTupleExpr * clone() const { return new MemberTupleExpr( * this ); }
-	virtual void accept( Visitor & v ) { v.visit( this ); }
-	virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
-	virtual void print( std::ostream & os, int indent = 0 ) const;
-  private:
-	Expression * member;
-	Expression * aggregate;
-};
-
 /// 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 {
Index: src/SynTree/Initializer.cc
===================================================================
--- src/SynTree/Initializer.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/Initializer.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -33,5 +33,5 @@
 }
 
-void Initializer::print( std::ostream &os, int indent ) {}
+// void Initializer::print( __attribute__((unused)) std::ostream &os, __attribute__((unused)) int indent ) {}
 
 SingleInit::SingleInit( Expression *v, const std::list< Expression *> &_designators, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ), designators( _designators ) {
Index: src/SynTree/Initializer.h
===================================================================
--- src/SynTree/Initializer.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/Initializer.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -53,5 +53,5 @@
 	virtual void accept( Visitor &v ) = 0;
 	virtual Initializer *acceptMutator( Mutator &m ) = 0;
-	virtual void print( std::ostream &os, int indent = 0 );
+	virtual void print( std::ostream &os, int indent = 0 ) = 0;
   private:
 	//	std::string name;
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/Mutator.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -408,12 +408,4 @@
 }
 
-Expression *Mutator::mutate( MemberTupleExpr *tupleExpr ) {
-	tupleExpr->set_env( maybeMutate( tupleExpr->get_env(), *this ) );
-	tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
-	tupleExpr->set_member( maybeMutate( tupleExpr->get_member(), *this ) );
-	tupleExpr->set_aggregate( maybeMutate( tupleExpr->get_aggregate(), *this ) );
-	return tupleExpr;
-}
-
 Expression *Mutator::mutate( TupleAssignExpr *assignExpr ) {
 	assignExpr->set_env( maybeMutate( assignExpr->get_env(), *this ) );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/Mutator.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -82,5 +82,4 @@
 	virtual Expression* mutate( TupleExpr *tupleExpr );
 	virtual Expression* mutate( TupleIndexExpr *tupleExpr );
-	virtual Expression* mutate( MemberTupleExpr *tupleExpr );
 	virtual Expression* mutate( TupleAssignExpr *assignExpr );
 	virtual Expression* mutate( StmtExpr * stmtExpr );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/SynTree.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -89,5 +89,4 @@
 class TupleExpr;
 class TupleIndexExpr;
-class MemberTupleExpr;
 class TupleAssignExpr;
 class StmtExpr;
Index: src/SynTree/TupleExpr.cc
===================================================================
--- src/SynTree/TupleExpr.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/TupleExpr.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -78,26 +78,4 @@
 }
 
-MemberTupleExpr::MemberTupleExpr( Expression * member, Expression * aggregate, Expression * _aname ) : Expression( _aname ) {
-	set_result( maybeClone( member->get_result() ) ); // xxx - ???
-}
-
-MemberTupleExpr::MemberTupleExpr( const MemberTupleExpr &other ) : Expression( other ), member( other.member->clone() ), aggregate( other.aggregate->clone() ) {
-}
-
-MemberTupleExpr::~MemberTupleExpr() {
-	delete member;
-	delete aggregate;
-}
-
-void MemberTupleExpr::print( std::ostream &os, int indent ) const {
-	os << "Member Tuple Expression, with aggregate:" << std::endl;
-	os << std::string( indent+2, ' ' );
-	aggregate->print( os, indent+2 );
-	os << std::string( indent+2, ' ' ) << "with member: " << std::endl;
-	os << std::string( indent+2, ' ' );
-	member->print( os, indent+2 );
-	Expression::print( os, indent );
-}
-
 TupleAssignExpr::TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname ) : Expression( _aname ) {
 	// convert internally into a StmtExpr which contains the declarations and produces the tuple of the assignments
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/Visitor.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -321,10 +321,4 @@
 }
 
-void Visitor::visit( MemberTupleExpr *tupleExpr ) {
-	maybeAccept( tupleExpr->get_result(), *this );
-	maybeAccept( tupleExpr->get_member(), *this );
-	maybeAccept( tupleExpr->get_aggregate(), *this );
-}
-
 void Visitor::visit( TupleAssignExpr *assignExpr ) {
 	maybeAccept( assignExpr->get_result(), *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision af397ef8f0a43077863974fc725f7ae0d12ca892)
+++ src/SynTree/Visitor.h	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
@@ -85,5 +85,4 @@
 	virtual void visit( TupleExpr *tupleExpr );
 	virtual void visit( TupleIndexExpr *tupleExpr );
-	virtual void visit( MemberTupleExpr *tupleExpr );
 	virtual void visit( TupleAssignExpr *assignExpr );
 	virtual void visit( StmtExpr * stmtExpr );
