Skip to content

Commit d0551db

Browse files
committed
introduce the enum literal type
see #683
1 parent 64dddd7 commit d0551db

File tree

16 files changed

+195
-3
lines changed

16 files changed

+195
-3
lines changed

src-self-hosted/ir.zig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,7 @@ pub const Builder = struct {
11861186
ast.Node.Id.AsyncAttribute => return error.Unimplemented,
11871187
ast.Node.Id.ParamDecl => return error.Unimplemented,
11881188
ast.Node.Id.FieldInitializer => return error.Unimplemented,
1189+
ast.Node.Id.EnumLiteral => return error.Unimplemented,
11891190
}
11901191
}
11911192

src-self-hosted/type.zig

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub const Type = struct {
3232
Id.Array => @fieldParentPtr(Array, "base", base).destroy(comp),
3333
Id.ComptimeFloat => @fieldParentPtr(ComptimeFloat, "base", base).destroy(comp),
3434
Id.ComptimeInt => @fieldParentPtr(ComptimeInt, "base", base).destroy(comp),
35+
Id.EnumLiteral => @fieldParentPtr(EnumLiteral, "base", base).destroy(comp),
3536
Id.Undefined => @fieldParentPtr(Undefined, "base", base).destroy(comp),
3637
Id.Null => @fieldParentPtr(Null, "base", base).destroy(comp),
3738
Id.Optional => @fieldParentPtr(Optional, "base", base).destroy(comp),
@@ -65,6 +66,7 @@ pub const Type = struct {
6566
Id.Array => return @fieldParentPtr(Array, "base", base).getLlvmType(allocator, llvm_context),
6667
Id.ComptimeFloat => unreachable,
6768
Id.ComptimeInt => unreachable,
69+
Id.EnumLiteral => unreachable,
6870
Id.Undefined => unreachable,
6971
Id.Null => unreachable,
7072
Id.Optional => return @fieldParentPtr(Optional, "base", base).getLlvmType(allocator, llvm_context),
@@ -85,6 +87,7 @@ pub const Type = struct {
8587
Id.Type,
8688
Id.ComptimeFloat,
8789
Id.ComptimeInt,
90+
Id.EnumLiteral,
8891
Id.Undefined,
8992
Id.Null,
9093
Id.BoundFn,
@@ -118,6 +121,7 @@ pub const Type = struct {
118121
Id.Type,
119122
Id.ComptimeFloat,
120123
Id.ComptimeInt,
124+
Id.EnumLiteral,
121125
Id.Undefined,
122126
Id.Null,
123127
Id.BoundFn,
@@ -940,6 +944,20 @@ pub const Type = struct {
940944
}
941945
};
942946

947+
pub const EnumLiteral = struct {
948+
base: Type,
949+
950+
/// Adds 1 reference to the resulting type
951+
pub fn get(comp: *Compilation) *EnumLiteral {
952+
comp.comptime_int_type.base.base.ref();
953+
return comp.comptime_int_type;
954+
}
955+
956+
pub fn destroy(self: *EnumLiteral, comp: *Compilation) void {
957+
comp.gpa().destroy(self);
958+
}
959+
};
960+
943961
pub const Undefined = struct {
944962
base: Type,
945963

src/all_types.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ struct ConstExprValue {
317317
ConstArrayValue x_array;
318318
ConstPtrValue x_ptr;
319319
ConstArgTuple x_arg_tuple;
320+
Buf *x_enum_literal;
320321

321322
// populated if special == ConstValSpecialRuntime
322323
RuntimeHintErrorUnion rh_error_union;
@@ -468,6 +469,7 @@ enum NodeType {
468469
NodeTypeAwaitExpr,
469470
NodeTypeSuspend,
470471
NodeTypePromiseType,
472+
NodeTypeEnumLiteral,
471473
};
472474

473475
enum CallingConvention {
@@ -929,6 +931,11 @@ struct AstNodePromiseType {
929931
AstNode *payload_type; // can be NULL
930932
};
931933

934+
struct AstNodeEnumLiteral {
935+
Token *period;
936+
Token *identifier;
937+
};
938+
932939
struct AstNode {
933940
enum NodeType type;
934941
size_t line;
@@ -989,6 +996,7 @@ struct AstNode {
989996
AstNodeAwaitExpr await_expr;
990997
AstNodeSuspend suspend;
991998
AstNodePromiseType promise_type;
999+
AstNodeEnumLiteral enum_literal;
9921000
} data;
9931001
};
9941002

@@ -1252,6 +1260,7 @@ enum ZigTypeId {
12521260
ZigTypeIdOpaque,
12531261
ZigTypeIdPromise,
12541262
ZigTypeIdVector,
1263+
ZigTypeIdEnumLiteral,
12551264
};
12561265

12571266
enum OnePossibleValue {
@@ -1741,6 +1750,7 @@ struct CodeGen {
17411750
ZigType *entry_global_error_set;
17421751
ZigType *entry_arg_tuple;
17431752
ZigType *entry_promise;
1753+
ZigType *entry_enum_literal;
17441754
} builtin_types;
17451755
ZigType *align_amt_type;
17461756
ZigType *stack_trace_type;

src/analyze.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ AstNode *type_decl_node(ZigType *type_entry) {
242242
case ZigTypeIdArray:
243243
case ZigTypeIdComptimeFloat:
244244
case ZigTypeIdComptimeInt:
245+
case ZigTypeIdEnumLiteral:
245246
case ZigTypeIdUndefined:
246247
case ZigTypeIdNull:
247248
case ZigTypeIdOptional:
@@ -303,6 +304,7 @@ bool type_is_resolved(ZigType *type_entry, ResolveStatus status) {
303304
case ZigTypeIdArray:
304305
case ZigTypeIdComptimeFloat:
305306
case ZigTypeIdComptimeInt:
307+
case ZigTypeIdEnumLiteral:
306308
case ZigTypeIdUndefined:
307309
case ZigTypeIdNull:
308310
case ZigTypeIdOptional:
@@ -1463,6 +1465,7 @@ static Error emit_error_unless_type_allowed_in_packed_struct(CodeGen *g, ZigType
14631465
case ZigTypeIdUnreachable:
14641466
case ZigTypeIdComptimeFloat:
14651467
case ZigTypeIdComptimeInt:
1468+
case ZigTypeIdEnumLiteral:
14661469
case ZigTypeIdUndefined:
14671470
case ZigTypeIdNull:
14681471
case ZigTypeIdErrorUnion:
@@ -1550,6 +1553,7 @@ bool type_allowed_in_extern(CodeGen *g, ZigType *type_entry) {
15501553
case ZigTypeIdMetaType:
15511554
case ZigTypeIdComptimeFloat:
15521555
case ZigTypeIdComptimeInt:
1556+
case ZigTypeIdEnumLiteral:
15531557
case ZigTypeIdUndefined:
15541558
case ZigTypeIdNull:
15551559
case ZigTypeIdErrorUnion:
@@ -1712,6 +1716,7 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc
17121716
return g->builtin_types.entry_invalid;
17131717
case ZigTypeIdComptimeFloat:
17141718
case ZigTypeIdComptimeInt:
1719+
case ZigTypeIdEnumLiteral:
17151720
case ZigTypeIdBoundFn:
17161721
case ZigTypeIdMetaType:
17171722
case ZigTypeIdVoid:
@@ -1806,6 +1811,7 @@ static ZigType *analyze_fn_type(CodeGen *g, AstNode *proto_node, Scope *child_sc
18061811

18071812
case ZigTypeIdComptimeFloat:
18081813
case ZigTypeIdComptimeInt:
1814+
case ZigTypeIdEnumLiteral:
18091815
case ZigTypeIdBoundFn:
18101816
case ZigTypeIdMetaType:
18111817
case ZigTypeIdUnreachable:
@@ -3621,6 +3627,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) {
36213627
case NodeTypeAwaitExpr:
36223628
case NodeTypeSuspend:
36233629
case NodeTypePromiseType:
3630+
case NodeTypeEnumLiteral:
36243631
zig_unreachable();
36253632
}
36263633
}
@@ -3658,6 +3665,7 @@ ZigType *validate_var_type(CodeGen *g, AstNode *source_node, ZigType *type_entry
36583665
return g->builtin_types.entry_invalid;
36593666
case ZigTypeIdComptimeFloat:
36603667
case ZigTypeIdComptimeInt:
3668+
case ZigTypeIdEnumLiteral:
36613669
case ZigTypeIdMetaType:
36623670
case ZigTypeIdVoid:
36633671
case ZigTypeIdBool:
@@ -3807,7 +3815,8 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var) {
38073815
implicit_type = g->builtin_types.entry_invalid;
38083816
} else if ((!is_const || linkage == VarLinkageExternal) &&
38093817
(implicit_type->id == ZigTypeIdComptimeFloat ||
3810-
implicit_type->id == ZigTypeIdComptimeInt))
3818+
implicit_type->id == ZigTypeIdComptimeInt ||
3819+
implicit_type->id == ZigTypeIdEnumLiteral))
38113820
{
38123821
add_node_error(g, source_node, buf_sprintf("unable to infer variable type"));
38133822
implicit_type = g->builtin_types.entry_invalid;
@@ -4051,6 +4060,7 @@ static bool is_container(ZigType *type_entry) {
40514060
case ZigTypeIdArray:
40524061
case ZigTypeIdComptimeFloat:
40534062
case ZigTypeIdComptimeInt:
4063+
case ZigTypeIdEnumLiteral:
40544064
case ZigTypeIdUndefined:
40554065
case ZigTypeIdNull:
40564066
case ZigTypeIdOptional:
@@ -4109,6 +4119,7 @@ void resolve_container_type(CodeGen *g, ZigType *type_entry) {
41094119
case ZigTypeIdArray:
41104120
case ZigTypeIdComptimeFloat:
41114121
case ZigTypeIdComptimeInt:
4122+
case ZigTypeIdEnumLiteral:
41124123
case ZigTypeIdUndefined:
41134124
case ZigTypeIdNull:
41144125
case ZigTypeIdOptional:
@@ -4647,6 +4658,7 @@ bool handle_is_ptr(ZigType *type_entry) {
46474658
case ZigTypeIdMetaType:
46484659
case ZigTypeIdComptimeFloat:
46494660
case ZigTypeIdComptimeInt:
4661+
case ZigTypeIdEnumLiteral:
46504662
case ZigTypeIdUndefined:
46514663
case ZigTypeIdNull:
46524664
case ZigTypeIdBoundFn:
@@ -4827,6 +4839,8 @@ static uint32_t hash_const_val(ConstExprValue *const_val) {
48274839
}
48284840
return result;
48294841
}
4842+
case ZigTypeIdEnumLiteral:
4843+
return buf_hash(const_val->data.x_enum_literal) * 2691276464;
48304844
case ZigTypeIdEnum:
48314845
{
48324846
uint32_t result = 31643936;
@@ -4974,6 +4988,7 @@ static bool can_mutate_comptime_var_state(ConstExprValue *value) {
49744988
case ZigTypeIdFloat:
49754989
case ZigTypeIdComptimeFloat:
49764990
case ZigTypeIdComptimeInt:
4991+
case ZigTypeIdEnumLiteral:
49774992
case ZigTypeIdUndefined:
49784993
case ZigTypeIdNull:
49794994
case ZigTypeIdBoundFn:
@@ -5043,6 +5058,7 @@ static bool return_type_is_cacheable(ZigType *return_type) {
50435058
case ZigTypeIdFloat:
50445059
case ZigTypeIdComptimeFloat:
50455060
case ZigTypeIdComptimeInt:
5061+
case ZigTypeIdEnumLiteral:
50465062
case ZigTypeIdUndefined:
50475063
case ZigTypeIdNull:
50485064
case ZigTypeIdBoundFn:
@@ -5173,6 +5189,7 @@ OnePossibleValue type_has_one_possible_value(CodeGen *g, ZigType *type_entry) {
51735189
case ZigTypeIdOpaque:
51745190
case ZigTypeIdComptimeFloat:
51755191
case ZigTypeIdComptimeInt:
5192+
case ZigTypeIdEnumLiteral:
51765193
case ZigTypeIdMetaType:
51775194
case ZigTypeIdBoundFn:
51785195
case ZigTypeIdArgTuple:
@@ -5236,6 +5253,7 @@ ReqCompTime type_requires_comptime(CodeGen *g, ZigType *type_entry) {
52365253
zig_unreachable();
52375254
case ZigTypeIdComptimeFloat:
52385255
case ZigTypeIdComptimeInt:
5256+
case ZigTypeIdEnumLiteral:
52395257
case ZigTypeIdUndefined:
52405258
case ZigTypeIdNull:
52415259
case ZigTypeIdMetaType:
@@ -5794,6 +5812,8 @@ bool const_values_equal(CodeGen *g, ConstExprValue *a, ConstExprValue *b) {
57945812
case ZigTypeIdInt:
57955813
case ZigTypeIdComptimeInt:
57965814
return bigint_cmp(&a->data.x_bigint, &b->data.x_bigint) == CmpEQ;
5815+
case ZigTypeIdEnumLiteral:
5816+
return buf_eql_buf(a->data.x_enum_literal, b->data.x_enum_literal);
57975817
case ZigTypeIdPointer:
57985818
case ZigTypeIdFn:
57995819
return const_values_equal_ptr(a, b);
@@ -6044,6 +6064,9 @@ void render_const_value(CodeGen *g, Buf *buf, ConstExprValue *const_val) {
60446064
case ZigTypeIdInt:
60456065
bigint_append_buf(buf, &const_val->data.x_bigint, 10);
60466066
return;
6067+
case ZigTypeIdEnumLiteral:
6068+
buf_append_buf(buf, const_val->data.x_enum_literal);
6069+
return;
60476070
case ZigTypeIdMetaType:
60486071
buf_appendf(buf, "%s", buf_ptr(&const_val->data.x_type->name));
60496072
return;
@@ -6213,6 +6236,7 @@ uint32_t type_id_hash(TypeId x) {
62136236
case ZigTypeIdStruct:
62146237
case ZigTypeIdComptimeFloat:
62156238
case ZigTypeIdComptimeInt:
6239+
case ZigTypeIdEnumLiteral:
62166240
case ZigTypeIdUndefined:
62176241
case ZigTypeIdNull:
62186242
case ZigTypeIdOptional:
@@ -6260,6 +6284,7 @@ bool type_id_eql(TypeId a, TypeId b) {
62606284
case ZigTypeIdStruct:
62616285
case ZigTypeIdComptimeFloat:
62626286
case ZigTypeIdComptimeInt:
6287+
case ZigTypeIdEnumLiteral:
62636288
case ZigTypeIdUndefined:
62646289
case ZigTypeIdNull:
62656290
case ZigTypeIdOptional:
@@ -6439,6 +6464,7 @@ static const ZigTypeId all_type_ids[] = {
64396464
ZigTypeIdOpaque,
64406465
ZigTypeIdPromise,
64416466
ZigTypeIdVector,
6467+
ZigTypeIdEnumLiteral,
64426468
};
64436469

64446470
ZigTypeId type_id_at_index(size_t index) {
@@ -6504,6 +6530,8 @@ size_t type_id_index(ZigType *entry) {
65046530
return 22;
65056531
case ZigTypeIdVector:
65066532
return 23;
6533+
case ZigTypeIdEnumLiteral:
6534+
return 24;
65076535
}
65086536
zig_unreachable();
65096537
}
@@ -6534,6 +6562,8 @@ const char *type_id_name(ZigTypeId id) {
65346562
return "ComptimeFloat";
65356563
case ZigTypeIdComptimeInt:
65366564
return "ComptimeInt";
6565+
case ZigTypeIdEnumLiteral:
6566+
return "EnumLiteral";
65376567
case ZigTypeIdUndefined:
65386568
return "Undefined";
65396569
case ZigTypeIdNull:

src/ast_render.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,8 @@ static const char *node_type_str(NodeType node_type) {
259259
return "PromiseType";
260260
case NodeTypePointerType:
261261
return "PointerType";
262+
case NodeTypeEnumLiteral:
263+
return "EnumLiteral";
262264
}
263265
zig_unreachable();
264266
}
@@ -1154,6 +1156,11 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
11541156
}
11551157
break;
11561158
}
1159+
case NodeTypeEnumLiteral:
1160+
{
1161+
fprintf(ar->f, ".%s", buf_ptr(&node->data.enum_literal.identifier->data.str_lit.str));
1162+
break;
1163+
}
11571164
case NodeTypeParamDecl:
11581165
case NodeTypeTestDecl:
11591166
case NodeTypeStructField:

0 commit comments

Comments
 (0)