Sema: add error for enum tag value overflow

Closes #12291
This commit is contained in:
Veikka Tuominen 2022-09-02 15:31:01 +03:00
parent 7a51e0befe
commit a9cdacff95
3 changed files with 21 additions and 5 deletions

View File

@ -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;

View File

@ -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'

View File

@ -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'