stage2: sentinel array init must add sentinel to array value

I didn't realize that the `array` value type has the sentinel on it.
This commit is contained in:
Mitchell Hashimoto 2022-03-08 12:05:12 -08:00
parent cd32b11eb8
commit ba62853d26
No known key found for this signature in database
GPG Key ID: 523D5DC389D273BC
2 changed files with 20 additions and 13 deletions

View File

@ -11827,21 +11827,16 @@ fn zirArrayInit(
});
};
const elems = if (!is_sent)
resolved_args
else
resolved_args[0 .. resolved_args.len - 1];
const opt_runtime_src: ?LazySrcLoc = for (elems) |arg| {
const opt_runtime_src: ?LazySrcLoc = for (resolved_args) |arg| {
const arg_src = src; // TODO better source location
const comptime_known = try sema.isComptimeKnown(block, arg_src, arg);
if (!comptime_known) break arg_src;
} else null;
const runtime_src = opt_runtime_src orelse {
const elem_vals = try sema.arena.alloc(Value, elems.len);
const elem_vals = try sema.arena.alloc(Value, resolved_args.len);
for (elems) |arg, i| {
for (resolved_args) |arg, i| {
// We checked that all args are comptime above.
elem_vals[i] = (sema.resolveMaybeUndefVal(block, src, arg) catch unreachable).?;
}
@ -11868,7 +11863,7 @@ fn zirArrayInit(
});
const elem_ptr_ty_ref = try sema.addType(elem_ptr_ty);
for (elems) |arg, i| {
for (resolved_args) |arg, i| {
const index = try sema.addIntUnsigned(Type.usize, i);
const elem_ptr = try block.addPtrElemPtrTypeRef(alloc, index, elem_ptr_ty_ref);
_ = try block.addBinOp(.store, elem_ptr, arg);
@ -11876,7 +11871,7 @@ fn zirArrayInit(
return alloc;
}
return block.addAggregateInit(array_ty, elems);
return block.addAggregateInit(array_ty, resolved_args);
}
fn zirArrayInitAnon(

View File

@ -317,7 +317,11 @@ test "allow any sentinel" {
}
test "pointer sentinel with enums" {
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
const S = struct {
const Number = enum {
@ -336,7 +340,11 @@ test "pointer sentinel with enums" {
}
test "pointer sentinel with optional element" {
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
const S = struct {
fn doTheTest() !void {
@ -349,7 +357,11 @@ test "pointer sentinel with optional element" {
}
test "pointer sentinel with +inf" {
if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
const S = struct {
fn doTheTest() !void {