Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/CodeGen/CodeGenerator.cc	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -764,5 +764,5 @@
 
 	void CodeGenerator::postvisit( StmtExpr * stmtExpr ) {
-		std::list< Statement * > & stmts = stmtExpr->get_statements()->get_kids();
+		std::list< Statement * > & stmts = stmtExpr->statements->kids;
 		output << "({" << endl;
 		++indent;
@@ -775,5 +775,5 @@
 				// cannot cast to void, otherwise the expression statement has no value
 				if ( ExprStmt * exprStmt = dynamic_cast< ExprStmt * >( stmt ) ) {
-					exprStmt->get_expr()->accept( *visitor );
+					exprStmt->expr->accept( *visitor );
 					output << ";" << endl;
 					++i;
@@ -795,4 +795,9 @@
 		assertf( ! genC, "Unique expressions should not reach code generation." );
 		expr->callExpr->accept( *visitor );
+	}
+
+	void CodeGenerator::postvisit( DeletedExpr * expr ) {
+		assertf( ! genC, "Deleted expressions should not reach code generation." );
+		expr->expr->accept( *visitor );
 	}
 
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/CodeGen/CodeGenerator.h	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -88,4 +88,5 @@
 		void postvisit( StmtExpr * );
 		void postvisit( ConstructorExpr * );
+		void postvisit( DeletedExpr * );
 
 		//*** Statements
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/Common/PassVisitor.h	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -121,4 +121,5 @@
 	virtual void visit( UntypedInitExpr *  initExpr ) override final;
 	virtual void visit( InitExpr *  initExpr ) override final;
+	virtual void visit( DeletedExpr *  delExpr ) override final;
 
 	virtual void visit( VoidType * basicType ) override final;
@@ -215,4 +216,5 @@
 	virtual Expression * mutate( UntypedInitExpr *  initExpr ) override final;
 	virtual Expression * mutate( InitExpr *  initExpr ) override final;
+	virtual Expression * mutate( DeletedExpr *  delExpr ) override final;
 
 	virtual Type * mutate( VoidType * basicType ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/Common/PassVisitor.impl.h	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -1976,4 +1976,29 @@
 }
 
+//--------------------------------------------------------------------------
+// DeletedExpr
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( DeletedExpr * node ) {
+	VISIT_START( node );
+
+	indexerScopedAccept( node->result, *this );
+	maybeAccept_impl( node->expr, *this );
+	// don't visit deleteStmt, because it is a pointer to somewhere else in the tree.
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+Expression * PassVisitor< pass_type >::mutate( DeletedExpr * node ) {
+	MUTATE_START( node );
+
+	indexerScopedMutate( node->env, *this );
+	indexerScopedMutate( node->result, *this );
+	maybeMutate_impl( node->expr, *this );
+
+	MUTATE_END( Expression, node );
+}
+
+
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( VoidType * node ) {
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/SynTree/Expression.cc	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -710,4 +710,21 @@
 }
 
+DeletedExpr::DeletedExpr( Expression * expr, BaseSyntaxNode * deleteStmt ) : expr( expr ), deleteStmt( deleteStmt ) {
+	assert( expr->result );
+	result = expr->result->clone();
+}
+DeletedExpr::DeletedExpr( const DeletedExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), deleteStmt( other.deleteStmt ) {}
+DeletedExpr::~DeletedExpr() {
+	delete expr;
+}
+
+void DeletedExpr::print( std::ostream & os, Indenter indent ) const {
+	os << "Deleted Expression" << std::endl << indent+1;
+	expr->print( os, indent+1 );
+	os << std::endl << indent+1 << "... deleted by: ";
+	deleteStmt->print( os, indent+1 );
+}
+
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/SynTree/Expression.h	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -822,4 +822,20 @@
 };
 
+/// expression that contains a deleted identifier - should never make it past the resolver.
+class DeletedExpr : public Expression {
+public:
+	Expression * expr;
+	BaseSyntaxNode * deleteStmt;
+
+	DeletedExpr( Expression * expr, BaseSyntaxNode * deleteStmt );
+	DeletedExpr( const DeletedExpr & other );
+	~DeletedExpr();
+
+	virtual DeletedExpr * clone() const { return new DeletedExpr( * this ); }
+	virtual void accept( Visitor & v ) { v.visit( this ); }
+	virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const;
+};
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/SynTree/Mutator.h	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -55,38 +55,39 @@
 	virtual Statement * mutate( ImplicitCtorDtorStmt * impCtorDtorStmt );
 
-	virtual Expression* mutate( ApplicationExpr * applicationExpr );
-	virtual Expression* mutate( UntypedExpr * untypedExpr );
-	virtual Expression* mutate( NameExpr * nameExpr );
-	virtual Expression* mutate( AddressExpr * castExpr );
-	virtual Expression* mutate( LabelAddressExpr * labAddressExpr );
-	virtual Expression* mutate( CastExpr * castExpr );
-	virtual Expression* mutate( VirtualCastExpr * castExpr );
-	virtual Expression* mutate( UntypedMemberExpr * memberExpr );
-	virtual Expression* mutate( MemberExpr * memberExpr );
-	virtual Expression* mutate( VariableExpr * variableExpr );
-	virtual Expression* mutate( ConstantExpr * constantExpr );
-	virtual Expression* mutate( SizeofExpr * sizeofExpr );
-	virtual Expression* mutate( AlignofExpr * alignofExpr );
-	virtual Expression* mutate( UntypedOffsetofExpr * offsetofExpr );
-	virtual Expression* mutate( OffsetofExpr * offsetofExpr );
-	virtual Expression* mutate( OffsetPackExpr * offsetPackExpr );
-	virtual Expression* mutate( AttrExpr * attrExpr );
-	virtual Expression* mutate( LogicalExpr * logicalExpr );
-	virtual Expression* mutate( ConditionalExpr * conditionalExpr );
-	virtual Expression* mutate( CommaExpr * commaExpr );
-	virtual Expression* mutate( TypeExpr * typeExpr );
-	virtual Expression* mutate( AsmExpr * asmExpr );
-	virtual Expression* mutate( ImplicitCopyCtorExpr * impCpCtorExpr );
-	virtual Expression* mutate( ConstructorExpr * ctorExpr );
-	virtual Expression* mutate( CompoundLiteralExpr * compLitExpr );
-	virtual Expression* mutate( RangeExpr * rangeExpr );
-	virtual Expression* mutate( UntypedTupleExpr * tupleExpr );
-	virtual Expression* mutate( TupleExpr * tupleExpr );
-	virtual Expression* mutate( TupleIndexExpr * tupleExpr );
-	virtual Expression* mutate( TupleAssignExpr * assignExpr );
-	virtual Expression* mutate( StmtExpr  * stmtExpr );
-	virtual Expression* mutate( UniqueExpr  * uniqueExpr );
-	virtual Expression* mutate( UntypedInitExpr  * initExpr );
-	virtual Expression* mutate( InitExpr  * initExpr );
+	virtual Expression * mutate( ApplicationExpr * applicationExpr );
+	virtual Expression * mutate( UntypedExpr * untypedExpr );
+	virtual Expression * mutate( NameExpr * nameExpr );
+	virtual Expression * mutate( AddressExpr * castExpr );
+	virtual Expression * mutate( LabelAddressExpr * labAddressExpr );
+	virtual Expression * mutate( CastExpr * castExpr );
+	virtual Expression * mutate( VirtualCastExpr * castExpr );
+	virtual Expression * mutate( UntypedMemberExpr * memberExpr );
+	virtual Expression * mutate( MemberExpr * memberExpr );
+	virtual Expression * mutate( VariableExpr * variableExpr );
+	virtual Expression * mutate( ConstantExpr * constantExpr );
+	virtual Expression * mutate( SizeofExpr * sizeofExpr );
+	virtual Expression * mutate( AlignofExpr * alignofExpr );
+	virtual Expression * mutate( UntypedOffsetofExpr * offsetofExpr );
+	virtual Expression * mutate( OffsetofExpr * offsetofExpr );
+	virtual Expression * mutate( OffsetPackExpr * offsetPackExpr );
+	virtual Expression * mutate( AttrExpr * attrExpr );
+	virtual Expression * mutate( LogicalExpr * logicalExpr );
+	virtual Expression * mutate( ConditionalExpr * conditionalExpr );
+	virtual Expression * mutate( CommaExpr * commaExpr );
+	virtual Expression * mutate( TypeExpr * typeExpr );
+	virtual Expression * mutate( AsmExpr * asmExpr );
+	virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr );
+	virtual Expression * mutate( ConstructorExpr * ctorExpr );
+	virtual Expression * mutate( CompoundLiteralExpr * compLitExpr );
+	virtual Expression * mutate( RangeExpr * rangeExpr );
+	virtual Expression * mutate( UntypedTupleExpr * tupleExpr );
+	virtual Expression * mutate( TupleExpr * tupleExpr );
+	virtual Expression * mutate( TupleIndexExpr * tupleExpr );
+	virtual Expression * mutate( TupleAssignExpr * assignExpr );
+	virtual Expression * mutate( StmtExpr  * stmtExpr );
+	virtual Expression * mutate( UniqueExpr  * uniqueExpr );
+	virtual Expression * mutate( UntypedInitExpr  * initExpr );
+	virtual Expression * mutate( InitExpr  * initExpr );
+	virtual Expression * mutate( DeletedExpr * delExpr ) = 0;
 
 	virtual Type * mutate( VoidType * basicType );
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/SynTree/Statement.cc	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -468,4 +468,6 @@
 void WithStmt::print( std::ostream & os, Indenter indent ) const {
 	os << "With statement" << endl;
+	os << indent << "... with expressions: " << endl;
+	printAll( exprs, os, indent+1 );
 	os << indent << "... with statement:" << endl << indent+1;
 	stmt->print( os, indent+1 );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/SynTree/SynTree.h	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -97,4 +97,5 @@
 class UntypedInitExpr;
 class InitExpr;
+class DeletedExpr;
 
 class Type;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 490ff5c3cdf33976fd18d953a739387a1031d3c6)
+++ src/SynTree/Visitor.h	(revision 44b41141bccae974eea50a7e612d003d7ed7e9fa)
@@ -91,4 +91,5 @@
 	virtual void visit( UntypedInitExpr *  initExpr );
 	virtual void visit( InitExpr *  initExpr );
+	virtual void visit( DeletedExpr * delExpr ) = 0;
 
 	virtual void visit( VoidType * basicType );
