Commit e6588857df

Veikka Tuominen <git@vexu.eu>
2022-12-11 18:32:23
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
1 parent 41913dd
Changed files (2)
src
test
behavior
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);
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);
+}