summaryrefslogtreecommitdiff
path: root/src/cmd/gc/dcl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/gc/dcl.c')
-rw-r--r--src/cmd/gc/dcl.c23
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;