diff --git a/toolchain/check/custom_witness.cpp b/toolchain/check/custom_witness.cpp index 704fc9798ac4..510a784c662a 100644 --- a/toolchain/check/custom_witness.cpp +++ b/toolchain/check/custom_witness.cpp @@ -551,45 +551,13 @@ auto BuildCustomWitness(Context& context, SemIR::LocId loc_id, } auto AsCoreIdentifier(SemIR::CoreInterface core_interface) -> CoreIdentifier { - using SemIR::CoreInterface; switch (core_interface) { - case CoreInterface::AddAssignWith: - return CoreIdentifier::AddAssignWith; - case CoreInterface::AddWith: - return CoreIdentifier::AddWith; - case CoreInterface::Copy: - return CoreIdentifier::Copy; - case CoreInterface::CppUnsafeDeref: - return CoreIdentifier::CppUnsafeDeref; - case CoreInterface::Dec: - return CoreIdentifier::Dec; - case CoreInterface::Default: - return CoreIdentifier::Default; - case CoreInterface::Destroy: - return CoreIdentifier::Destroy; - case CoreInterface::DivAssignWith: - return CoreIdentifier::DivAssignWith; - case CoreInterface::DivWith: - return CoreIdentifier::DivWith; - case CoreInterface::Inc: - return CoreIdentifier::Inc; - case CoreInterface::IntFitsIn: - return CoreIdentifier::IntFitsIn; - case CoreInterface::ModAssignWith: - return CoreIdentifier::ModAssignWith; - case CoreInterface::ModWith: - return CoreIdentifier::ModWith; - case CoreInterface::MulAssignWith: - return CoreIdentifier::MulAssignWith; - case CoreInterface::MulWith: - return CoreIdentifier::MulWith; - case CoreInterface::Negate: - return CoreIdentifier::Negate; - case CoreInterface::SubAssignWith: - return CoreIdentifier::SubAssignWith; - case CoreInterface::SubWith: - return CoreIdentifier::SubWith; - case CoreInterface::Unknown: +#define CARBON_SEM_IR_CORE_INTERFACE_EXCLUDE_UNKNOWN +#define CARBON_SEM_IR_CORE_INTERFACE_KIND(Name) \ + case SemIR::CoreInterface::Name: \ + return CoreIdentifier::Name; +#include "toolchain/sem_ir/core_interface_kind.def" + case SemIR::CoreInterface::Unknown: CARBON_FATAL("{0} doesn't have a `CoreIdentifier` mapping", core_interface); } diff --git a/toolchain/check/handle_interface.cpp b/toolchain/check/handle_interface.cpp index 61311479e9f0..9345a5214800 100644 --- a/toolchain/check/handle_interface.cpp +++ b/toolchain/check/handle_interface.cpp @@ -91,26 +91,13 @@ static auto BuildInterfaceDecl(Context& context, if (context.sem_ir().package_id() == PackageNameId::Core) { auto name = context.names().GetIRBaseName(interface_info.name_id); + // This is awful for readability, but it's the only viable way to ensure + // adding new core interfaces are automatically picked up. interface_info.core_interface = llvm::StringSwitch(name) - .Case("AddAssignWith", SemIR::CoreInterface::AddAssignWith) - .Case("AddWith", SemIR::CoreInterface::AddWith) - .Case("Copy", SemIR::CoreInterface::Copy) - .Case("CppUnsafeDeref", SemIR::CoreInterface::CppUnsafeDeref) - .Case("Dec", SemIR::CoreInterface::Dec) - .Case("Default", SemIR::CoreInterface::Default) - .Case("Destroy", SemIR::CoreInterface::Destroy) - .Case("DivAssignWith", SemIR::CoreInterface::DivAssignWith) - .Case("DivWith", SemIR::CoreInterface::DivWith) - .Case("Inc", SemIR::CoreInterface::Inc) - .Case("IntFitsIn", SemIR::CoreInterface::IntFitsIn) - .Case("ModAssignWith", SemIR::CoreInterface::ModAssignWith) - .Case("ModWith", SemIR::CoreInterface::ModWith) - .Case("MulAssignWith", SemIR::CoreInterface::MulAssignWith) - .Case("MulWith", SemIR::CoreInterface::MulWith) - .Case("Negate", SemIR::CoreInterface::Negate) - .Case("SubAssignWith", SemIR::CoreInterface::SubAssignWith) - .Case("SubWith", SemIR::CoreInterface::SubWith) +#define CARBON_SEM_IR_CORE_INTERFACE_KIND(Name) \ + .Case(#Name, SemIR::CoreInterface::Name) +#include "toolchain/sem_ir/core_interface_kind.def" .Default(SemIR::CoreInterface::Unknown); } interface_decl.interface_id = context.interfaces().Add(interface_info); diff --git a/toolchain/sem_ir/core_interface_kind.def b/toolchain/sem_ir/core_interface_kind.def index bee6546beea8..098bed023697 100644 --- a/toolchain/sem_ir/core_interface_kind.def +++ b/toolchain/sem_ir/core_interface_kind.def @@ -35,6 +35,9 @@ CARBON_SEM_IR_CORE_INTERFACE_KIND(Negate) CARBON_SEM_IR_CORE_INTERFACE_KIND(SubAssignWith) CARBON_SEM_IR_CORE_INTERFACE_KIND(SubWith) +#ifndef CARBON_SEM_IR_CORE_INTERFACE_EXCLUDE_UNKNOWN CARBON_SEM_IR_CORE_INTERFACE_KIND(Unknown) +#endif // CARBON_SEM_IR_CORE_INTERFACE_EXCLUDE_UNKNOWN #undef CARBON_SEM_IR_CORE_INTERFACE_KIND +#undef CARBON_SEM_IR_CORE_INTERFACE_EXCLUDE_UNKNOWN