Skip to content

Forbid lowering the same NodeId multiple times #96346

Closed

Description

During AST->HIR lowering, the method lower_node_id is tasked to transform NodeIds that identify AST nodes into HirIds that identify HIR nodes. This method maintains a node_id_to_local_id: FxHashMap<NodeId, hir::ItemLocalId> to remember this mapping.

However, this mapping is not entirely useful, and mostly exists (1) to make the developer's life easier, (2) to lower resolutions to local bindings Res::Local in lower_res. The mapping node_id_to_local_id should be removed, and multiple calls to local_node_id with the same NodeId should be forbidden. For usage (2), Res::Local only appears for ident patterns (PatKind::Ident) which are lowered by lower_pat_ident. Hence, lower_res should use a dedicated hash-map filled by lower_pat_ident.

Furthermore, next_id calls lower_node_id with a node_id: NodeId which is entirely local to that function, and will never be known to any other code. Manipulations of node_id_to_local_id there are entirely useless.

Instructions:

  • inline lower_node_id into next_id and skip manipulations of node_id_to_local_id;
  • replace the Entry::Occupied branch in lower_node_id by a panic!, and fix all the ICEs;
  • create another mapping node_id_to_local_id_for_res (name to bikeshed) which is only filled by lower_pat_ident and read by lower_res; this mapping should be saved by with_hir_id_owner like node_id_to_local_id is;
  • remove node_id_to_local_id, or eventually keep it only to debug-assert that we don't call lower_node_id twice on the same NodeId.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

Labels

E-help-wantedCall for participation: Help is requested to fix this issue.E-mediumCall for participation: Medium difficulty. Experience needed to fix: Intermediate.E-mentorCall for participation: This issue has a mentor. Use #t-compiler/help on Zulip for discussion.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions