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:
|
case Oindex:
|
||||||
t = l->ty;
|
t = l->ty;
|
||||||
if(t->kind == Tslice)
|
if(t->kind == Tslice)
|
||||||
t = t->tof;
|
t = typeofslice(t->tof);
|
||||||
assert(t->kind == Tarray || t->kind == Tslice);
|
assert(t->kind == Tarray);
|
||||||
assertexpr(r);
|
assertexpr(r);
|
||||||
if(r->op == Oconst)
|
if(r->op == Oconst)
|
||||||
assert(r->val < t->len);
|
assert(r->val < t->len);
|
||||||
|
|||||||
2
com.c
2
com.c
@ -401,7 +401,7 @@ rewrite(Node *n)
|
|||||||
if(r->l == nil)
|
if(r->l == nil)
|
||||||
r->l = mkconst(0);
|
r->l = mkconst(0);
|
||||||
if(r->r == nil)
|
if(r->r == nil)
|
||||||
r->r = mkconst(t->len);
|
r->r = mkconst(n->ty->len);
|
||||||
n->l = rewrite(n->l);
|
n->l = rewrite(n->l);
|
||||||
n->r = rewrite(n->r);
|
n->r = rewrite(n->r);
|
||||||
break;
|
break;
|
||||||
|
|||||||
2
gen.c
2
gen.c
@ -247,7 +247,7 @@ genop(int op, Node *s, Node *m, Node *d)
|
|||||||
};
|
};
|
||||||
Inst *in = mkinst();
|
Inst *in = mkinst();
|
||||||
int iop = disoptab[op][d->ty->kind];
|
int iop = disoptab[op][d->ty->kind];
|
||||||
assert(iop != nil);
|
assert(iop != 0);
|
||||||
in->op = iop;
|
in->op = iop;
|
||||||
if(s){
|
if(s){
|
||||||
in->s = genaddr(s);
|
in->s = genaddr(s);
|
||||||
|
|||||||
5
parse.c
5
parse.c
@ -614,7 +614,7 @@ arraytype(void)
|
|||||||
Token t;
|
Token t;
|
||||||
|
|
||||||
want((int[]){'[',0});
|
want((int[]){'[',0});
|
||||||
switch((t = try((int[]){Lid,Lconst,0})).kind){
|
switch((t = try((int[]){Lid,Lconst,']',0})).kind){
|
||||||
case Lid:
|
case Lid:
|
||||||
assert(t.sym->decl == _decl);
|
assert(t.sym->decl == _decl);
|
||||||
want((int[]){']',0});
|
want((int[]){']',0});
|
||||||
@ -627,6 +627,9 @@ arraytype(void)
|
|||||||
ty = mktype(Tarray, 0, type(), nil);
|
ty = mktype(Tarray, 0, type(), nil);
|
||||||
assert((ty->len = t.num) > 0);
|
assert((ty->len = t.num) > 0);
|
||||||
return ty;
|
return ty;
|
||||||
|
case ']':
|
||||||
|
ty = mktype(Tslice, 0, type(), nil);
|
||||||
|
return ty;
|
||||||
default : assert(0);
|
default : assert(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user