diff options
-rw-r--r-- | src/cmd/gc/dcl.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index c2754f0da..5e50d1e78 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -483,8 +483,18 @@ loop: if(n->op != ODCLFIELD || n->type == T) fatal("stotype: oops %N\n", n); - if(n->type->etype == TARRAY && n->type->bound < 0) - yyerror("type of a structure field cannot be an open array"); + switch(n->type->etype) { + case TARRAY: + if(n->type->bound < 0) + yyerror("type of a structure field cannot be an open array"); + break; + + case TCHAN: + case TMAP: + case TSTRING: + yyerror("%T can exist only in pointer form", n->type); + break; + } switch(n->val.ctype) { case CTSTR: @@ -732,6 +742,15 @@ addvar(Node *n, Type *t, int ctxt) pushdcl(s); } + if(t != T) { + switch(t->etype) { + case TCHAN: + case TMAP: + case TSTRING: + yyerror("%T can exist only in pointer form", t); + } + } + redeclare("variable", s); s->vargen = gen; s->oname = n; |