From e6588857dfb7a4528e698604d31cc2a5e26c0fb8 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 11 Dec 2022 19:32:23 +0200 Subject: [PATCH] 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 --- src/Sema.zig | 5 +++-- test/behavior/union.zig | 9 +++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index edfd1d36e3..74e40687f1 100644 --- 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 index ef1e8bf375..b6ec305eac 100644 --- 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); +}