Refactor LocId to merge in SemIRLoc (#5284)

The main goal of this is to collapse the LocId and SemIRLoc types into a
single type, eliminating the need for APIs to decide which to use. This
originated from discussion about UnwrapSemIRLoc in #5169. Although that
was removed in #5202, it's probably still a good direction for LocId.

This changes the packing of LocId to allow adding InstId, making it
tri-modal: ImportIRInstId, InstId, or NodeId. This has a side-effect of
reducing the available space for ImportIRInstId, although not by much
due to the pre-existing `ImplicitBit` behavior. If needed, we could also
probably play with packing a bit more since `ImplicitBit` really only
applies to `NodeId`, but I was trying to keep the logic a little
simpler. Note `TokenOnlyBit` can still apply to `ImportIRInstId`.

This leaves in place a typedef for SemIRLoc -- I intend to clean that up
separately.

Some Discord discussion is
[here](https://discord.com/channels/655572317891461132/655578254970716160/1353755830058745959).
This commit is contained in:
Jon Ross-Perkins
2025-04-11 13:35:58 +00:00
committed by GitHub
parent 422df75a92
commit fe29224016
15 changed files with 403 additions and 214 deletions
+1 -1
View File
@@ -560,7 +560,7 @@ auto CompilationUnit::PostCheck() -> void {
const SemIR::File* file = &*sem_ir_;
while (true) {
auto loc_id = file->insts().GetLocId(entity_inst_id);
if (!loc_id.is_import_ir_inst_id()) {
if (loc_id.kind() != SemIR::LocId::Kind::ImportIRInstId) {
return true;
}
auto import_ir_inst =