Index: src/SynTree/Attribute.cc
===================================================================
--- src/SynTree/Attribute.cc	(revision 0b0f1dd5a6f46d23ab33e2091192a9f415f7ad92)
+++ src/SynTree/Attribute.cc	(revision 59641272e0a07efde566eae04ac3733d31d89f42)
@@ -15,4 +15,5 @@
 
 #include <ostream>           // for operator<<, ostream, basic_ostream, endl
+#include <set>
 
 #include "Attribute.h"
@@ -21,22 +22,43 @@
 
 Attribute::Attribute( const Attribute &other ) : name( other.name ) {
-  cloneAll( other.parameters, parameters );
+	cloneAll( other.parameters, parameters );
 }
 
 Attribute::~Attribute() {
-  deleteAll( parameters );
+	deleteAll( parameters );
+}
+
+bool Attribute::isValidOnFuncParam() const {
+	// attributes such as aligned, cleanup, etc. produce GCC errors when they appear
+	// on function parameters. Maintain here a whitelist of attribute names that are
+	// allowed to appear on parameters.
+	static std::set< std::string > valid = {
+		"noreturn", "unused"
+	};
+	return valid.count( normalizedName() );
+}
+
+std::string Attribute::normalizedName() const {
+	// trim beginning/ending _, convert to lowercase
+	auto begin = name.find_first_not_of('_');
+	auto end = name.find_last_not_of('_');
+	if (begin == std::string::npos || end == std::string::npos) return "";
+	std::string ret;
+	ret.reserve( end-begin+1 );
+	std::transform( &name[begin], &name[end+1], back_inserter( ret ), tolower );
+	return ret;
 }
 
 void Attribute::print( std::ostream &os, Indenter indent ) const {
-  using std::endl;
-  using std::string;
+	using std::endl;
+	using std::string;
 
-  if ( ! empty() ) {
-    os << "Attribute with name: " << name;
-    if ( ! parameters.empty() ) {
-      os << " with parameters: " << endl;
-      printAll( parameters, os, indent+1 );
-    }
-  }
+	if ( ! empty() ) {
+		os << "Attribute with name: " << name;
+		if ( ! parameters.empty() ) {
+			os << " with parameters: " << endl;
+			printAll( parameters, os, indent+1 );
+		}
+	}
 }
 
Index: src/SynTree/Attribute.h
===================================================================
--- src/SynTree/Attribute.h	(revision 0b0f1dd5a6f46d23ab33e2091192a9f415f7ad92)
+++ src/SynTree/Attribute.h	(revision 59641272e0a07efde566eae04ac3733d31d89f42)
@@ -43,4 +43,9 @@
 	bool empty() const { return name == ""; }
 
+	std::string normalizedName() const;
+
+	/// true if this attribute is allowed to appear attached to a function parameter
+	bool isValidOnFuncParam() const;
+
 	Attribute * clone() const override { return new Attribute( *this ); }
 	virtual void accept( Visitor & v ) override { v.visit( this ); }
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 0b0f1dd5a6f46d23ab33e2091192a9f415f7ad92)
+++ src/SynTree/Expression.cc	(revision 59641272e0a07efde566eae04ac3733d31d89f42)
@@ -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 0b0f1dd5a6f46d23ab33e2091192a9f415f7ad92)
+++ src/SynTree/Expression.h	(revision 59641272e0a07efde566eae04ac3733d31d89f42)
@@ -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 0b0f1dd5a6f46d23ab33e2091192a9f415f7ad92)
+++ src/SynTree/Mutator.h	(revision 59641272e0a07efde566eae04ac3733d31d89f42)
@@ -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 0b0f1dd5a6f46d23ab33e2091192a9f415f7ad92)
+++ src/SynTree/Statement.cc	(revision 59641272e0a07efde566eae04ac3733d31d89f42)
@@ -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 0b0f1dd5a6f46d23ab33e2091192a9f415f7ad92)
+++ src/SynTree/SynTree.h	(revision 59641272e0a07efde566eae04ac3733d31d89f42)
@@ -97,4 +97,5 @@
 class UntypedInitExpr;
 class InitExpr;
+class DeletedExpr;
 
 class Type;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 0b0f1dd5a6f46d23ab33e2091192a9f415f7ad92)
+++ src/SynTree/Visitor.h	(revision 59641272e0a07efde566eae04ac3733d31d89f42)
@@ -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 );
