[PATCH harec] gen: dealias object type in slice assignment
Export this patch
Signed-off-by: Bor Grošelj Simić <bgs@turminal.net>
---
src/gen.c | 2 +-
tests/08-slices.ha | 6 ++++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/src/gen.c b/src/gen.c
index 0ed2489..03ea6f7 100644
--- a/src/gen.c
+++ b/src/gen.c
@@ -783,7 +783,7 @@ gen_expr_assign_slice(struct gen_context *ctx, const struct expression *expr)
struct qbe_value vptr = mkqtmp(ctx, ctx->arch.ptr, ".%d");
pushi(ctx->current, &optr, Q_LOADL, &qobj, NULL);
pushi(ctx->current, &vptr, Q_LOADL, &qval, NULL);
- tmp = constl(expr->assign.object->result->array.members->size);
+ tmp = constl(vtype->array.members->size);
pushi(ctx->current, &olen, Q_MUL, &olen, &tmp, NULL);
pushi(ctx->current, NULL, Q_CALL, &ctx->rt.memmove, &optr, &vptr, &olen, NULL);
diff --git a/tests/08-slices.ha b/tests/08-slices.ha
index b24ebf4..63ac661 100644
--- a/tests/08-slices.ha
+++ b/tests/08-slices.ha
@@ -85,6 +85,8 @@ fn zero3(s: []int) void = {
s[..] = [0, 0, 0];
};
+type sl_alias = []int;
+
fn assignment() void = {
let source = [1, 2, 3];
let x: []int = source;
@@ -108,6 +110,10 @@ fn assignment() void = {
assert(z[0] == 1 && z[1] == 42 && z[2] == 69 && z[3] == 1337 && z[4] == 5);
z[2..5] = y;
assert(z[0] == 1 && z[1] == 42 && z[2] == 0 && z[3] == 0 && z[4] == 0);
+ let z: sl_alias = z;
+ z[2..5] = y;
+ let z: *sl_alias = &z;
+ z[2..5] = y;
let x: []int = [];
let opaqueslice: []opaque = x;
--
2.38.4
harec/patches: SUCCESS in 1m25s
[gen: dealias object type in slice assignment][0] from [Bor Grošelj Simić][1]
[0]: https://lists.sr.ht/~sircmpwn/hare-dev/patches/44910
[1]: mailto:bgs@turminal.net
✓ #1060515 SUCCESS harec/patches/freebsd.yml https://builds.sr.ht/~sircmpwn/job/1060515
✓ #1060516 SUCCESS harec/patches/netbsd.yml https://builds.sr.ht/~sircmpwn/job/1060516
✓ #1060514 SUCCESS harec/patches/alpine.yml https://builds.sr.ht/~sircmpwn/job/1060514
thanks!
to git@git.sr.ht:~sircmpwn/harec
6151bd6..a3687cb master -> master