Extend CARBON_KIND_SWITCH to support ArgAndKind (#5216)

This builds on #5212 which is adding ArgAndKind. This further modifies
CARBON_KIND_SWITCH support so that we can use it with ArgAndKind in
addition to Inst. That creates a quirk where it's easier if ArgAndKind
provides `kind` as an accessor instead of a data member, so I'm just
switching it to a class.
This commit is contained in:
Jon Ross-Perkins
2025-03-29 00:37:46 +00:00
committed by GitHub
parent 660d62ecc1
commit 9134e36ec0
10 changed files with 130 additions and 110 deletions
+22 -20
View File
@@ -140,37 +140,39 @@ class DeductionWorklist {
// Adds a (param, arg) pair for an instruction argument, given its kind.
auto AddInstArg(SemIR::Inst::ArgAndKind param, int32_t arg,
bool needs_substitution) -> void {
switch (param.kind) {
CARBON_KIND_SWITCH(param) {
case SemIR::IdKind::None:
case SemIR::IdKind::For<SemIR::ClassId>:
case SemIR::IdKind::For<SemIR::IntKind>:
break;
case SemIR::IdKind::For<SemIR::InstId>:
Add(param.As<SemIR::InstId>(), SemIR::InstId(arg), needs_substitution);
case CARBON_KIND(SemIR::InstId inst_id): {
Add(inst_id, SemIR::InstId(arg), needs_substitution);
break;
case SemIR::IdKind::For<SemIR::TypeId>:
Add(param.As<SemIR::TypeId>(), SemIR::TypeId(arg), needs_substitution);
}
case CARBON_KIND(SemIR::TypeId type_id): {
Add(type_id, SemIR::TypeId(arg), needs_substitution);
break;
case SemIR::IdKind::For<SemIR::StructTypeFieldsId>:
AddAll(param.As<SemIR::StructTypeFieldsId>(),
SemIR::StructTypeFieldsId(arg), needs_substitution);
}
case CARBON_KIND(SemIR::StructTypeFieldsId fields_id): {
AddAll(fields_id, SemIR::StructTypeFieldsId(arg), needs_substitution);
break;
case SemIR::IdKind::For<SemIR::InstBlockId>:
AddAll(param.As<SemIR::InstBlockId>(), SemIR::InstBlockId(arg),
needs_substitution);
}
case CARBON_KIND(SemIR::InstBlockId inst_block_id): {
AddAll(inst_block_id, SemIR::InstBlockId(arg), needs_substitution);
break;
case SemIR::IdKind::For<SemIR::TypeBlockId>:
AddAll(param.As<SemIR::TypeBlockId>(), SemIR::TypeBlockId(arg),
needs_substitution);
}
case CARBON_KIND(SemIR::TypeBlockId type_block_id): {
AddAll(type_block_id, SemIR::TypeBlockId(arg), needs_substitution);
break;
case SemIR::IdKind::For<SemIR::SpecificId>:
Add(param.As<SemIR::SpecificId>(), SemIR::SpecificId(arg),
needs_substitution);
}
case CARBON_KIND(SemIR::SpecificId specific_id): {
Add(specific_id, SemIR::SpecificId(arg), needs_substitution);
break;
case SemIR::IdKind::For<SemIR::FacetTypeId>:
AddAll(param.As<SemIR::FacetTypeId>(), SemIR::FacetTypeId(arg),
needs_substitution);
}
case CARBON_KIND(SemIR::FacetTypeId facet_type_id): {
AddAll(facet_type_id, SemIR::FacetTypeId(arg), needs_substitution);
break;
}
default:
CARBON_FATAL("unexpected argument kind");
}