aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authormlugg <mlugg@mlugg.co.uk>2023-08-27 17:28:37 +0100
committerAndrew Kelley <andrew@ziglang.org>2023-08-28 12:33:36 -0700
commitb8e6c426887e92cc5a841a7dd58eb10ebfbe0d77 (patch)
treebda2f894bffbc95f62920f94121bf0f4e33cfae5 /src/Sema.zig
parent8d036d1d78bd6db5fd39b30c6182196c1e49a3db (diff)
downloadzig-b8e6c426887e92cc5a841a7dd58eb10ebfbe0d77.tar.gz
zig-b8e6c426887e92cc5a841a7dd58eb10ebfbe0d77.zip
compiler: provide result type for @memset value
Resolves: #16986
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 09e13664ea..a0af64fc83 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -1023,6 +1023,7 @@ fn analyzeBodyInner(
.elem_val_node => try sema.zirElemValNode(block, inst),
.elem_type_index => try sema.zirElemTypeIndex(block, inst),
.elem_type => try sema.zirElemType(block, inst),
+ .indexable_ptr_elem_type => try sema.zirIndexablePtrElemType(block, inst),
.vector_elem_type => try sema.zirVectorElemType(block, inst),
.enum_literal => try sema.zirEnumLiteral(block, inst),
.int_from_enum => try sema.zirIntFromEnum(block, inst),
@@ -8106,6 +8107,22 @@ fn zirElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
return Air.internedToRef(ptr_ty.childType(mod).toIntern());
}
+fn zirIndexablePtrElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
+ const mod = sema.mod;
+ const un_node = sema.code.instructions.items(.data)[inst].un_node;
+ const src = un_node.src();
+ const ptr_ty = sema.resolveType(block, src, un_node.operand) catch |err| switch (err) {
+ error.GenericPoison => return .generic_poison_type,
+ else => |e| return e,
+ };
+ try sema.checkMemOperand(block, src, ptr_ty);
+ const elem_ty = switch (ptr_ty.ptrSize(mod)) {
+ .Slice, .Many, .C => ptr_ty.childType(mod),
+ .One => ptr_ty.childType(mod).childType(mod),
+ };
+ return Air.internedToRef(elem_ty.toIntern());
+}
+
fn zirVectorElemType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
const mod = sema.mod;
const un_node = sema.code.instructions.items(.data)[inst].un_node;