From: Ken Thompson Date: Wed, 7 Jan 2009 21:20:10 +0000 (-0800) Subject: [...] bug X-Git-Tag: weekly.2009-11-06~2420 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c458c9838863bd93e6124764c52a015d67804090;p=gostls13.git [...] bug R=r OCL=22218 CL=22218 --- diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index a5b103f5ab..042c1cf38e 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -836,3 +836,4 @@ void argspace(int32); Node* nodarg(Type*, int); void nodconst(Node*, Type*, vlong); Type* deep(Type*); +Type* shallow(Type*); diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 8e061cf8cb..37194a40b5 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -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;