Skip to content

Commit b09dbcc

Browse files
committed
Avoid mismatched InterfaceId comparison between two files
1 parent 68a33ab commit b09dbcc

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

toolchain/check/impl_validation.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,20 @@ static auto ImportFinalImplsWithImplInFile(Context& context) -> void {
370370
if (!import_ir_id.has_value()) {
371371
continue;
372372
}
373+
auto interface_owning_decl_id = interface.first_owning_decl_id;
374+
if (!interface_owning_decl_id.has_value()) {
375+
continue;
376+
}
377+
const auto& import_ir_inst =
378+
GetCanonicalImportIRInst(context, interface.first_owning_decl_id);
373379
interfaces_to_import.push_back(
374-
{.ir_id = import_ir_id, .interface_id = interface_id});
380+
{.ir_id = import_ir_inst.ir_id(),
381+
.interface_id =
382+
context.import_irs()
383+
.Get(import_ir_inst.ir_id())
384+
.sem_ir->insts()
385+
.GetAs<SemIR::InterfaceDecl>(import_ir_inst.inst_id())
386+
.interface_id});
375387
}
376388

377389
llvm::sort(interfaces_to_import);

toolchain/check/testdata/impl/lookup/impl_overlap.carbon

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ class C;
174174
// Can't write a final impl in both the interface's file and the root self
175175
// type's file (when they are different files).
176176
//
177+
// CHECK:STDERR: fail_final_impl_with_both_interface_and_self_but_different_files.carbon:[[@LINE+8]]:1: error: `final impl` overlaps with `final impl` from another file [FinalImplOverlapsDifferentFile]
178+
// CHECK:STDERR: final impl C as Z(()) {}
179+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~
180+
// CHECK:STDERR: fail_final_impl_with_both_interface_and_self_but_different_files.carbon:[[@LINE-10]]:1: in import [InImport]
181+
// CHECK:STDERR: interface_z_with_impl.carbon:7:1: note: imported `final impl` here [FinalImplOverlapsDifferentFileNote]
182+
// CHECK:STDERR: final impl forall [T:! type] T as Z(T) {}
183+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
184+
// CHECK:STDERR:
177185
final impl C as Z(()) {}
178186

179187
// --- fail_final_overlaps_final_from_other_file.carbon
@@ -186,6 +194,14 @@ class C;
186194
// This final impl is overlapped by a final impl in the interface file, and you
187195
// can't write a final impl in two different files.
188196
//
197+
// CHECK:STDERR: fail_final_overlaps_final_from_other_file.carbon:[[@LINE+8]]:1: error: `final impl` overlaps with `final impl` from another file [FinalImplOverlapsDifferentFile]
198+
// CHECK:STDERR: final impl C as Z(C) {}
199+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~
200+
// CHECK:STDERR: fail_final_overlaps_final_from_other_file.carbon:[[@LINE-10]]:1: in import [InImport]
201+
// CHECK:STDERR: interface_z_with_impl.carbon:7:1: note: imported `final impl` here [FinalImplOverlapsDifferentFileNote]
202+
// CHECK:STDERR: final impl forall [T:! type] T as Z(T) {}
203+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
204+
// CHECK:STDERR:
189205
final impl C as Z(C) {}
190206

191207
// --- fail_final_overlaps_non_final_from_other_file.carbon
@@ -197,6 +213,14 @@ class C;
197213

198214
// This non-final impl is subsumed by a final impl in the interface file.
199215
//
216+
// CHECK:STDERR: fail_final_overlaps_non_final_from_other_file.carbon:[[@LINE+8]]:1: error: `impl` will never be used [ImplFinalOverlapsNonFinal]
217+
// CHECK:STDERR: impl C as Z(C) {}
218+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~
219+
// CHECK:STDERR: fail_final_overlaps_non_final_from_other_file.carbon:[[@LINE-9]]:1: in import [InImport]
220+
// CHECK:STDERR: interface_z_with_impl.carbon:7:1: note: `final impl` declared here would always be used instead [ImplFinalOverlapsNonFinalNote]
221+
// CHECK:STDERR: final impl forall [T:! type] T as Z(T) {}
222+
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
223+
// CHECK:STDERR:
200224
impl C as Z(C) {}
201225

202226
// --- fail_final_different_file_from_self_and_interface.carbon

0 commit comments

Comments
 (0)