aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-09-02 15:31:01 +0300
committerVeikka Tuominen <git@vexu.eu>2022-09-02 17:57:11 +0300
commita9cdacff95a2a6f60945c7b2a299f9f66bd94ddb (patch)
treef2d874e374a192e79a359d62ccf1585bfc09463a /src/Sema.zig
parent7a51e0befe12c9d17e39f736027a205b1f19bdc6 (diff)
downloadzig-a9cdacff95a2a6f60945c7b2a299f9f66bd94ddb.tar.gz
zig-a9cdacff95a2a6f60945c7b2a299f9f66bd94ddb.zip
Sema: add error for enum tag value overflow
Closes #12291
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index a49aec871b..1ee5bf71b1 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -2586,6 +2586,7 @@ fn zirEnumDecl(
var cur_bit_bag: u32 = undefined;
var field_i: u32 = 0;
var last_tag_val: ?Value = null;
+ var tag_val_buf: Value.Payload.U64 = undefined;
while (field_i < fields_len) : (field_i += 1) {
if (field_i % 32 == 0) {
cur_bit_bag = sema.code.extra[bit_bag_index];
@@ -2641,6 +2642,21 @@ fn zirEnumDecl(
.ty = enum_obj.tag_ty,
.mod = mod,
});
+ } else {
+ tag_val_buf = .{
+ .base = .{ .tag = .int_u64 },
+ .data = field_i,
+ };
+ last_tag_val = Value.initPayload(&tag_val_buf.base);
+ }
+
+ if (!(try sema.intFitsInType(block, src, last_tag_val.?, enum_obj.tag_ty, null))) {
+ const tree = try sema.getAstTree(block);
+ const field_src = enumFieldSrcLoc(sema.mod.declPtr(block.src_decl), tree.*, src.node_offset.x, field_i);
+ const msg = try sema.errMsg(block, field_src, "enumeration value '{}' too large for type '{}'", .{
+ last_tag_val.?.fmtValue(enum_obj.tag_ty, mod), enum_obj.tag_ty.fmt(mod),
+ });
+ return sema.failWithOwnedErrorMsg(msg);
}
}
return decl_val;