Skip to content

Commit efbc9f7

Browse files
authored
Create LoadedImportRefs for vtable entries with import insts instead of local insts (#5931)
With help from Richard Smith debugging/identifying this. Hmm - looks like maybe the Self type import ref may have the same problem? (or at least it seems to have the same quirk in the semir dump, where the inst id is mentioned in the `import_ref` insts, but is not defined elsewhere, has no name, and says `[no loc]`. I'll look into that separately. (hmm, maybe this is just an unloaded ImportRef, actually)
1 parent 5b328da commit efbc9f7

File tree

2 files changed

+22
-20
lines changed

2 files changed

+22
-20
lines changed

toolchain/check/import_ref.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2003,18 +2003,20 @@ static auto TryResolveTypedInst(ImportRefResolver& resolver,
20032003
return ResolveResult::Retry();
20042004
}
20052005

2006-
for (auto& vtable_entry_id : lazy_virtual_functions) {
2006+
for (auto [import_vtable_entry_inst_id, local_vtable_entry_inst_id] :
2007+
llvm::zip(virtual_functions, lazy_virtual_functions)) {
20072008
// Use LoadedImportRef for imported symbolic constant vtable entries so they
20082009
// can carry attached constants necessary for applying specifics to these
20092010
// constants when they are used.
20102011
auto local_attached_constant_id =
2011-
resolver.local_constant_values().Get(vtable_entry_id);
2012+
resolver.local_constant_values().GetAttached(
2013+
local_vtable_entry_inst_id);
20122014
if (local_attached_constant_id.is_symbolic()) {
2013-
vtable_entry_id = AddLoadedImportRef(
2015+
local_vtable_entry_inst_id = AddLoadedImportRef(
20142016
resolver,
20152017
GetSingletonType(resolver.local_context(),
20162018
SemIR::SpecificFunctionType::TypeInstId),
2017-
vtable_entry_id, local_attached_constant_id);
2019+
import_vtable_entry_inst_id, local_attached_constant_id);
20182020
}
20192021
}
20202022

toolchain/check/testdata/class/virtual_modifiers.carbon

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6732,19 +6732,19 @@ class T2(G2:! type) {
67326732
// CHECK:STDOUT: %Base.F.e26: %Base.F.type.f17 = struct_value () [symbolic]
67336733
// CHECK:STDOUT: %pattern_type.9f7: type = pattern_type %Base.370 [symbolic]
67346734
// CHECK:STDOUT: %Base.F.specific_fn.892: <specific function> = specific_function %Base.F.e26, @Base.F(%T) [symbolic]
6735-
// CHECK:STDOUT: %Base.vtable_ptr.f15b84.1: ref %ptr.454 = vtable_ptr @Base.vtable.1, @Base(%T) [symbolic]
6735+
// CHECK:STDOUT: %Base.vtable_ptr.16a6e1.1: ref %ptr.454 = vtable_ptr @Base.vtable.1, @Base(%T) [symbolic]
67366736
// CHECK:STDOUT: %require_complete: <witness> = require_complete_type %Base.370 [symbolic]
6737-
// CHECK:STDOUT: %Base.vtable_ptr.f15b84.2: ref %ptr.454 = vtable_ptr @Base.vtable.2, @Base(%T) [symbolic]
6737+
// CHECK:STDOUT: %Base.vtable_ptr.16a6e1.2: ref %ptr.454 = vtable_ptr @Base.vtable.2, @Base(%T) [symbolic]
67386738
// CHECK:STDOUT: %Base.ea5: type = class_type @Base, @Base(%T1) [concrete]
67396739
// CHECK:STDOUT: %Base.F.type.d82: type = fn_type @Base.F, @Base(%T1) [concrete]
67406740
// CHECK:STDOUT: %Base.F.d25: %Base.F.type.d82 = struct_value () [concrete]
67416741
// CHECK:STDOUT: %pattern_type.3bf: type = pattern_type %Base.ea5 [concrete]
67426742
// CHECK:STDOUT: %Base.F.specific_fn.210: <specific function> = specific_function %Base.F.d25, @Base.F(%T1) [concrete]
6743-
// CHECK:STDOUT: %Base.vtable_ptr.88e: ref %ptr.454 = vtable_ptr @Base.vtable.1, @Base(%T1) [concrete]
6743+
// CHECK:STDOUT: %Base.vtable_ptr.e8d: ref %ptr.454 = vtable_ptr @Base.vtable.1, @Base(%T1) [concrete]
67446744
// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete]
6745-
// CHECK:STDOUT: %Base.vtable_ptr.f15b84.3: ref %ptr.454 = vtable_ptr @Base.vtable.3, @Base(%T) [symbolic]
6745+
// CHECK:STDOUT: %Base.vtable_ptr.16a6e1.3: ref %ptr.454 = vtable_ptr @Base.vtable.3, @Base(%T) [symbolic]
67466746
// CHECK:STDOUT: %.b74: ref %ptr.454 = class_element_access file.%v.var, element0 [concrete]
6747-
// CHECK:STDOUT: %Base.val: %Base.ea5 = struct_value (%Base.vtable_ptr.88e) [concrete]
6747+
// CHECK:STDOUT: %Base.val: %Base.ea5 = struct_value (%Base.vtable_ptr.e8d) [concrete]
67486748
// CHECK:STDOUT: }
67496749
// CHECK:STDOUT:
67506750
// CHECK:STDOUT: imports {
@@ -6753,15 +6753,15 @@ class T2(G2:! type) {
67536753
// CHECK:STDOUT: import Core//prelude
67546754
// CHECK:STDOUT: import Core//prelude/...
67556755
// CHECK:STDOUT: }
6756-
// CHECK:STDOUT: %Main.import_ref.03f: ref %ptr.454 = import_ref Main//generic_lib, loc6_1, loaded [symbolic = @Base.%vtable_ptr (constants.%Base.vtable_ptr.f15b84.3)]
6756+
// CHECK:STDOUT: %Main.import_ref.03f: ref %ptr.454 = import_ref Main//generic_lib, loc6_1, loaded [symbolic = @Base.%vtable_ptr (constants.%Base.vtable_ptr.16a6e1.3)]
67576757
// CHECK:STDOUT: %Main.import_ref.5ab3ec.1: type = import_ref Main//generic_lib, loc4_17, loaded [symbolic = @Base.%T (constants.%T)]
67586758
// CHECK:STDOUT: %Main.import_ref.05e: <witness> = import_ref Main//generic_lib, loc6_1, loaded [concrete = constants.%complete_type]
67596759
// CHECK:STDOUT: %Main.import_ref.8e0 = import_ref Main//generic_lib, inst27 [no loc], unloaded
67606760
// CHECK:STDOUT: %Main.import_ref.e54 = import_ref Main//generic_lib, loc5_30, unloaded
67616761
// CHECK:STDOUT: %Main.import_ref.5ab3ec.2: type = import_ref Main//generic_lib, loc4_17, loaded [symbolic = @Base.%T (constants.%T)]
6762-
// CHECK:STDOUT: %Main.import_ref.4f4e13.1: <specific function> = import_ref Main//generic_lib, inst47 [no loc], loaded [symbolic = constants.%Base.F.specific_fn.892]
6763-
// CHECK:STDOUT: %Main.import_ref.4f4e13.2: <specific function> = import_ref Main//generic_lib, inst47 [no loc], loaded [symbolic = constants.%Base.F.specific_fn.892]
6764-
// CHECK:STDOUT: %Main.import_ref.4f4e13.3: <specific function> = import_ref Main//generic_lib, inst47 [no loc], loaded [symbolic = constants.%Base.F.specific_fn.892]
6762+
// CHECK:STDOUT: %Main.import_ref.78ad15.1: <specific function> = import_ref Main//generic_lib, loc6_1, loaded [symbolic = constants.%Base.F.specific_fn.892]
6763+
// CHECK:STDOUT: %Main.import_ref.78ad15.2: <specific function> = import_ref Main//generic_lib, loc6_1, loaded [symbolic = constants.%Base.F.specific_fn.892]
6764+
// CHECK:STDOUT: %Main.import_ref.78ad15.3: <specific function> = import_ref Main//generic_lib, loc6_1, loaded [symbolic = constants.%Base.F.specific_fn.892]
67656765
// CHECK:STDOUT: }
67666766
// CHECK:STDOUT:
67676767
// CHECK:STDOUT: file {
@@ -6796,7 +6796,7 @@ class T2(G2:! type) {
67966796
// CHECK:STDOUT: %Base.F.type: type = fn_type @Base.F, @Base(%T) [symbolic = %Base.F.type (constants.%Base.F.type.f17)]
67976797
// CHECK:STDOUT: %Base.F: @Base.%Base.F.type (%Base.F.type.f17) = struct_value () [symbolic = %Base.F (constants.%Base.F.e26)]
67986798
// CHECK:STDOUT: %Base.F.specific_fn: <specific function> = specific_function %Base.F, @Base.F(%T) [symbolic = %Base.F.specific_fn (constants.%Base.F.specific_fn.892)]
6799-
// CHECK:STDOUT: %vtable_ptr: ref %ptr.454 = vtable_ptr @Base.vtable.1, @Base(%T) [symbolic = %vtable_ptr (constants.%Base.vtable_ptr.f15b84.1)]
6799+
// CHECK:STDOUT: %vtable_ptr: ref %ptr.454 = vtable_ptr @Base.vtable.1, @Base(%T) [symbolic = %vtable_ptr (constants.%Base.vtable_ptr.16a6e1.1)]
68006800
// CHECK:STDOUT:
68016801
// CHECK:STDOUT: class {
68026802
// CHECK:STDOUT: complete_type_witness = imports.%Main.import_ref.05e
@@ -6809,15 +6809,15 @@ class T2(G2:! type) {
68096809
// CHECK:STDOUT: }
68106810
// CHECK:STDOUT:
68116811
// CHECK:STDOUT: vtable @Base.vtable.1 {
6812-
// CHECK:STDOUT: imports.%Main.import_ref.4f4e13.1
6812+
// CHECK:STDOUT: imports.%Main.import_ref.78ad15.1
68136813
// CHECK:STDOUT: }
68146814
// CHECK:STDOUT:
68156815
// CHECK:STDOUT: vtable @Base.vtable.2 {
6816-
// CHECK:STDOUT: imports.%Main.import_ref.4f4e13.2
6816+
// CHECK:STDOUT: imports.%Main.import_ref.78ad15.2
68176817
// CHECK:STDOUT: }
68186818
// CHECK:STDOUT:
68196819
// CHECK:STDOUT: vtable @Base.vtable.3 {
6820-
// CHECK:STDOUT: imports.%Main.import_ref.4f4e13.3
6820+
// CHECK:STDOUT: imports.%Main.import_ref.78ad15.3
68216821
// CHECK:STDOUT: }
68226822
// CHECK:STDOUT:
68236823
// CHECK:STDOUT: generic virtual fn @Base.F(imports.%Main.import_ref.5ab3ec.2: type) [from "generic_lib.carbon"] {
@@ -6835,7 +6835,7 @@ class T2(G2:! type) {
68356835
// CHECK:STDOUT: !entry:
68366836
// CHECK:STDOUT: %.loc7_20.1: %empty_struct_type = struct_literal ()
68376837
// CHECK:STDOUT: %.loc7_20.2: ref %ptr.454 = class_element_access file.%v.var, element0 [concrete = constants.%.b74]
6838-
// CHECK:STDOUT: %.loc7_20.3: init %ptr.454 = initialize_from constants.%Base.vtable_ptr.88e to %.loc7_20.2 [concrete = constants.%Base.vtable_ptr.88e]
6838+
// CHECK:STDOUT: %.loc7_20.3: init %ptr.454 = initialize_from constants.%Base.vtable_ptr.e8d to %.loc7_20.2 [concrete = constants.%Base.vtable_ptr.e8d]
68396839
// CHECK:STDOUT: %.loc7_20.4: init %Base.ea5 = class_init (%.loc7_20.3), file.%v.var [concrete = constants.%Base.val]
68406840
// CHECK:STDOUT: %.loc7_1: init %Base.ea5 = converted %.loc7_20.1, %.loc7_20.4 [concrete = constants.%Base.val]
68416841
// CHECK:STDOUT: assign file.%v.var, %.loc7_1
@@ -6849,7 +6849,7 @@ class T2(G2:! type) {
68496849
// CHECK:STDOUT: %Base.F.type => constants.%Base.F.type.f17
68506850
// CHECK:STDOUT: %Base.F => constants.%Base.F.e26
68516851
// CHECK:STDOUT: %Base.F.specific_fn => constants.%Base.F.specific_fn.892
6852-
// CHECK:STDOUT: %vtable_ptr => constants.%Base.vtable_ptr.f15b84.2
6852+
// CHECK:STDOUT: %vtable_ptr => constants.%Base.vtable_ptr.16a6e1.2
68536853
// CHECK:STDOUT: }
68546854
// CHECK:STDOUT:
68556855
// CHECK:STDOUT: specific @Base.F(constants.%T) {
@@ -6868,7 +6868,7 @@ class T2(G2:! type) {
68686868
// CHECK:STDOUT: %Base.F.type => constants.%Base.F.type.d82
68696869
// CHECK:STDOUT: %Base.F => constants.%Base.F.d25
68706870
// CHECK:STDOUT: %Base.F.specific_fn => constants.%Base.F.specific_fn.210
6871-
// CHECK:STDOUT: %vtable_ptr => constants.%Base.vtable_ptr.88e
6871+
// CHECK:STDOUT: %vtable_ptr => constants.%Base.vtable_ptr.e8d
68726872
// CHECK:STDOUT: }
68736873
// CHECK:STDOUT:
68746874
// CHECK:STDOUT: specific @Base.F(constants.%T1) {

0 commit comments

Comments
 (0)