diff options
author | Russ Cox <rsc@golang.org> | 2009-09-14 18:38:30 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-09-14 18:38:30 -0700 |
commit | a4b4090443684cc9a82c272f2c7ae598c5aceca8 (patch) | |
tree | 17126953a3707e26393e1cb0286d82767d5637cf /src | |
parent | 5fcd02aa7674ccde0e4f8772845910b611ca5d77 (diff) | |
download | golang-a4b4090443684cc9a82c272f2c7ae598c5aceca8.tar.gz |
declared and not used error, but disabled.
fix some bugs involving _.
R=ken
OCL=34621
CL=34621
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/gc/gen.c | 10 | ||||
-rw-r--r-- | src/cmd/gc/go.h | 1 | ||||
-rw-r--r-- | src/cmd/gc/go.y | 2 | ||||
-rw-r--r-- | src/cmd/gc/typecheck.c | 10 | ||||
-rw-r--r-- | src/cmd/gc/walk.c | 3 |
5 files changed, 20 insertions, 6 deletions
diff --git a/src/cmd/gc/gen.c b/src/cmd/gc/gen.c index a64b0a3ca..8c00c5898 100644 --- a/src/cmd/gc/gen.c +++ b/src/cmd/gc/gen.c @@ -26,6 +26,7 @@ allocparams(void) Node *n; uint32 w; Sym *s; + int lno; if(stksize < 0) fatal("allocparams not during code generation"); @@ -35,6 +36,7 @@ allocparams(void) * slots for all automatics. * allocated starting at -w down. */ + lno = lineno; for(l=curfn->dcl; l; l=l->next) { n = l->n; if(n->op == ONAME && n->class == PHEAP-1) { @@ -46,19 +48,21 @@ allocparams(void) } if(n->op != ONAME || n->class != PAUTO) continue; - typecheck(&n, Erv); // only needed for unused variables + lineno = n->lineno; + typecheck(&n, Erv | Easgn); // only needed for unused variables if(n->type == T) continue; + // if(!n->used && n->sym->name[0] != '&') + // yyerror("%S declared and not used", n->sym); dowidth(n->type); w = n->type->width; - if(n->class & PHEAP) - w = widthptr; if(w >= 100000000) fatal("bad width"); stksize += w; stksize = rnd(stksize, w); n->xoffset = -stksize; } + lineno = lno; } void diff --git a/src/cmd/gc/go.h b/src/cmd/gc/go.h index 93c900db3..aa2e6d89d 100644 --- a/src/cmd/gc/go.h +++ b/src/cmd/gc/go.h @@ -201,6 +201,7 @@ struct Node uchar local; uchar initorder; uchar dodata; // compile literal assignment as data statement + uchar used; // most nodes Node* left; diff --git a/src/cmd/gc/go.y b/src/cmd/gc/go.y index 61f8b2b2e..ea9cd3aed 100644 --- a/src/cmd/gc/go.y +++ b/src/cmd/gc/go.y @@ -456,6 +456,7 @@ case: if(typesw != N && typesw->right != N && (n=typesw->right->left) != N) { // type switch - declare variable n = newname(n->sym); + n->used = 1; // TODO(rsc): better job here declare(n, dclcontext); $$->nname = n; } @@ -488,6 +489,7 @@ case: if(typesw != N && typesw->right != N && (n=typesw->right->left) != N) { // type switch - declare variable n = newname(n->sym); + n->used = 1; // TODO(rsc): better job here declare(n, dclcontext); $$->nname = n; } diff --git a/src/cmd/gc/typecheck.c b/src/cmd/gc/typecheck.c index d33e9e809..308ed90e3 100644 --- a/src/cmd/gc/typecheck.c +++ b/src/cmd/gc/typecheck.c @@ -112,9 +112,13 @@ reswitch: ok |= Ecall; goto ret; } - if(isblank(n) && !(top & Easgn)) { - yyerror("cannot use _ as value"); - goto error; + if(!(top & Easgn)) { + // not a write to the variable + if(isblank(n)) { + yyerror("cannot use _ as value"); + goto error; + } + n->used = 1; } ok |= Erv; goto ret; diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 6f5dde328..e66a42ce2 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -1771,6 +1771,9 @@ convas(Node *n, NodeList **init) if(lt == T || rt == T) goto out; + if(isblank(n->left)) + goto out; + if(n->left->op == OINDEXMAP) { n = mkcall1(mapfn("mapassign1", n->left->left->type), T, init, n->left->left, n->left->right, n->right); |