aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-02-08 20:33:45 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-02-09 10:28:48 +0100
commite5ce87f1b198bfcb022e9ea91f2a9a58b1b75026 (patch)
tree19edf20a27751a4c96a2c5a63f9328de1923bd52
parent4d1e5ef730630badf92a613cdc57a42d2321df12 (diff)
downloadzig-e5ce87f1b198bfcb022e9ea91f2a9a58b1b75026.tar.gz
zig-e5ce87f1b198bfcb022e9ea91f2a9a58b1b75026.zip
stage2: handle decl ref to void types
Fixes behavior test 1914
-rw-r--r--src/codegen.zig17
-rw-r--r--test/behavior/bugs/1914.zig4
2 files changed, 6 insertions, 15 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 5873fd439c..d1c249d99d 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -487,19 +487,14 @@ fn lowerDeclRef(
return Result{ .appended = {} };
}
+ const target = bin_file.options.target;
+ const ptr_width = target.cpu.arch.ptrBitWidth();
const is_fn_body = decl.ty.zigTypeTag() == .Fn;
if (!is_fn_body and !decl.ty.hasRuntimeBits()) {
- return Result{
- .fail = try ErrorMsg.create(
- bin_file.allocator,
- src_loc,
- "TODO handle void types when lowering decl ref",
- .{},
- ),
- };
+ try code.writer().writeByteNTimes(0xaa, @divExact(ptr_width, 8));
+ return Result{ .appended = {} };
}
- if (decl.analysis != .complete) return error.AnalysisFail;
decl.markAlive();
const vaddr = vaddr: {
if (bin_file.cast(link.File.MachO)) |macho_file| {
@@ -510,8 +505,8 @@ fn lowerDeclRef(
break :vaddr bin_file.getDeclVAddr(decl);
};
- const endian = bin_file.options.target.cpu.arch.endian();
- switch (bin_file.options.target.cpu.arch.ptrBitWidth()) {
+ const endian = target.cpu.arch.endian();
+ switch (ptr_width) {
16 => mem.writeInt(u16, try code.addManyAsArray(2), @intCast(u16, vaddr), endian),
32 => mem.writeInt(u32, try code.addManyAsArray(4), @intCast(u32, vaddr), endian),
64 => mem.writeInt(u64, try code.addManyAsArray(8), vaddr, endian),
diff --git a/test/behavior/bugs/1914.zig b/test/behavior/bugs/1914.zig
index 6462937351..4ac2b929a2 100644
--- a/test/behavior/bugs/1914.zig
+++ b/test/behavior/bugs/1914.zig
@@ -13,8 +13,6 @@ const a = A{ .b_list_pointer = &b_list };
test "segfault bug" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
- if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
- if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
const assert = std.debug.assert;
const obj = B{ .a_pointer = &a };
assert(obj.a_pointer == &a); // this makes zig crash
@@ -31,8 +29,6 @@ pub const B2 = struct {
var b_value = B2{ .pointer_array = &[_]*A2{} };
test "basic stuff" {
- if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
- if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
std.debug.assert(&b_value == &b_value);
}