Add getEnumTag and injectEnumTag builtins

This commit is contained in:
Alejandro Alonso
2023-12-08 10:17:22 -08:00
parent d270dade42
commit 49b0a23561
12 changed files with 169 additions and 0 deletions

View File

@@ -1975,6 +1975,26 @@ static ValueDecl *getPackLength(ASTContext &ctx, Identifier id) {
return builder.build(id);
}
static ValueDecl *getGetEnumTag(ASTContext &ctx, Identifier id) {
BuiltinFunctionBuilder builder(ctx, /* genericParamCount */ 1);
auto paramTy = makeGenericParam();
builder.addParameter(paramTy);
builder.setResult(makeConcrete(BuiltinIntegerType::get(32, ctx)));
return builder.build(id);
}
static ValueDecl *getInjectEnumTag(ASTContext &ctx, Identifier id) {
BuiltinFunctionBuilder builder(ctx, /* genericParamCount */ 1);
builder.addParameter(makeGenericParam(), ParamSpecifier::InOut);
builder.addParameter(makeConcrete(BuiltinIntegerType::get(32, ctx)));
builder.setResult(makeConcrete(TupleType::getEmpty(ctx)));
return builder.build(id);
}
/// An array of the overloaded builtin kinds.
static const OverloadedBuiltinKind OverloadedBuiltinKinds[] = {
OverloadedBuiltinKind::None,
@@ -3006,6 +3026,12 @@ ValueDecl *swift::getBuiltinValueDecl(ASTContext &Context, Identifier Id) {
case BuiltinValueKind::PackLength:
return getPackLength(Context, Id);
case BuiltinValueKind::GetEnumTag:
return getGetEnumTag(Context, Id);
case BuiltinValueKind::InjectEnumTag:
return getInjectEnumTag(Context, Id);
}
llvm_unreachable("bad builtin value!");