From a1fcb516928d1ba1106ea715acd1f6feba95e977 Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Tue, 25 Apr 2023 01:08:35 -0400 Subject: [PATCH] cbe: fix mutability issues with builtin test_functions --- src/Compilation.zig | 2 +- src/Module.zig | 30 ++++++++++++++++++------------ src/codegen/c/type.zig | 12 +----------- test/behavior/basic.zig | 1 + 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/Compilation.zig b/src/Compilation.zig index 00b691f780..f11f158e1b 100644 --- a/src/Compilation.zig +++ b/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) { diff --git a/src/Module.zig b/src/Module.zig index 27f7b24e7a..8460c243d7 100644 --- a/src/Module.zig +++ b/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); } diff --git a/src/codegen/c/type.zig b/src/codegen/c/type.zig index 72ee89df7d..892914ea3d 100644 --- a/src/codegen/c/type.zig +++ b/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(); diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig index d3cd6918f5..c2e47d7334 100644 --- a/test/behavior/basic.zig +++ b/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);