diff --git a/src/Sema.zig b/src/Sema.zig index 60f61947ec..52ca2a531d 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -4279,7 +4279,7 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com const const_ptr_ty = try sema.makePtrTyConst(final_ptr_ty); const new_const_ptr = try mod.getCoerced(Value.fromInterned(ptr_val), const_ptr_ty); - // Remap the ZIR oeprand to the resolved pointer value + // Remap the ZIR operand to the resolved pointer value sema.inst_map.putAssumeCapacity(inst_data.operand.toIndex().?, Air.internedToRef(new_const_ptr.toIntern())); // Unless the block is comptime, `alloc_inferred` always produces @@ -4305,6 +4305,11 @@ fn zirResolveInferredAlloc(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com .data = .{ .ty = final_ptr_ty }, }); + if (ia1.is_const) { + // Remap the ZIR operand to the pointer const + sema.inst_map.putAssumeCapacity(inst_data.operand.toIndex().?, try sema.makePtrConst(block, ptr)); + } + // Now we need to go back over all the store instructions, and do the logic as if // the new result ptr type was available. diff --git a/test/cases/compile_errors/assign_to_constant_destructure.zig b/test/cases/compile_errors/assign_to_constant_destructure.zig new file mode 100644 index 0000000000..7a416d54cb --- /dev/null +++ b/test/cases/compile_errors/assign_to_constant_destructure.zig @@ -0,0 +1,15 @@ +export fn a() void { + const S = struct { + fn b() struct { usize, usize } { + return .{ 0, 0 }; + } + }; + const c, _ = S.b(); + c += 10; +} + +// error +// backend=stage2 +// target=native +// +// :8:7: error: cannot assign to constant