authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2022-09-24 16:16:52+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2022-10-12 20:36:15+02:00
logad747739594805546e0d52d112dfd4a75978c8c7
tree0beb75cc34ecb604dc07d4ba9550f5f794a32a2b
parentaa20295d24e77a3de586b203182d4e1cad69d475
signaturelock-open Commit is signed but in an unrecognized format.

make addrSpaceCast work with optionals; forbid ptrCast'ing address spaces


2 files changed, 17 insertions(+), 13 deletions(-)

src/Sema.zig+11-13
...@@ -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);
1818318183
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);
1818718185
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 }
1819818197
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 });
1820918204
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 }
1847518473
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();
src/type.zig+6
...@@ -2786,6 +2786,12 @@ pub const Type = extern union {...@@ -2786,6 +2786,12 @@ pub const Type = extern union {
27862786
2787 .pointer => self.castTag(.pointer).?.data.@"addrspace",2787 .pointer => self.castTag(.pointer).?.data.@"addrspace",
27882788
2789 .optional => {
2790 var buf: Payload.ElemType = undefined;
2791 const child_type = self.optionalChild(&buf);
2792 return child_type.ptrAddressSpace();
2793 },
2794
2789 else => unreachable,2795 else => unreachable,
2790 };2796 };
2791 }2797 }