mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-03 22:02:51 +01:00
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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user