From 71a9b35c0f853a4af49470f83763578eb4cf06e0 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 21 Jul 2025 15:34:57 -0700 Subject: [PATCH 1/6] Sema: fix missed pointer access OPV --- src/Sema.zig | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Sema.zig b/src/Sema.zig index 40ac0f958c..abd010a94b 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -28214,12 +28214,12 @@ fn elemVal( .many, .c => { const maybe_indexable_val = try sema.resolveDefinedValue(block, indexable_src, indexable); const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index); + const elem_ty = indexable_ty.elemType2(zcu); ct: { const indexable_val = maybe_indexable_val orelse break :ct; const index_val = maybe_index_val orelse break :ct; const index: usize = @intCast(try index_val.toUnsignedIntSema(pt)); - const elem_ty = indexable_ty.elemType2(zcu); const many_ptr_ty = try pt.manyConstPtrType(elem_ty); const many_ptr_val = try pt.getCoerced(indexable_val, many_ptr_ty); const elem_ptr_ty = try pt.singleConstPtrType(elem_ty); @@ -28228,6 +28228,10 @@ fn elemVal( return Air.internedToRef((try pt.getCoerced(elem_val, elem_ty)).toIntern()); } + if (try sema.typeHasOnePossibleValue(elem_ty)) |elem_only_value| { + return Air.internedToRef(elem_only_value.toIntern()); + } + try sema.checkLogicalPtrOperation(block, src, indexable_ty); return block.addBinOp(.ptr_elem_val, indexable, elem_index); }, From 0958ea339129f9ed8c9c07c2c3fbb34fc758b62f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 21 Jul 2025 15:45:17 -0700 Subject: [PATCH 2/6] Sema: fix missed slice access OPV --- src/Sema.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Sema.zig b/src/Sema.zig index abd010a94b..8cbb17cd8b 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -28582,6 +28582,10 @@ fn elemValSlice( } } + if (try sema.typeHasOnePossibleValue(elem_ty)) |elem_only_value| { + return Air.internedToRef(elem_only_value.toIntern()); + } + try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, slice_ty, slice_src); try sema.validateRuntimeValue(block, slice_src, slice); From cb6702f42d1325d3c751a74bd7e5398d404c07f4 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 21 Jul 2025 15:56:52 -0700 Subject: [PATCH 3/6] Sema: fix missed union init OPV --- src/Sema.zig | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index 8cbb17cd8b..6f7abc83c3 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -5000,9 +5000,11 @@ fn validateUnionInit( } if (init_ref) |v| try sema.validateRuntimeValue(block, block.nodeOffset(field_ptr_data.src_node), v); - const new_tag = Air.internedToRef(tag_val.toIntern()); - const set_tag_inst = try block.addBinOp(.set_union_tag, union_ptr, new_tag); - try sema.checkComptimeKnownStore(block, set_tag_inst, LazySrcLoc.unneeded); // `unneeded` since this isn't a "proper" store + if ((try sema.typeHasOnePossibleValue(tag_ty)) == null) { + const new_tag = Air.internedToRef(tag_val.toIntern()); + const set_tag_inst = try block.addBinOp(.set_union_tag, union_ptr, new_tag); + try sema.checkComptimeKnownStore(block, set_tag_inst, LazySrcLoc.unneeded); // `unneeded` since this isn't a "proper" store + } } fn validateStructInit( @@ -19690,8 +19692,10 @@ fn zirStructInit( const base_ptr = try sema.optEuBasePtrInit(block, alloc, src); const field_ptr = try sema.unionFieldPtr(block, field_src, base_ptr, field_name, field_src, resolved_ty, true); try sema.storePtr(block, src, field_ptr, init_inst); - const new_tag = Air.internedToRef(tag_val.toIntern()); - _ = try block.addBinOp(.set_union_tag, base_ptr, new_tag); + if ((try sema.typeHasOnePossibleValue(tag_ty)) == null) { + const new_tag = Air.internedToRef(tag_val.toIntern()); + _ = try block.addBinOp(.set_union_tag, base_ptr, new_tag); + } return sema.makePtrConst(block, alloc); } From 63f672d3228c2cdd97ab0934b888931a67ce887f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 21 Jul 2025 16:07:20 -0700 Subject: [PATCH 4/6] Sema: fix missed union access OPV --- src/Sema.zig | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Sema.zig b/src/Sema.zig index 6f7abc83c3..1e3140528a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -28083,10 +28083,16 @@ fn unionFieldVal( const active_tag = try block.addTyOp(.get_union_tag, .fromInterned(union_obj.enum_tag_ty), union_byval); try sema.addSafetyCheckInactiveUnionField(block, src, active_tag, wanted_tag); } + if (field_ty.zigTypeTag(zcu) == .noreturn) { _ = try block.addNoOp(.unreach); return .unreachable_value; } + + if (try sema.typeHasOnePossibleValue(field_ty)) |field_only_value| { + return Air.internedToRef(field_only_value.toIntern()); + } + try field_ty.resolveLayout(pt); return block.addStructFieldVal(union_byval, field_index, field_ty); } From 85b997b346aac7d5dc51f9b49ba7596db1b407b0 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 21 Jul 2025 16:11:26 -0700 Subject: [PATCH 5/6] Sema: fix missed error union OPV --- src/Sema.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Sema.zig b/src/Sema.zig index 1e3140528a..f3cca1ea6a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -9058,6 +9058,10 @@ fn analyzeErrUnionPayload( try sema.addSafetyCheckUnwrapError(block, src, operand, .unwrap_errunion_err, .is_non_err); } + if (try sema.typeHasOnePossibleValue(payload_ty)) |payload_only_value| { + return Air.internedToRef(payload_only_value.toIntern()); + } + return block.addTyOp(.unwrap_errunion_payload, payload_ty, operand); } From 7d02b693beeb53fa7f69c55301d8c5f5581b23b2 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 21 Jul 2025 16:43:30 -0700 Subject: [PATCH 6/6] Sema: fix missed block OPV --- src/Sema.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Sema.zig b/src/Sema.zig index f3cca1ea6a..d2e3e32214 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -6562,6 +6562,11 @@ fn resolveAnalyzedBlock( } }, }); } + + if (try sema.typeHasOnePossibleValue(resolved_ty)) |block_only_value| { + return Air.internedToRef(block_only_value.toIntern()); + } + return merges.block_inst.toRef(); }