Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 8 additions & 14 deletions src/Sema.zig
Original file line number Diff line number Diff line change
Expand Up @@ -2623,10 +2623,9 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com
// block so that codegen does not see it.
block.instructions.shrinkRetainingCapacity(block.instructions.items.len - 3);
sema.air_values.items[value_index] = try Value.Tag.decl_ref.create(sema.arena, new_decl);
// Would be nice if we could just assign `bitcast_ty_ref` to
// `air_datas[ptr_inst].ty_pl.ty`, wouldn't it? Alas, that is almost correct,
// except that the pointer is mutable and we need to make it constant here.
air_datas[ptr_inst].ty_pl.ty = try sema.addType(final_ptr_ty);
// if bitcast ty ref needs to be made const, make_ptr_const
// ZIR handles it later, so we can just use the ty ref here.
air_datas[ptr_inst].ty_pl.ty = air_datas[bitcast_inst].ty_op.ty;

return;
}
Expand Down Expand Up @@ -11828,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).?;
}
Expand All @@ -11869,15 +11863,15 @@ 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);
}
return alloc;
}

return block.addAggregateInit(array_ty, elems);
return block.addAggregateInit(array_ty, resolved_args);
}

fn zirArrayInitAnon(
Expand Down
18 changes: 15 additions & 3 deletions test/behavior/pointers.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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 {
Expand All @@ -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 {
Expand Down