When diagnosing a duplicated name, add the name to the diagnosis (#4902)

In order to have the name available for diagnostics, we now always set
`NameId` in `NameContext` and put `poisoning_loc_id` as part of the
union with `resolved_inst_id` instead (since we never need both).
This commit is contained in:
Boaz Brickner
2025-02-19 07:19:23 +00:00
committed by GitHub
parent e0b2f5d772
commit 6a99c4e970
40 changed files with 104 additions and 96 deletions
+7 -8
View File
@@ -136,7 +136,7 @@ auto DeclNameStack::AddName(NameContext name_context, SemIR::InstId target_id,
case NameContext::State::Unresolved:
if (!name_context.parent_scope_id.has_value()) {
AddNameToLookup(*context_, name_context.unresolved_name_id, target_id,
AddNameToLookup(*context_, name_context.name_id, target_id,
name_context.initial_scope_index);
} else {
auto& name_scope =
@@ -161,7 +161,7 @@ auto DeclNameStack::AddName(NameContext name_context, SemIR::InstId target_id,
context_->AddExport(target_id);
}
name_scope.AddRequired({.name_id = name_context.unresolved_name_id,
name_scope.AddRequired({.name_id = name_context.name_id,
.result = SemIR::ScopeLookupResult::MakeFound(
target_id, access_kind)});
}
@@ -180,7 +180,8 @@ auto DeclNameStack::AddNameOrDiagnose(NameContext name_context,
DiagnosePoisonedName(*context_, name_context.name_id_for_new_inst(),
name_context.poisoning_loc_id, name_context.loc_id);
} else if (auto id = name_context.prev_inst_id(); id.has_value()) {
DiagnoseDuplicateName(*context_, name_context.loc_id, id);
DiagnoseDuplicateName(*context_, name_context.name_id, name_context.loc_id,
id);
} else {
AddName(name_context, target_id, access_kind);
}
@@ -258,10 +259,11 @@ auto DeclNameStack::ApplyAndLookupName(NameContext& name_context,
// processed so far.
name_context.loc_id = loc_id;
name_context.name_id = name_id;
// Don't perform any more lookups after we hit an error. We still track the
// final name, though.
if (name_context.state == NameContext::State::Error) {
name_context.unresolved_name_id = name_id;
return;
}
@@ -270,12 +272,10 @@ auto DeclNameStack::ApplyAndLookupName(NameContext& name_context,
name_context.parent_scope_id,
name_context.initial_scope_index);
if (lookup_result.is_poisoned()) {
name_context.unresolved_name_id = name_id;
name_context.poisoning_loc_id = lookup_result.poisoning_loc_id();
name_context.state = NameContext::State::Poisoned;
} else if (!lookup_result.is_found()) {
// Invalid indicates an unresolved name. Store it and return.
name_context.unresolved_name_id = name_id;
name_context.state = NameContext::State::Unresolved;
} else {
// Store the resolved instruction and continue for the target scope
@@ -300,8 +300,7 @@ static auto CheckQualifierIsResolved(
case DeclNameStack::NameContext::State::Unresolved:
// Because more qualifiers were found, we diagnose that the earlier
// qualifier failed to resolve.
DiagnoseNameNotFound(context, name_context.loc_id,
name_context.unresolved_name_id);
DiagnoseNameNotFound(context, name_context.loc_id, name_context.name_id);
return false;
case DeclNameStack::NameContext::State::Finished: