aboutsummaryrefslogtreecommitdiff
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
parent7a51e0befe12c9d17e39f736027a205b1f19bdc6 (diff)
downloadzig-a9cdacff95a2a6f60945c7b2a299f9f66bd94ddb.tar.gz
zig-a9cdacff95a2a6f60945c7b2a299f9f66bd94ddb.zip
Sema: add error for enum tag value overflow
Closes #12291
-rw-r--r--src/Sema.zig16
-rw-r--r--test/cases/compile_errors/overflow_in_enum_value_allocation.zig (renamed from test/cases/compile_errors/stage1/obj/overflow_in_enum_value_allocation.zig)6
-rw-r--r--test/cases/compile_errors/specify_enum_tag_type_that_is_too_small.zig (renamed from test/cases/compile_errors/stage1/obj/specify_enum_tag_type_that_is_too_small.zig)4
3 files changed, 21 insertions, 5 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;
diff --git a/test/cases/compile_errors/stage1/obj/overflow_in_enum_value_allocation.zig b/test/cases/compile_errors/overflow_in_enum_value_allocation.zig
index c5dc5c1dcf..2a5b55e86d 100644
--- a/test/cases/compile_errors/stage1/obj/overflow_in_enum_value_allocation.zig
+++ b/test/cases/compile_errors/overflow_in_enum_value_allocation.zig
@@ -2,13 +2,13 @@ const Moo = enum(u8) {
Last = 255,
Over,
};
-pub fn main() void {
+pub export fn entry() void {
var y = Moo.Last;
_ = y;
}
// error
-// backend=stage1
+// backend=stage2
// target=native
//
-// tmp.zig:3:5: error: enumeration value 256 too large for type 'u8'
+// :3:5: error: enumeration value '256' too large for type 'u8'
diff --git a/test/cases/compile_errors/stage1/obj/specify_enum_tag_type_that_is_too_small.zig b/test/cases/compile_errors/specify_enum_tag_type_that_is_too_small.zig
index dc7077c8f8..d878bec18b 100644
--- a/test/cases/compile_errors/stage1/obj/specify_enum_tag_type_that_is_too_small.zig
+++ b/test/cases/compile_errors/specify_enum_tag_type_that_is_too_small.zig
@@ -12,7 +12,7 @@ export fn entry() void {
}
// error
-// backend=stage1
+// backend=stage2
// target=native
//
-// tmp.zig:6:5: error: enumeration value 4 too large for type 'u2'
+// :6:5: error: enumeration value '4' too large for type 'u2'