1
0
mirror of https://github.com/golang/go synced 2024-11-26 15:27:04 -07:00

[...] bug

R=r
OCL=22218
CL=22218
This commit is contained in:
Ken Thompson 2009-01-07 13:20:10 -08:00
parent 855495eab6
commit c458c98388
2 changed files with 23 additions and 21 deletions

View File

@ -836,3 +836,4 @@ void argspace(int32);
Node* nodarg(Type*, int);
void nodconst(Node*, Type*, vlong);
Type* deep(Type*);
Type* shallow(Type*);

View File

@ -3556,38 +3556,44 @@ arraylit(Node *n)
Iter saver;
Type *t;
Node *var, *r, *a, *nnew;
int idx, b;
int idx, ninit, b;
t = n->type;
if(t->etype != TARRAY)
fatal("arraylit: not array");
// count initializers
ninit = 0;
r = listfirst(&saver, &n->left);
if(r != N && r->op == OEMPTY)
r = N;
while(r != N) {
ninit++;
r = listnext(&saver);
}
b = t->bound;
if(b == -100) {
// flag for [...]
b = ninit;
t = shallow(t);
t->bound = b;
}
var = nod(OXXX, N, N);
tempname(var, t);
b = t->bound;
if(b < 0 && b != -100) {
if(b < 0) {
// slice
nnew = nod(OMAKE, N, N);
nnew->type = t;
a = nod(OAS, var, nnew);
addtop = list(addtop, a);
}
if(b >= 0) {
idx = 0;
r = listfirst(&saver, &n->left);
if(r != N && r->op == OEMPTY)
r = N;
while(r != N) {
// count initializers
idx++;
r = listnext(&saver);
}
} else {
// if entire array isnt initialized,
// then clear the array
if(idx < b) {
if(ninit < b) {
a = nod(OAS, var, N);
addtop = list(addtop, a);
}
@ -3606,11 +3612,6 @@ arraylit(Node *n)
idx++;
r = listnext(&saver);
}
if(b == -100) {
// compiler counted closed array
b = idx;
t->bound = b;
}
if(b < 0)
nnew->left = nodintconst(idx);
return var;