Skip to content

Commit 972854e

Browse files
authored
In import, replace MakeSelfSpecific with GetOrAddLocalSpecific (#6409)
This is just making `self_specific_id` behave more consistently with respect to other specific imports.
1 parent bff6ec4 commit 972854e

File tree

4 files changed

+132
-133
lines changed

4 files changed

+132
-133
lines changed

toolchain/check/import_ref.cpp

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -879,43 +879,6 @@ static auto SetGenericDataForResolveResult(ImportContext& context,
879879
new_generic_id, SemIR::GenericInstIndex::Region::Declaration);
880880
}
881881

882-
// Given a generic that's gone through the initial setup with `GenericData`,
883-
// finish the import.
884-
static auto TryFinishGeneric(ImportRefResolver& resolver,
885-
SemIR::GenericId import_generic_id,
886-
SemIR::GenericId local_generic_id) -> bool {
887-
const auto& import_generic =
888-
resolver.import_generics().Get(import_generic_id);
889-
890-
llvm::SmallVector<SemIR::InstId> definition_block;
891-
if (import_generic.definition_block_id.has_value()) {
892-
definition_block =
893-
GetLocalInstBlockContents(resolver, import_generic.definition_block_id);
894-
}
895-
896-
if (resolver.HasNewWork()) {
897-
return false;
898-
}
899-
900-
auto& local_generic = resolver.local_generics().Get(local_generic_id);
901-
CARBON_CHECK(!local_generic.self_specific_id.has_value(),
902-
"Currently assuming we can't find a GenericId multiple ways");
903-
904-
// TODO: Consider getting this through a constant.
905-
local_generic.self_specific_id =
906-
MakeSelfSpecific(resolver.local_context(),
907-
SemIR::LocId(local_generic.decl_id), local_generic_id);
908-
resolver.AddPendingSpecific({.import_id = import_generic.self_specific_id,
909-
.local_id = local_generic.self_specific_id});
910-
911-
if (import_generic.definition_block_id.has_value()) {
912-
local_generic.definition_block_id = ResolveLocalEvalBlock(
913-
resolver, import_generic.definition_block_id, definition_block,
914-
local_generic_id, SemIR::GenericInstIndex::Region::Definition);
915-
}
916-
return true;
917-
}
918-
919882
// Gets a local constant value corresponding to an imported generic ID. May
920883
// add work to the work stack and return `None`.
921884
static auto GetLocalConstantId(ImportRefResolver& resolver,
@@ -998,9 +961,14 @@ static auto GetLocalSpecificData(ImportRefResolver& resolver,
998961

999962
// Gets a local specific whose data was already imported by
1000963
// GetLocalSpecificData. Does not add any new work.
1001-
static auto GetOrAddLocalSpecific(ImportContext& context,
1002-
SemIR::SpecificId import_specific_id,
1003-
const SpecificData& data)
964+
//
965+
// `local_generic_id` is provided when this is used for a generic's `self`
966+
// specific, where `GetLocalGenericId` won't work because `generic_const_id` can
967+
// be `TypeType`.
968+
static auto GetOrAddLocalSpecific(
969+
ImportContext& context, SemIR::SpecificId import_specific_id,
970+
const SpecificData& data,
971+
SemIR::GenericId local_generic_id = SemIR::GenericId::None)
1004972
-> SemIR::SpecificId {
1005973
if (!import_specific_id.has_value()) {
1006974
return SemIR::SpecificId::None;
@@ -1009,22 +977,61 @@ static auto GetOrAddLocalSpecific(ImportContext& context,
1009977
// Form a corresponding local specific ID.
1010978
const auto& import_specific =
1011979
context.import_specifics().Get(import_specific_id);
1012-
auto generic_id = GetLocalGenericId(context, data.generic_const_id);
980+
if (!local_generic_id.has_value()) {
981+
local_generic_id = GetLocalGenericId(context, data.generic_const_id);
982+
}
1013983
auto args_id =
1014984
GetLocalCanonicalInstBlockId(context, import_specific.args_id, data.args);
1015985

1016986
// Get the specific.
1017-
auto specific_id = context.local_specifics().GetOrAdd(generic_id, args_id);
987+
auto local_specific_id =
988+
context.local_specifics().GetOrAdd(local_generic_id, args_id);
1018989

1019990
// Fill in the remaining information in FinishPendingSpecific, if necessary.
1020-
auto& specific = context.local_specifics().Get(specific_id);
1021-
if (!specific.decl_block_id.has_value() ||
991+
auto& local_specific = context.local_specifics().Get(local_specific_id);
992+
if (!local_specific.decl_block_id.has_value() ||
1022993
(import_specific.definition_block_id.has_value() &&
1023-
!specific.definition_block_id.has_value())) {
994+
!local_specific.definition_block_id.has_value())) {
1024995
context.AddPendingSpecific(
1025-
{.import_id = import_specific_id, .local_id = specific_id});
996+
{.import_id = import_specific_id, .local_id = local_specific_id});
1026997
}
1027-
return specific_id;
998+
return local_specific_id;
999+
}
1000+
1001+
// Given a generic that's gone through the initial setup with `GenericData`,
1002+
// finish the import.
1003+
static auto TryFinishGeneric(ImportRefResolver& resolver,
1004+
SemIR::GenericId import_generic_id,
1005+
SemIR::GenericId local_generic_id) -> bool {
1006+
const auto& import_generic =
1007+
resolver.import_generics().Get(import_generic_id);
1008+
1009+
auto specific_data =
1010+
GetLocalSpecificData(resolver, import_generic.self_specific_id);
1011+
llvm::SmallVector<SemIR::InstId> definition_block;
1012+
if (import_generic.definition_block_id.has_value()) {
1013+
definition_block =
1014+
GetLocalInstBlockContents(resolver, import_generic.definition_block_id);
1015+
}
1016+
1017+
if (resolver.HasNewWork()) {
1018+
return false;
1019+
}
1020+
1021+
auto& local_generic = resolver.local_generics().Get(local_generic_id);
1022+
CARBON_CHECK(!local_generic.self_specific_id.has_value(),
1023+
"Currently assuming we can't find a GenericId multiple ways");
1024+
1025+
local_generic.self_specific_id =
1026+
GetOrAddLocalSpecific(resolver, import_generic.self_specific_id,
1027+
specific_data, local_generic_id);
1028+
1029+
if (import_generic.definition_block_id.has_value()) {
1030+
local_generic.definition_block_id = ResolveLocalEvalBlock(
1031+
resolver, import_generic.definition_block_id, definition_block,
1032+
local_generic_id, SemIR::GenericInstIndex::Region::Definition);
1033+
}
1034+
return true;
10281035
}
10291036

10301037
namespace {

toolchain/check/testdata/basics/raw_sem_ir/one_file.carbon

Lines changed: 59 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -323,23 +323,23 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
323323
// CHECK:STDOUT: specific60000003: {generic: generic60000002, args: inst_block60000022}
324324
// CHECK:STDOUT: specific60000004: {generic: generic60000001, args: inst_block6000001F}
325325
// CHECK:STDOUT: specific60000005: {generic: generic60000003, args: inst_block6000001F}
326-
// CHECK:STDOUT: specific60000006: {generic: generic60000001, args: inst_block60000028}
326+
// CHECK:STDOUT: specific60000006: {generic: generic60000001, args: inst_block60000027}
327327
// CHECK:STDOUT: specific60000007: {generic: generic60000004, args: inst_block60000013}
328328
// CHECK:STDOUT: specific60000008: {generic: generic60000004, args: inst_block60000032}
329329
// CHECK:STDOUT: specific60000009: {generic: generic60000005, args: inst_block60000013}
330330
// CHECK:STDOUT: specific6000000A: {generic: generic60000006, args: inst_block6000003D}
331331
// CHECK:STDOUT: specific6000000B: {generic: generic60000006, args: inst_block60000041}
332332
// CHECK:STDOUT: specific6000000C: {generic: generic60000001, args: inst_block60000049}
333333
// CHECK:STDOUT: specific6000000D: {generic: generic60000007, args: inst_block6000003D}
334-
// CHECK:STDOUT: specific6000000E: {generic: generic60000001, args: inst_block6000004B}
335-
// CHECK:STDOUT: specific6000000F: {generic: generic60000001, args: inst_block6000004C}
334+
// CHECK:STDOUT: specific6000000E: {generic: generic60000001, args: inst_block6000004A}
335+
// CHECK:STDOUT: specific6000000F: {generic: generic60000001, args: inst_block6000004B}
336336
// CHECK:STDOUT: specific60000010: {generic: generic60000008, args: inst_block60000055}
337337
// CHECK:STDOUT: specific60000011: {generic: generic60000008, args: inst_block60000059}
338338
// CHECK:STDOUT: specific60000012: {generic: generic60000001, args: inst_block60000061}
339339
// CHECK:STDOUT: specific60000013: {generic: generic60000009, args: inst_block60000055}
340-
// CHECK:STDOUT: specific60000014: {generic: generic60000001, args: inst_block60000063}
341-
// CHECK:STDOUT: specific60000015: {generic: generic60000001, args: inst_block60000064}
342-
// CHECK:STDOUT: specific60000016: {generic: generic60000001, args: inst_block60000065}
340+
// CHECK:STDOUT: specific60000014: {generic: generic60000001, args: inst_block60000062}
341+
// CHECK:STDOUT: specific60000015: {generic: generic60000001, args: inst_block60000063}
342+
// CHECK:STDOUT: specific60000016: {generic: generic60000001, args: inst_block60000064}
343343
// CHECK:STDOUT: specific60000017: {generic: generic60000001, args: inst_block6000006F}
344344
// CHECK:STDOUT: specific60000018: {generic: generic60000001, args: inst_block60000071}
345345
// CHECK:STDOUT: struct_type_fields:
@@ -1543,32 +1543,32 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
15431543
// CHECK:STDOUT: 2: inst6000007B
15441544
// CHECK:STDOUT: 3: inst6000007C
15451545
// CHECK:STDOUT: inst_block60000027:
1546-
// CHECK:STDOUT: 0: inst60000061
1547-
// CHECK:STDOUT: 1: inst60000062
1548-
// CHECK:STDOUT: 2: inst60000063
1549-
// CHECK:STDOUT: 3: inst60000073
1550-
// CHECK:STDOUT: inst_block60000028:
15511546
// CHECK:STDOUT: 0: inst60000079
1552-
// CHECK:STDOUT: inst_block60000029:
1547+
// CHECK:STDOUT: inst_block60000028:
15531548
// CHECK:STDOUT: 0: inst60000083
15541549
// CHECK:STDOUT: 1: inst60000084
15551550
// CHECK:STDOUT: 2: inst60000085
15561551
// CHECK:STDOUT: 3: inst60000086
15571552
// CHECK:STDOUT: 4: inst60000087
15581553
// CHECK:STDOUT: 5: inst60000088
1554+
// CHECK:STDOUT: inst_block60000029:
1555+
// CHECK:STDOUT: 0: inst6000006C
15591556
// CHECK:STDOUT: inst_block6000002A:
1557+
// CHECK:STDOUT: 0: inst60000089
1558+
// CHECK:STDOUT: 1: inst6000008A
1559+
// CHECK:STDOUT: inst_block6000002B:
15601560
// CHECK:STDOUT: 0: inst60000061
15611561
// CHECK:STDOUT: 1: inst60000062
15621562
// CHECK:STDOUT: 2: inst60000063
15631563
// CHECK:STDOUT: 3: inst60000066
1564-
// CHECK:STDOUT: inst_block6000002B:
1565-
// CHECK:STDOUT: 0: inst6000006C
15661564
// CHECK:STDOUT: inst_block6000002C:
1567-
// CHECK:STDOUT: 0: inst60000089
1568-
// CHECK:STDOUT: 1: inst6000008A
1569-
// CHECK:STDOUT: inst_block6000002D:
15701565
// CHECK:STDOUT: 0: inst60000071
15711566
// CHECK:STDOUT: 1: inst60000072
1567+
// CHECK:STDOUT: inst_block6000002D:
1568+
// CHECK:STDOUT: 0: inst60000061
1569+
// CHECK:STDOUT: 1: inst60000062
1570+
// CHECK:STDOUT: 2: inst60000063
1571+
// CHECK:STDOUT: 3: inst60000073
15721572
// CHECK:STDOUT: inst_block6000002E:
15731573
// CHECK:STDOUT: 0: inst60000061
15741574
// CHECK:STDOUT: 1: inst60000062
@@ -1594,19 +1594,19 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
15941594
// CHECK:STDOUT: 1: inst600000B1
15951595
// CHECK:STDOUT: 2: inst600000B2
15961596
// CHECK:STDOUT: inst_block60000037:
1597-
// CHECK:STDOUT: 0: inst60000014
1598-
// CHECK:STDOUT: 1: inst6000001A
1599-
// CHECK:STDOUT: 2: inst6000001D
1597+
// CHECK:STDOUT: 0: inst600000A5
16001598
// CHECK:STDOUT: inst_block60000038:
1599+
// CHECK:STDOUT: 0: inst600000B3
1600+
// CHECK:STDOUT: 1: inst600000B4
1601+
// CHECK:STDOUT: 2: inst600000B5
1602+
// CHECK:STDOUT: inst_block60000039:
16011603
// CHECK:STDOUT: 0: inst60000014
16021604
// CHECK:STDOUT: 1: inst6000001A
16031605
// CHECK:STDOUT: 2: inst600000A0
1604-
// CHECK:STDOUT: inst_block60000039:
1605-
// CHECK:STDOUT: 0: inst600000A5
16061606
// CHECK:STDOUT: inst_block6000003A:
1607-
// CHECK:STDOUT: 0: inst600000B3
1608-
// CHECK:STDOUT: 1: inst600000B4
1609-
// CHECK:STDOUT: 2: inst600000B5
1607+
// CHECK:STDOUT: 0: inst60000014
1608+
// CHECK:STDOUT: 1: inst6000001A
1609+
// CHECK:STDOUT: 2: inst6000001D
16101610
// CHECK:STDOUT: inst_block6000003B:
16111611
// CHECK:STDOUT: 0: inst60000062
16121612
// CHECK:STDOUT: 1: inst600000C1
@@ -1659,17 +1659,10 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
16591659
// CHECK:STDOUT: inst_block60000049:
16601660
// CHECK:STDOUT: 0: inst600000C0
16611661
// CHECK:STDOUT: inst_block6000004A:
1662-
// CHECK:STDOUT: 0: inst60000061
1663-
// CHECK:STDOUT: 1: inst60000062
1664-
// CHECK:STDOUT: 2: inst600000C0
1665-
// CHECK:STDOUT: 3: inst600000C1
1666-
// CHECK:STDOUT: 4: inst600000C2
1667-
// CHECK:STDOUT: 5: inst600000D8
1668-
// CHECK:STDOUT: inst_block6000004B:
16691662
// CHECK:STDOUT: 0: inst600000DF
1670-
// CHECK:STDOUT: inst_block6000004C:
1663+
// CHECK:STDOUT: inst_block6000004B:
16711664
// CHECK:STDOUT: 0: inst600000E1
1672-
// CHECK:STDOUT: inst_block6000004D:
1665+
// CHECK:STDOUT: inst_block6000004C:
16731666
// CHECK:STDOUT: 0: inst600000EB
16741667
// CHECK:STDOUT: 1: inst600000EC
16751668
// CHECK:STDOUT: 2: inst600000ED
@@ -1681,23 +1674,30 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
16811674
// CHECK:STDOUT: 8: inst600000F3
16821675
// CHECK:STDOUT: 9: inst600000F4
16831676
// CHECK:STDOUT: 10: inst600000F5
1677+
// CHECK:STDOUT: inst_block6000004D:
1678+
// CHECK:STDOUT: 0: inst600000CE
1679+
// CHECK:STDOUT: 1: inst600000CF
16841680
// CHECK:STDOUT: inst_block6000004E:
1681+
// CHECK:STDOUT: 0: inst600000F6
1682+
// CHECK:STDOUT: 1: inst600000F7
1683+
// CHECK:STDOUT: inst_block6000004F:
16851684
// CHECK:STDOUT: 0: inst60000061
16861685
// CHECK:STDOUT: 1: inst600000C0
16871686
// CHECK:STDOUT: 2: inst600000C7
16881687
// CHECK:STDOUT: 3: inst60000062
16891688
// CHECK:STDOUT: 4: inst600000C1
16901689
// CHECK:STDOUT: 5: inst600000C2
16911690
// CHECK:STDOUT: 6: inst600000C5
1692-
// CHECK:STDOUT: inst_block6000004F:
1693-
// CHECK:STDOUT: 0: inst600000CE
1694-
// CHECK:STDOUT: 1: inst600000CF
16951691
// CHECK:STDOUT: inst_block60000050:
1696-
// CHECK:STDOUT: 0: inst600000F6
1697-
// CHECK:STDOUT: 1: inst600000F7
1698-
// CHECK:STDOUT: inst_block60000051:
16991692
// CHECK:STDOUT: 0: inst600000D6
17001693
// CHECK:STDOUT: 1: inst600000D7
1694+
// CHECK:STDOUT: inst_block60000051:
1695+
// CHECK:STDOUT: 0: inst60000061
1696+
// CHECK:STDOUT: 1: inst60000062
1697+
// CHECK:STDOUT: 2: inst600000C0
1698+
// CHECK:STDOUT: 3: inst600000C1
1699+
// CHECK:STDOUT: 4: inst600000C2
1700+
// CHECK:STDOUT: 5: inst600000D8
17011701
// CHECK:STDOUT: inst_block60000052:
17021702
// CHECK:STDOUT: 0: inst600000C0
17031703
// CHECK:STDOUT: 1: inst600000C1
@@ -1768,21 +1768,12 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
17681768
// CHECK:STDOUT: inst_block60000061:
17691769
// CHECK:STDOUT: 0: inst600000FB
17701770
// CHECK:STDOUT: inst_block60000062:
1771-
// CHECK:STDOUT: 0: inst60000061
1772-
// CHECK:STDOUT: 1: inst60000062
1773-
// CHECK:STDOUT: 2: inst600000C0
1774-
// CHECK:STDOUT: 3: inst600000C1
1775-
// CHECK:STDOUT: 4: inst600000FB
1776-
// CHECK:STDOUT: 5: inst600000FC
1777-
// CHECK:STDOUT: 6: inst600000FD
1778-
// CHECK:STDOUT: 7: inst60000117
1779-
// CHECK:STDOUT: inst_block60000063:
17801771
// CHECK:STDOUT: 0: inst6000011F
1781-
// CHECK:STDOUT: inst_block60000064:
1772+
// CHECK:STDOUT: inst_block60000063:
17821773
// CHECK:STDOUT: 0: inst60000121
1783-
// CHECK:STDOUT: inst_block60000065:
1774+
// CHECK:STDOUT: inst_block60000064:
17841775
// CHECK:STDOUT: 0: inst60000123
1785-
// CHECK:STDOUT: inst_block60000066:
1776+
// CHECK:STDOUT: inst_block60000065:
17861777
// CHECK:STDOUT: 0: inst6000012D
17871778
// CHECK:STDOUT: 1: inst6000012E
17881779
// CHECK:STDOUT: 2: inst6000012F
@@ -1799,7 +1790,14 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
17991790
// CHECK:STDOUT: 13: inst6000013A
18001791
// CHECK:STDOUT: 14: inst6000013B
18011792
// CHECK:STDOUT: 15: inst6000013C
1793+
// CHECK:STDOUT: inst_block60000066:
1794+
// CHECK:STDOUT: 0: inst6000010B
1795+
// CHECK:STDOUT: 1: inst6000010C
1796+
// CHECK:STDOUT: 2: inst6000010D
18021797
// CHECK:STDOUT: inst_block60000067:
1798+
// CHECK:STDOUT: 0: inst6000013D
1799+
// CHECK:STDOUT: 1: inst6000013E
1800+
// CHECK:STDOUT: inst_block60000068:
18031801
// CHECK:STDOUT: 0: inst60000061
18041802
// CHECK:STDOUT: 1: inst600000C0
18051803
// CHECK:STDOUT: 2: inst600000FB
@@ -1809,16 +1807,18 @@ fn Foo[T:! type](p: T*) -> (T*, ()) {
18091807
// CHECK:STDOUT: 6: inst600000FC
18101808
// CHECK:STDOUT: 7: inst600000FD
18111809
// CHECK:STDOUT: 8: inst60000100
1812-
// CHECK:STDOUT: inst_block60000068:
1813-
// CHECK:STDOUT: 0: inst6000010B
1814-
// CHECK:STDOUT: 1: inst6000010C
1815-
// CHECK:STDOUT: 2: inst6000010D
18161810
// CHECK:STDOUT: inst_block60000069:
1817-
// CHECK:STDOUT: 0: inst6000013D
1818-
// CHECK:STDOUT: 1: inst6000013E
1819-
// CHECK:STDOUT: inst_block6000006A:
18201811
// CHECK:STDOUT: 0: inst60000115
18211812
// CHECK:STDOUT: 1: inst60000116
1813+
// CHECK:STDOUT: inst_block6000006A:
1814+
// CHECK:STDOUT: 0: inst60000061
1815+
// CHECK:STDOUT: 1: inst60000062
1816+
// CHECK:STDOUT: 2: inst600000C0
1817+
// CHECK:STDOUT: 3: inst600000C1
1818+
// CHECK:STDOUT: 4: inst600000FB
1819+
// CHECK:STDOUT: 5: inst600000FC
1820+
// CHECK:STDOUT: 6: inst600000FD
1821+
// CHECK:STDOUT: 7: inst60000117
18221822
// CHECK:STDOUT: inst_block6000006B:
18231823
// CHECK:STDOUT: 0: inst600000FB
18241824
// CHECK:STDOUT: 1: inst600000FC

0 commit comments

Comments
 (0)