authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-10-18 18:18:33+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-10-20 03:44:02+02:00
logbfedf40c9267367d6ffdad54050dcbd451136b58
tree70c587c0034161ab0120dbf642e79d8d519fd832
parentc507e0b76396a200392e16b92292bfc442c6421f

stage2: zirIndexablePtrLen for non-pointer types


1 files changed, 30 insertions(+), 36 deletions(-)

src/Sema.zig+30-36
......@@ -1968,44 +1968,38 @@ fn zirIndexablePtrLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE
19681968
19691969 const inst_data = sema.code.instructions.items(.data)[inst].un_node;
19701970 const src = inst_data.src();
1971 const array = sema.resolveInst(inst_data.operand);
1972 const array_ty = sema.typeOf(array);
1971 const object = sema.resolveInst(inst_data.operand);
1972 const object_ty = sema.typeOf(object);
19731973
1974 if (array_ty.isSlice()) {
1975 return sema.analyzeSliceLen(block, src, array);
1976 }
1974 const is_pointer_to = object_ty.isSinglePointer();
19771975
1978 if (array_ty.isSinglePointer()) {
1979 const elem_ty = array_ty.elemType();
1980 if (elem_ty.isSlice()) {
1981 const slice_inst = try sema.analyzeLoad(block, src, array, src);
1982 return sema.analyzeSliceLen(block, src, slice_inst);
1983 }
1984 if (!elem_ty.isIndexable()) {
1985 const msg = msg: {
1986 const msg = try sema.errMsg(
1987 block,
1988 src,
1989 "type '{}' does not support indexing",
1990 .{elem_ty},
1991 );
1992 errdefer msg.destroy(sema.gpa);
1993 try sema.errNote(
1994 block,
1995 src,
1996 msg,
1997 "for loop operand must be an array, slice, tuple, or vector",
1998 .{},
1999 );
2000 break :msg msg;
2001 };
2002 return sema.failWithOwnedErrorMsg(msg);
2003 }
2004 const result_ptr = try sema.fieldPtr(block, src, array, "len", src);
2005 return sema.analyzeLoad(block, src, result_ptr, src);
1976 const array_ty = if (is_pointer_to)
1977 object_ty.childType()
1978 else
1979 object_ty;
1980
1981 if (!array_ty.isIndexable()) {
1982 const msg = msg: {
1983 const msg = try sema.errMsg(
1984 block,
1985 src,
1986 "type '{}' does not support indexing",
1987 .{array_ty},
1988 );
1989 errdefer msg.destroy(sema.gpa);
1990 try sema.errNote(
1991 block,
1992 src,
1993 msg,
1994 "for loop operand must be an array, slice, tuple, or vector",
1995 .{},
1996 );
1997 break :msg msg;
1998 };
1999 return sema.failWithOwnedErrorMsg(msg);
20062000 }
20072001
2008 return sema.fail(block, src, "TODO implement Sema.zirIndexablePtrLen", .{});
2002 return sema.fieldVal(block, src, object, "len", src);
20092003}
20102004
20112005fn zirAllocExtended(
......@@ -10847,7 +10841,7 @@ fn fieldVal(
1084710841 },
1084810842 else => {},
1084910843 }
10850 return sema.fail(block, src, "type '{}' does not support field access", .{object_ty});
10844 return sema.fail(block, src, "type '{}' does not support field access (fieldVal, {}.{s})", .{object_ty, object_ty, field_name});
1085110845}
1085210846
1085310847fn fieldPtr(
......@@ -11058,7 +11052,7 @@ fn fieldPtr(
1105811052 },
1105911053 else => {},
1106011054 }
11061 return sema.fail(block, src, "type '{}' does not support field access", .{object_ty});
11055 return sema.fail(block, src, "type '{}' does not support field access (fieldPtr, {}.{s})", .{object_ty, object_ptr_ty, field_name});
1106211056}
1106311057
1106411058fn fieldCallBind(