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); +}