Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/CodeGen/CodeGenerator.cc	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -171,4 +171,6 @@
 	// *** Declarations
 	void CodeGenerator::postvisit( FunctionDecl * functionDecl ) {
+		// deleted decls should never be used, so don't print them
+		if ( functionDecl->isDeleted && genC ) return;
 		extension( functionDecl );
 		genAttributes( functionDecl->get_attributes() );
@@ -184,7 +186,12 @@
 			functionDecl->get_statements()->accept( *visitor );
 		} // if
+		if ( functionDecl->isDeleted ) {
+			output << " = void";
+		}
 	}
 
 	void CodeGenerator::postvisit( ObjectDecl * objectDecl ) {
+		// deleted decls should never be used, so don't print them
+		if ( objectDecl->isDeleted && genC ) return;
 		if (objectDecl->get_name().empty() && genC ) {
 			// only generate an anonymous name when generating C code, otherwise it clutters the output too much
@@ -205,4 +212,7 @@
 			objectDecl->get_init()->accept( *visitor );
 		} // if
+		if ( objectDecl->isDeleted ) {
+			output << " = void";
+		}
 
 		if ( objectDecl->get_bitfieldWidth() ) {
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/Common/PassVisitor.h	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -313,5 +313,5 @@
 	void indexerAddUnionFwd ( UnionDecl                 * node  ) { indexer_impl_addUnionFwd ( pass, 0, node ); }
 	void indexerAddTrait    ( TraitDecl                 * node  ) { indexer_impl_addTrait    ( pass, 0, node ); }
-	void indexerAddWith     ( std::list< Expression * > & exprs, BaseSyntaxNode * withStmt ) { indexer_impl_addWith     ( pass, 0, exprs, withStmt ); }
+	void indexerAddWith     ( std::list< Expression * > & exprs, BaseSyntaxNode * withStmt ) { indexer_impl_addWith( pass, 0, exprs, withStmt ); }
 
 
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/Parser/DeclarationNode.cc	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -1067,5 +1067,11 @@
 			SemanticError( this, "invalid function specifier for " );
 		} // if
-		return buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, maybeBuild< Initializer >(initializer), attributes )->set_extension( extension );
+		bool isDelete = initializer && initializer->get_isDelete();
+		Declaration * decl = buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, isDelete ? nullptr : maybeBuild< Initializer >(initializer), attributes )->set_extension( extension );
+		if ( isDelete ) {
+			DeclarationWithType * dwt = strict_dynamic_cast<DeclarationWithType *>( decl );
+			dwt->isDeleted = true;
+		}
+		return decl;
 	} // if
 
Index: src/Parser/InitializerNode.cc
===================================================================
--- src/Parser/InitializerNode.cc	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/Parser/InitializerNode.cc	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -27,5 +27,5 @@
 
 InitializerNode::InitializerNode( ExpressionNode * _expr, bool aggrp, ExpressionNode * des )
-		: expr( _expr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ) {
+		: expr( _expr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ), isDelete( false ) {
 	if ( aggrp )
 		kids = dynamic_cast< InitializerNode * >( get_next() );
@@ -36,5 +36,5 @@
 
 InitializerNode::InitializerNode( InitializerNode * init, bool aggrp, ExpressionNode * des )
-		: expr( nullptr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ) {
+		: expr( nullptr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ), isDelete( false ) {
 	if ( init )
 		set_last( init );
@@ -46,4 +46,6 @@
 		set_next( nullptr );
 } // InitializerNode::InitializerNode
+
+InitializerNode::InitializerNode( bool isDelete ) : expr( nullptr ), aggregate( false ), designator( nullptr ), kids( nullptr ), maybeConstructed( false ), isDelete( isDelete ) {}
 
 InitializerNode::~InitializerNode() {
@@ -84,4 +86,5 @@
 
 Initializer * InitializerNode::build() const {
+	assertf( ! isDelete, "Should not build delete stmt InitializerNode" );
 	if ( aggregate ) {
 		// steal designators from children
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/Parser/ParseNode.h	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -87,4 +87,5 @@
 	InitializerNode( ExpressionNode *, bool aggrp = false,  ExpressionNode * des = nullptr );
 	InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = nullptr );
+	InitializerNode( bool isDelete );
 	~InitializerNode();
 	virtual InitializerNode * clone() const { assert( false ); return nullptr; }
@@ -97,4 +98,6 @@
 	InitializerNode * set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }
 	bool get_maybeConstructed() const { return maybeConstructed; }
+
+	bool get_isDelete() const { return isDelete; }
 
 	InitializerNode * next_init() const { return kids; }
@@ -110,4 +113,5 @@
 	InitializerNode * kids;
 	bool maybeConstructed;
+	bool isDelete;
 }; // InitializerNode
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/Parser/parser.yy	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -2113,5 +2113,5 @@
 		{ $$ = $2; }
 	| '=' VOID
-		{ $$ = nullptr; }
+		{ $$ = new InitializerNode( true ); }
 	| ATassign initializer
 		{ $$ = $2->set_maybeConstructed( false ); }
Index: src/SymTab/Indexer.cc
===================================================================
--- src/SymTab/Indexer.cc	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/SymTab/Indexer.cc	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -471,5 +471,5 @@
 	void Indexer::addId( DeclarationWithType * decl, Expression * baseExpr ) {
 		// default handling of conflicts is to raise an error
-		addId( decl, [decl](IdData &, const std::string & msg) { SemanticError( decl, msg ); return true; }, baseExpr );
+		addId( decl, [decl](IdData &, const std::string & msg) { SemanticError( decl, msg ); return true; }, baseExpr, decl->isDeleted ? decl : nullptr );
 	}
 
Index: src/SynTree/Declaration.cc
===================================================================
--- src/SynTree/Declaration.cc	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/SynTree/Declaration.cc	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -104,4 +104,5 @@
 }
 
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
+++ src/SynTree/Declaration.h	(revision 3ed994eca620a695aa523cf50b22b75c6761327d)
@@ -84,4 +84,5 @@
 	Expression *asmName;
 	std::list< Attribute * > attributes;
+	bool isDeleted = false;
 
 	DeclarationWithType( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );
