Allow impl redecl in match_first after a definition (#7491)

Previously the last decl had to be the definition. Now we allow a
declaration after a definition, so that the user can write a match_first
block last, and put (re-)declarations of impls in it, after the
definitions have already been written elsewhere.

We track the location of the decl that was associated with a match_first
block so that we can correctly point to it in diagnostics when an impl
is written twice in match_first blocks. Since impls may not be
redeclared across an import boundary, we will never have a `SemIR::Impl`
with a match_first from a different file in a redeclaration, so we don't
need to import the location of a previous decl that was in a match_first
for diagnostics. As such we just store a LocId on the `SemIR::Impl`
struct.
This commit is contained in:
Dana Jansens
2026-07-15 14:12:37 +00:00
committed by GitHub
parent 474090f439
commit 168420f805
7 changed files with 92 additions and 52 deletions
+1
View File
@@ -2760,6 +2760,7 @@ static auto ImportImplDecl(ImportContext& context,
{.parent_scope_inst_id = SemIR::InstId::None,
.is_final = import_impl.is_final,
.match_first_id = SemIR::InstId::None,
.decl_loc_in_match_first = SemIR::LocId::None,
.match_first_position = import_impl.match_first_position,
.self_id = SemIR::TypeInstId::None,
.constraint_id = SemIR::TypeInstId::None,