zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit e6588857dfb7a4528e698604d31cc2a5e26c0fb8 (tree)
parent 41913ddb1a94591c305870ad2854ecff67ac3242
Author: Veikka Tuominen <git@vexu.eu>
Date:   Sun, 11 Dec 2022 19:32:23 +0200

Sema: fix memory management of union enum tag int tag

This likely went unnoticed due to all power of two integer types being special cased.

Closes #13812

Diffstat:
Msrc/Sema.zig | 5+++--
Mtest/behavior/union.zig | 9+++++++++
2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -30757,16 +30757,17 @@ fn generateUnionTagTypeNumbered( new_decl.name_fully_qualified = true; errdefer mod.abortAnonDecl(new_decl_index); + const copied_int_ty = try int_ty.copy(new_decl_arena_allocator); enum_obj.* = .{ .owner_decl = new_decl_index, - .tag_ty = int_ty, + .tag_ty = copied_int_ty, .fields = .{}, .values = .{}, }; // Here we pre-allocate the maps using the decl arena. try enum_obj.fields.ensureTotalCapacity(new_decl_arena_allocator, fields_len); try enum_obj.values.ensureTotalCapacityContext(new_decl_arena_allocator, fields_len, .{ - .ty = int_ty, + .ty = copied_int_ty, .mod = mod, }); try new_decl.finalizeNewArena(&new_decl_arena); diff --git a/test/behavior/union.zig b/test/behavior/union.zig @@ -1465,3 +1465,12 @@ test "Namespace-like union" { var a: DepType.Version.Git = .tag; try expect(a.frozen()); } + +test "union int tag type is properly managed" { + const Bar = union(enum(u2)) { + x: bool, + y: u8, + z: u8, + }; + try expect(@sizeOf(Bar) + 1 == 3); +}