authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-04-02 04:01:52-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-04-02 13:45:07-07:00
log4794c6a526ea507984af8aa460a6897da1c7c785
tree9759a25622c30ef37b78da25aa4f2063770b1885
parentd2be725e4b14c33dbd39054e33d926913eee3cd4

Sema: fix crash accessing array of opv types

Closes #19499

2 files changed, 19 insertions(+), 2 deletions(-)

src/Sema.zig+8-2
...@@ -27979,6 +27979,8 @@ fn structFieldVal(...@@ -27979,6 +27979,8 @@ fn structFieldVal(
27979 }27979 }
2798027980
27981 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]);27981 const field_ty = Type.fromInterned(struct_type.field_types.get(ip)[field_index]);
27982 if (try sema.typeHasOnePossibleValue(field_ty)) |field_val|
27983 return Air.internedToRef(field_val.toIntern());
2798227984
27983 if (try sema.resolveValue(struct_byval)) |struct_val| {27985 if (try sema.resolveValue(struct_byval)) |struct_val| {
27984 if (struct_val.isUndef(mod)) return mod.undefRef(field_ty);27986 if (struct_val.isUndef(mod)) return mod.undefRef(field_ty);
...@@ -28620,8 +28622,6 @@ fn elemValArray(...@@ -28620,8 +28622,6 @@ fn elemValArray(
28620 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, array_ty, array_src);28622 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, array_ty, array_src);
2862128623
28622 const runtime_src = if (maybe_undef_array_val != null) elem_index_src else array_src;28624 const runtime_src = if (maybe_undef_array_val != null) elem_index_src else array_src;
28623 try sema.requireRuntimeBlock(block, src, runtime_src);
28624 try sema.queueFullTypeResolution(array_ty);
28625 if (oob_safety and block.wantSafety()) {28625 if (oob_safety and block.wantSafety()) {
28626 // Runtime check is only needed if unable to comptime check28626 // Runtime check is only needed if unable to comptime check
28627 if (maybe_index_val == null) {28627 if (maybe_index_val == null) {
...@@ -28630,6 +28630,12 @@ fn elemValArray(...@@ -28630,6 +28630,12 @@ fn elemValArray(
28630 try sema.panicIndexOutOfBounds(block, src, elem_index, len_inst, cmp_op);28630 try sema.panicIndexOutOfBounds(block, src, elem_index, len_inst, cmp_op);
28631 }28631 }
28632 }28632 }
28633
28634 if (try sema.typeHasOnePossibleValue(elem_ty)) |elem_val|
28635 return Air.internedToRef(elem_val.toIntern());
28636
28637 try sema.requireRuntimeBlock(block, src, runtime_src);
28638 try sema.queueFullTypeResolution(array_ty);
28633 return block.addBinOp(.array_elem_val, array, elem_index);28639 return block.addBinOp(.array_elem_val, array, elem_index);
28634}28640}
2863528641
test/behavior/array.zig+11
...@@ -944,3 +944,14 @@ test "union that needs padding bytes inside an array" {...@@ -944,3 +944,14 @@ test "union that needs padding bytes inside an array" {
944 const a = as[0].B;944 const a = as[0].B;
945 try std.testing.expect(a.D == 1);945 try std.testing.expect(a.D == 1);
946}946}
947
948test "runtime index of array of zero-bit values" {
949 var runtime: struct { array: [1]void, index: usize } = undefined;
950 runtime = .{ .array = .{{}}, .index = 0 };
951 const result = struct { index: usize, value: void }{
952 .index = runtime.index,
953 .value = runtime.array[runtime.index],
954 };
955 try std.testing.expect(result.index == 0);
956 try std.testing.expect(result.value == {});
957}