diff options
Diffstat (limited to 'src/cmd/gc/walk.c')
-rw-r--r-- | src/cmd/gc/walk.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c index 1b5ca4746..24a3a39c2 100644 --- a/src/cmd/gc/walk.c +++ b/src/cmd/gc/walk.c @@ -1020,6 +1020,12 @@ loop: indir(n, nvar); goto ret; } + if(istype(n->left->type, TFUNC) && n->left->class == PFUNC) { + if(!n->diag) { + n->diag = 1; + yyerror("cannot take address of function"); + } + } walktype(n->left, Elv); addrescapes(n->left); if(n->left == N) @@ -1060,10 +1066,8 @@ loop: goto ret; } t = n->type; - if(t == T || t->etype == TFUNC) { - yyerror("cannot new(%T)", t); + if(t == T) goto ret; - } indir(n, callnew(t)); goto ret; } @@ -1721,6 +1725,8 @@ loop: badtype(op, l->type, r->type); return N; } + if(l->op == ONAME && l->class == PFUNC) + yyerror("cannot assign to function"); a = nod(OAS, l, r); a = convas(a); |