Commit a1fcb51692

Jacob Young <jacobly0@users.noreply.github.com>
2023-04-25 07:08:35
cbe: fix mutability issues with builtin test_functions
1 parent f1782c0
Changed files (4)
src
test
behavior
src/codegen/c/type.zig
@@ -1720,17 +1720,7 @@ pub const CType = extern union {
                     } else self.init(.anon_struct);
                 },
 
-                .Opaque => switch (ty.tag()) {
-                    .anyopaque => self.init(.void),
-                    .@"opaque" => {
-                        self.storage = .{ .fwd = .{
-                            .base = .{ .tag = .fwd_struct },
-                            .data = ty.getOwnerDecl(),
-                        } };
-                        self.value = .{ .cty = initPayload(&self.storage.fwd) };
-                    },
-                    else => unreachable,
-                },
+                .Opaque => self.init(.void),
 
                 .Fn => {
                     const info = ty.fnInfo();
src/Compilation.zig
@@ -5265,7 +5265,7 @@ pub fn generateBuiltinZigSource(comp: *Compilation, allocator: Allocator) Alloca
 
     if (comp.bin_file.options.is_test) {
         try buffer.appendSlice(
-            \\pub var test_functions: []std.builtin.TestFn = undefined; // overwritten later
+            \\pub var test_functions: []const std.builtin.TestFn = undefined; // overwritten later
             \\
         );
         if (comp.test_evented_io) {
src/Module.zig
@@ -6439,19 +6439,25 @@ pub fn populateTestFunctions(
         errdefer new_decl_arena.deinit();
         const arena = new_decl_arena.allocator();
 
-        // This copy accesses the old Decl Type/Value so it must be done before `clearValues`.
-        const new_ty = try Type.Tag.const_slice.create(arena, try tmp_test_fn_ty.copy(arena));
-        const new_val = try Value.Tag.slice.create(arena, .{
-            .ptr = try Value.Tag.decl_ref.create(arena, array_decl_index),
-            .len = try Value.Tag.int_u64.create(arena, mod.test_functions.count()),
-        });
+        {
+            // This copy accesses the old Decl Type/Value so it must be done before `clearValues`.
+            const new_ty = try Type.Tag.const_slice.create(arena, try tmp_test_fn_ty.copy(arena));
+            const new_var = try gpa.create(Var);
+            errdefer gpa.destroy(new_var);
+            new_var.* = decl.val.castTag(.variable).?.data.*;
+            new_var.init = try Value.Tag.slice.create(arena, .{
+                .ptr = try Value.Tag.decl_ref.create(arena, array_decl_index),
+                .len = try Value.Tag.int_u64.create(arena, mod.test_functions.count()),
+            });
+            const new_val = try Value.Tag.variable.create(arena, new_var);
 
-        // Since we are replacing the Decl's value we must perform cleanup on the
-        // previous value.
-        decl.clearValues(mod);
-        decl.ty = new_ty;
-        decl.val = new_val;
-        decl.has_tv = true;
+            // Since we are replacing the Decl's value we must perform cleanup on the
+            // previous value.
+            decl.clearValues(mod);
+            decl.ty = new_ty;
+            decl.val = new_val;
+            decl.has_tv = true;
+        }
 
         try decl.finalizeNewArena(&new_decl_arena);
     }
test/behavior/basic.zig
@@ -774,6 +774,7 @@ test "extern variable with non-pointer opaque type" {
     if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
     if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
 
     @export(var_to_export, .{ .name = "opaque_extern_var" });
     try expect(@ptrCast(*align(1) u32, &opaque_extern_var).* == 42);