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 -1
View File
@@ -183,7 +183,7 @@ static auto VerifyImplRedecl(Context& context, const SemIR::Impl& new_impl,
return ImplRedeclType::DiagnosedInvalidRedecl;
}
if (prev_impl.has_definition_started()) {
if (new_impl.has_definition_started() && prev_impl.has_definition_started()) {
// Impls aren't merged in order to avoid generic region lookup into a
// mismatching table.
CARBON_DIAGNOSTIC(ImplRedefinition, Error,