diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-03-07 20:41:48 +0200 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-03-08 11:23:39 +0200 |
| commit | 8f037db88552b5171807d4a9f8be6e8942aab8a1 (patch) | |
| tree | d9985543d0373138ba2357529a139c3047a61511 /src/Sema.zig | |
| parent | 1f4a097117a75b053d620658df4cb4e81c40fe1a (diff) | |
| download | zig-8f037db88552b5171807d4a9f8be6e8942aab8a1.tar.gz zig-8f037db88552b5171807d4a9f8be6e8942aab8a1.zip | |
stage2: correct constness of allocs
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index e5e3d6e9b9..d74385dbc1 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -607,6 +607,7 @@ fn analyzeBodyInner( .alloc_inferred_comptime_mut => try sema.zirAllocInferredComptime(inst, Type.initTag(.inferred_alloc_mut)), .alloc_mut => try sema.zirAllocMut(block, inst), .alloc_comptime_mut => try sema.zirAllocComptime(block, inst), + .make_ptr_const => try sema.zirMakePtrConst(block, inst), .anyframe_type => try sema.zirAnyframeType(block, inst), .array_cat => try sema.zirArrayCat(block, inst), .array_mul => try sema.zirArrayMul(block, inst), @@ -2409,6 +2410,21 @@ fn zirAllocComptime(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr return sema.analyzeComptimeAlloc(block, var_ty, 0, ty_src); } +fn zirMakePtrConst(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { + const inst_data = sema.code.instructions.items(.data)[inst].un_node; + const ptr = sema.resolveInst(inst_data.operand); + const ptr_ty = sema.typeOf(ptr); + var ptr_info = ptr_ty.ptrInfo().data; + ptr_info.mutable = false; + const const_ptr_ty = try Type.ptr(sema.arena, sema.mod.getTarget(), ptr_info); + + if (try sema.resolveMaybeUndefVal(block, inst_data.src(), ptr)) |val| { + return sema.addConstant(const_ptr_ty, val); + } + try sema.requireRuntimeBlock(block, inst_data.src()); + return block.addBitCast(const_ptr_ty, ptr); +} + fn zirAllocInferredComptime( sema: *Sema, inst: Zir.Inst.Index, |
