Commit 187f0c1e26

David Rubin <87927264+Rexicon226@users.noreply.github.com>
2024-04-18 06:45:14
Sema: correctly make inferred allocs constant
Resolves: #19677
1 parent a0de077
Changed files (2)
src
test
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.
 
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