aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-08-28 13:37:38 +0300
committerVeikka Tuominen <git@vexu.eu>2022-08-28 15:41:21 +0300
commit776caaf99927181a2bb135afa9b502014782691c (patch)
treea67bbeb7166fe7badbed7790024c98c625808e96 /src/Sema.zig
parent6aead18ab332a3cf809b5c824d70cdc52f0e5156 (diff)
downloadzig-776caaf99927181a2bb135afa9b502014782691c.tar.gz
zig-776caaf99927181a2bb135afa9b502014782691c.zip
Sema: fix handling of non-standard int types in empty non-exhaustive enums
Closes #12649
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig15
1 files changed, 3 insertions, 12 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 17d3b02da3..586f1b2ee8 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -2497,18 +2497,6 @@ fn zirEnumDecl(
extra_index = try mod.scanNamespace(&enum_obj.namespace, extra_index, decls_len, new_decl);
const body = sema.code.extra[extra_index..][0..body_len];
- if (fields_len == 0) {
- assert(body.len == 0);
- if (tag_type_ref != .none) {
- const ty = try sema.resolveType(block, tag_ty_src, tag_type_ref);
- if (ty.zigTypeTag() != .Int and ty.zigTypeTag() != .ComptimeInt) {
- return sema.fail(block, tag_ty_src, "expected integer tag type, found '{}'", .{ty.fmt(sema.mod)});
- }
- enum_obj.tag_ty = try ty.copy(new_decl_arena_allocator);
- enum_obj.tag_ty_inferred = false;
- }
- return decl_val;
- }
extra_index += body.len;
const bit_bags_count = std.math.divCeil(usize, fields_len, 32) catch unreachable;
@@ -2566,6 +2554,9 @@ fn zirEnumDecl(
}
enum_obj.tag_ty = try ty.copy(decl_arena_allocator);
enum_obj.tag_ty_inferred = false;
+ } else if (fields_len == 0) {
+ enum_obj.tag_ty = try Type.Tag.int_unsigned.create(decl_arena_allocator, 0);
+ enum_obj.tag_ty_inferred = true;
} else {
const bits = std.math.log2_int_ceil(usize, fields_len);
enum_obj.tag_ty = try Type.Tag.int_unsigned.create(decl_arena_allocator, bits);