| ... | @@ -18181,11 +18181,10 @@ fn zirAddrSpaceCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst | ... | @@ -18181,11 +18181,10 @@ fn zirAddrSpaceCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst |
| 18181 | const ptr = try sema.resolveInst(extra.rhs); | 18181 | const ptr = try sema.resolveInst(extra.rhs); |
| 18182 | const ptr_ty = sema.typeOf(ptr); | 18182 | const ptr_ty = sema.typeOf(ptr); |
| 18183 | | 18183 | |
| 18184 | // TODO in addition to pointers, this instruction is supposed to work for | | |
| 18185 | // pointer-like optionals and slices. | | |
| 18186 | try sema.checkPtrOperand(block, ptr_src, ptr_ty); | 18184 | try sema.checkPtrOperand(block, ptr_src, ptr_ty); |
| 18187 | | 18185 | |
| 18188 | const src_addrspace = ptr_ty.ptrAddressSpace(); | 18186 | var ptr_info = ptr_ty.ptrInfo().data; |
| | 18187 | const src_addrspace = ptr_info.@"addrspace"; |
| 18189 | if (!target_util.addrSpaceCastIsValid(sema.mod.getTarget(), src_addrspace, dest_addrspace)) { | 18188 | if (!target_util.addrSpaceCastIsValid(sema.mod.getTarget(), src_addrspace, dest_addrspace)) { |
| 18190 | const msg = msg: { | 18189 | const msg = msg: { |
| 18191 | const msg = try sema.errMsg(block, src, "invalid address space cast", .{}); | 18190 | const msg = try sema.errMsg(block, src, "invalid address space cast", .{}); |
| ... | @@ -18196,16 +18195,12 @@ fn zirAddrSpaceCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst | ... | @@ -18196,16 +18195,12 @@ fn zirAddrSpaceCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst |
| 18196 | return sema.failWithOwnedErrorMsg(msg); | 18195 | return sema.failWithOwnedErrorMsg(msg); |
| 18197 | } | 18196 | } |
| 18198 | | 18197 | |
| 18199 | const ptr_info = ptr_ty.ptrInfo().data; | 18198 | ptr_info.@"addrspace" = dest_addrspace; |
| 18200 | const dest_ty = try Type.ptr(sema.arena, sema.mod, .{ | 18199 | const dest_ptr_ty = try Type.ptr(sema.arena, sema.mod, ptr_info); |
| 18201 | .pointee_type = ptr_info.pointee_type, | 18200 | const dest_ty = if (ptr_ty.zigTypeTag() == .Optional) |
| 18202 | .@"align" = ptr_info.@"align", | 18201 | try Type.optional(sema.arena, dest_ptr_ty) |
| 18203 | .@"addrspace" = dest_addrspace, | 18202 | else |
| 18204 | .mutable = ptr_info.mutable, | 18203 | dest_ptr_ty; |
| 18205 | .@"allowzero" = ptr_info.@"allowzero", | | |
| 18206 | .@"volatile" = ptr_info.@"volatile", | | |
| 18207 | .size = ptr_info.size, | | |
| 18208 | }); | | |
| 18209 | | 18204 | |
| 18210 | if (try sema.resolveMaybeUndefVal(block, ptr_src, ptr)) |val| { | 18205 | if (try sema.resolveMaybeUndefVal(block, ptr_src, ptr)) |val| { |
| 18211 | // Pointer value should compatible with both address spaces. | 18206 | // Pointer value should compatible with both address spaces. |
| ... | @@ -18472,6 +18467,9 @@ fn zirPtrCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -18472,6 +18467,9 @@ fn zirPtrCast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 18472 | if (operand_info.@"volatile" and !dest_info.@"volatile") { | 18467 | if (operand_info.@"volatile" and !dest_info.@"volatile") { |
| 18473 | return sema.fail(block, src, "cast discards volatile qualifier", .{}); | 18468 | return sema.fail(block, src, "cast discards volatile qualifier", .{}); |
| 18474 | } | 18469 | } |
| | 18470 | if (operand_info.@"addrspace" != dest_info.@"addrspace") { |
| | 18471 | return sema.fail(block, src, "cast changes pointer address space", .{}); |
| | 18472 | } |
| 18475 | | 18473 | |
| 18476 | const dest_is_slice = dest_ty.isSlice(); | 18474 | const dest_is_slice = dest_ty.isSlice(); |
| 18477 | const operand_is_slice = operand_ty.isSlice(); | 18475 | const operand_is_slice = operand_ty.isSlice(); |