Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 634cb80fc3e3b71a7402430c90c46d11d098ce9c)
+++ src/AST/Decl.hpp	(revision 6a0b043e80fdf4cf1c67a5448b9dd15216278047)
@@ -361,4 +361,5 @@
 
 /// With statement `with (...) ...`
+/// This is a statement lexically, but a Decl is needed for the SymbolTable.
 class WithStmt final : public Decl {
 public:
Index: src/AST/SymbolTable.cpp
===================================================================
--- src/AST/SymbolTable.cpp	(revision 634cb80fc3e3b71a7402430c90c46d11d098ce9c)
+++ src/AST/SymbolTable.cpp	(revision 6a0b043e80fdf4cf1c67a5448b9dd15216278047)
@@ -76,10 +76,8 @@
 			ret = new MemberExpr{loc, id, referenceToRvalueConversion( base, cost )};
 			ret->env = subs;
-		}
-		else {
+		} else {
 			ret = new MemberExpr{ loc, id, referenceToRvalueConversion( baseExpr, cost ) };
 		}
-	}
-	else {
+	} else {
 		ret = new VariableExpr{ loc, id };
 	}
@@ -193,6 +191,5 @@
 			}
 		}
-	}
-	else {
+	} else {
 		++*num_lookup_with_key;
 		++*stats().map_lookups;
@@ -294,5 +291,5 @@
 }
 
-bool SymbolTable::addedDeclConflicts( 
+bool SymbolTable::addedDeclConflicts(
 		const AggregateDecl * existing, const AggregateDecl * added ) const {
 	if ( ! existing->body ) {
@@ -480,7 +477,7 @@
 			if (dynamic_cast<const PointerType *>(base)) return Mangle::Encoding::pointer;
 			return Mangle::mangle( base, Mangle::Type | Mangle::NoGenericParams );
-		}
-		else
-			return Mangle::mangle( base );	
+		} else {
+			return Mangle::mangle( base );
+		}
 	}
 
@@ -556,5 +553,5 @@
 		if ( ! alreadyUserDefinedFunc ) for ( const auto& entry : deleted ) {
 			++*stats().map_mutations;
-			mangleTable = mangleTable->set( entry.first, IdData{ entry.second, function } );
+			mangleTable = mangleTable->set( entry.first, entry.second.withDeleter( function ) );
 		}
 	} else if ( dataIsUserDefinedFunc ) {
@@ -586,5 +583,5 @@
 		for ( const auto& entry : deleted ) {
 			++*stats().map_mutations;
-			mangleTable = mangleTable->set( entry.first, IdData{ entry.second, function } );
+			mangleTable = mangleTable->set( entry.first, entry.second.withDeleter( function ) );
 		}
 	} else if ( function->linkage != Linkage::Intrinsic ) {
@@ -690,14 +687,11 @@
 	if (kind == NUMBER_OF_KINDS) { // not a special decl
 		addIdToTable(decl, decl->name, idTable, handleConflicts, baseExpr, deleter);
-	}
-	else {
+	} else {
 		std::string key;
 		if (auto func = dynamic_cast<const FunctionDecl *>(decl)) {
 			key = getOtypeKey(func->type);
-		}
-		else if (auto obj = dynamic_cast<const ObjectDecl *>(decl)) {
+		} else if (auto obj = dynamic_cast<const ObjectDecl *>(decl)) {
 			key = getOtypeKey(obj->type.strict_as<PointerType>()->base.strict_as<FunctionType>());
-		}
-		else {
+		} else {
 			assertf(false, "special decl with non-function type");
 		}
@@ -755,18 +749,17 @@
 			if ( existing != mangleTable->end()
 					&& existing->second.scope == scope
-					&& existing->second.id ) {
-				if ( addedIdConflicts( existing->second, decl, handleConflicts, deleter ) ) {
-					if ( handleConflicts.mode == OnConflict::Delete ) {
-						// set delete expression for conflicting identifier
-						lazyInitScope();
-						*stats().map_mutations += 2;
-						table = table->set(
-							lookupKey,
-							mangleTable->set(
-								mangleName,
-								IdData{ existing->second, handleConflicts.deleter } ) );
-					}
-					return;
+					&& existing->second.id
+					&& addedIdConflicts( existing->second, decl, handleConflicts, deleter ) ) {
+				if ( handleConflicts.mode == OnConflict::Delete ) {
+					// set delete expression for conflicting identifier
+					lazyInitScope();
+					*stats().map_mutations += 2;
+					table = table->set(
+						lookupKey,
+						mangleTable->set(
+							mangleName,
+							existing->second.withDeleter( handleConflicts.deleter ) ) );
 				}
+				return;
 			}
 		}
Index: src/AST/SymbolTable.hpp
===================================================================
--- src/AST/SymbolTable.hpp	(revision 634cb80fc3e3b71a7402430c90c46d11d098ce9c)
+++ src/AST/SymbolTable.hpp	(revision 6a0b043e80fdf4cf1c67a5448b9dd15216278047)
@@ -48,7 +48,8 @@
 		: id( i ), baseExpr( base ), deleter( del ), scope( s ) {}
 
-		/// Modify an existing node with a new deleter
-		IdData( const IdData & o, const Decl * del )
-		: id( o.id ), baseExpr( o.baseExpr ), deleter( del ), scope( o.scope ) {}
+		/// Create a new IdData, updating the deleter value.
+		IdData withDeleter( const Decl * decl ) const {
+			return IdData( id, baseExpr, decl, scope );
+		}
 
 		/// Constructs an expression referring to this identifier.
