fix slicing only work with arrays
This commit is contained in:
parent
e58d1ad217
commit
1bff7d30e7
4
assert.c
4
assert.c
@ -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
2
com.c
@ -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
2
gen.c
@ -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);
|
||||
|
||||
5
parse.c
5
parse.c
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user