fix slicing only work with arrays

This commit is contained in:
yoyo 2024-11-03 17:18:44 +09:00
parent e58d1ad217
commit 1bff7d30e7
4 changed files with 8 additions and 5 deletions

View File

@ -220,8 +220,8 @@ assertexpr(Node *n)
case Oindex:
t = l->ty;
if(t->kind == Tslice)
t = t->tof;
assert(t->kind == Tarray || t->kind == Tslice);
t = typeofslice(t->tof);
assert(t->kind == Tarray);
assertexpr(r);
if(r->op == Oconst)
assert(r->val < t->len);

2
com.c
View File

@ -401,7 +401,7 @@ rewrite(Node *n)
if(r->l == nil)
r->l = mkconst(0);
if(r->r == nil)
r->r = mkconst(t->len);
r->r = mkconst(n->ty->len);
n->l = rewrite(n->l);
n->r = rewrite(n->r);
break;

2
gen.c
View File

@ -247,7 +247,7 @@ genop(int op, Node *s, Node *m, Node *d)
};
Inst *in = mkinst();
int iop = disoptab[op][d->ty->kind];
assert(iop != nil);
assert(iop != 0);
in->op = iop;
if(s){
in->s = genaddr(s);

View File

@ -614,7 +614,7 @@ arraytype(void)
Token t;
want((int[]){'[',0});
switch((t = try((int[]){Lid,Lconst,0})).kind){
switch((t = try((int[]){Lid,Lconst,']',0})).kind){
case Lid:
assert(t.sym->decl == _decl);
want((int[]){']',0});
@ -627,6 +627,9 @@ arraytype(void)
ty = mktype(Tarray, 0, type(), nil);
assert((ty->len = t.num) > 0);
return ty;
case ']':
ty = mktype(Tslice, 0, type(), nil);
return ty;
default : assert(0);
}
}