mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 11:41:06 +01:00
Change the builtin enum approach to enforce addition. (#2584)
It feels like every time I add a builtin, I forget to add it to the builtin IR. This approach enforces the addition of builtin nodes, and also takes advantage of the normalized structure to set types appropriately (I think the new approach is simpler on this aspect).
This commit is contained in:
@@ -14,33 +14,19 @@ namespace Carbon {
|
||||
|
||||
auto SemanticsIR::MakeBuiltinIR() -> SemanticsIR {
|
||||
SemanticsIR semantics(/*builtin_ir=*/nullptr);
|
||||
auto block_id = semantics.AddNodeBlock();
|
||||
semantics.nodes_.reserve(SemanticsBuiltinKind::ValidCount);
|
||||
|
||||
constexpr int32_t TypeOfTypeType = 0;
|
||||
auto type_type = semantics.AddNode(
|
||||
block_id, SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::TypeType,
|
||||
SemanticsNodeId(TypeOfTypeType)));
|
||||
CARBON_CHECK(type_type.index == TypeOfTypeType)
|
||||
<< "TypeType's type must be self-referential.";
|
||||
#define CARBON_SEMANTICS_BUILTIN_KIND(Name, Type) \
|
||||
semantics.nodes_.push_back(SemanticsNode::MakeBuiltin( \
|
||||
SemanticsBuiltinKind::Name, SemanticsNodeId::Builtin##Type));
|
||||
#include "toolchain/semantics/semantics_builtin_kind.def"
|
||||
|
||||
constexpr int32_t TypeOfInvalidType = 1;
|
||||
auto invalid_type = semantics.AddNode(
|
||||
block_id, SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::InvalidType,
|
||||
SemanticsNodeId(TypeOfInvalidType)));
|
||||
CARBON_CHECK(invalid_type.index == TypeOfInvalidType)
|
||||
<< "InvalidType's type must be self-referential.";
|
||||
|
||||
semantics.AddNode(
|
||||
block_id,
|
||||
SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::IntegerType, type_type));
|
||||
|
||||
semantics.AddNode(block_id, SemanticsNode::MakeBuiltin(
|
||||
SemanticsBuiltinKind::RealType, type_type));
|
||||
|
||||
CARBON_CHECK(semantics.node_blocks_.size() == 2)
|
||||
<< "BuildBuiltins should produce 2 blocks, actual: "
|
||||
CARBON_CHECK(semantics.node_blocks_.size() == 1)
|
||||
<< "BuildBuiltins should only have the empty block, actual: "
|
||||
<< semantics.node_blocks_.size();
|
||||
CARBON_CHECK(semantics.nodes_.size() == SemanticsBuiltinKind::ValidCount)
|
||||
<< "BuildBuiltins should produce " << SemanticsBuiltinKind::ValidCount
|
||||
<< " nodes, actual: " << semantics.nodes_.size();
|
||||
return semantics;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user