From 89a14599a46dbde1a35952dcad53c0d617f5a0c8 Mon Sep 17 00:00:00 2001 From: Ken Thompson Date: Thu, 11 Dec 2008 16:09:45 -0800 Subject: restrict declarations of type map/chan/string (they must be pointers) R=r OCL=21009 CL=21009 --- src/cmd/gc/dcl.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'src') 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; -- cgit v1.2.3