From: Ken Thompson Date: Wed, 7 Jan 2009 01:31:24 +0000 (-0800) Subject: closed arrays including [...] X-Git-Tag: weekly.2009-11-06~2428 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b0f627a6e1b1df1b47309f7fd59281a3809fb4d0;p=gostls13.git closed arrays including [...] R=r OCL=22182 CL=22182 --- diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 275e740bb7..ffaad5d89b 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -1021,6 +1021,12 @@ convtype: // array literal $$ = aindex($2, $4); } +| '[' LDDD ']' type + { + // array literal of nelem + $$ = aindex(N, $4); + $$->bound = -100; + } | LMAP '[' type ']' type { // map literal diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 870d30a98a..bac013d73a 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -3556,23 +3556,24 @@ arraylit(Node *n) Iter saver; Type *t; Node *var, *r, *a, *nas, *nnew; - int idx; + int idx, b; t = n->type; if(t->etype != TARRAY) fatal("arraylit: not array"); - if(t->bound >= 0) - fatal("arraylit: literal fixed arrays not implemented"); - var = nod(OXXX, N, N); tempname(var, t); - nnew = nod(OMAKE, N, N); - nnew->type = t; + b = t->bound; + if(b < 0 && b != -100) { + // slice + nnew = nod(OMAKE, N, N); + nnew->type = t; - nas = nod(OAS, var, nnew); - addtop = list(addtop, nas); + nas = nod(OAS, var, nnew); + addtop = list(addtop, nas); + } idx = 0; r = listfirst(&saver, &n->left); @@ -3580,6 +3581,10 @@ arraylit(Node *n) r = N; while(r != N) { // build list of var[c] = expr + if(b >= 0 && idx >= b) { + yyerror("literal array initializer out of bounds"); + break; + } a = nodintconst(idx); a = nod(OINDEX, var, a); a = nod(OAS, a, r); @@ -3587,7 +3592,13 @@ arraylit(Node *n) idx++; r = listnext(&saver); } - nnew->left = nodintconst(idx); + if(b == -100) { + // compiler counted closed array + b = idx; + t->bound = b; + } + if(b < 0) + nnew->left = nodintconst(idx); return var; } diff --git a/src/run.bash b/src/run.bash index 10efb218f2..2c5d13dadd 100755 --- a/src/run.bash +++ b/src/run.bash @@ -59,7 +59,7 @@ time make ) || exit $? (xcd ../doc/progs -time run +time ./run ) || exit $? (xcd ../test