Sema: correctly make inferred allocs constant

Resolves: #19677
This commit is contained in:
David Rubin 2024-04-17 21:45:14 -07:00 committed by GitHub
parent a0de077600
commit 187f0c1e26
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 21 additions and 1 deletions

View file

@ -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.

View file

@ -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