Commit d6e4e18c authored by Russ Cox's avatar Russ Cox

gc: more specific error for statements at top level

R=ken2, r, ken3
CC=golang-dev
https://golang.org/cl/1006041
parent 2a591bdf
...@@ -53,7 +53,7 @@ ...@@ -53,7 +53,7 @@
%type <node> compound_stmt dotname embed expr %type <node> compound_stmt dotname embed expr
%type <node> expr_or_type %type <node> expr_or_type
%type <node> fndcl fnliteral %type <node> fndcl fnliteral
%type <node> for_body for_header for_stmt if_header if_stmt %type <node> for_body for_header for_stmt if_header if_stmt non_dcl_stmt
%type <node> interfacedcl keyval labelname name %type <node> interfacedcl keyval labelname name
%type <node> name_or_type non_expr_type %type <node> name_or_type non_expr_type
%type <node> new_name dcl_name oexpr typedclname %type <node> new_name dcl_name oexpr typedclname
...@@ -271,6 +271,11 @@ xdcl: ...@@ -271,6 +271,11 @@ xdcl:
{ {
$$ = list1($1); $$ = list1($1);
} }
| non_dcl_stmt
{
yyerror("non-declaration statement outside function body");
$$ = nil;
}
| error | error
{ {
$$ = nil; $$ = nil;
...@@ -1086,10 +1091,12 @@ fndcl: ...@@ -1086,10 +1091,12 @@ fndcl:
$$->nname->ntype = n; $$->nname->ntype = n;
funchdr($$); funchdr($$);
} }
| '(' oarg_type_list_ocomma ')' new_name '(' oarg_type_list_ocomma ')' fnres | '(' oarg_type_list_ocomma ')' sym '(' oarg_type_list_ocomma ')' fnres
{ {
Node *rcvr, *t; Node *rcvr, *t;
Node *name;
name = newname($4);
$2 = checkarglist($2, 0); $2 = checkarglist($2, 0);
$6 = checkarglist($6, 1); $6 = checkarglist($6, 1);
$$ = N; $$ = N;
...@@ -1108,12 +1115,12 @@ fndcl: ...@@ -1108,12 +1115,12 @@ fndcl:
} }
$$ = nod(ODCLFUNC, N, N); $$ = nod(ODCLFUNC, N, N);
$$->nname = methodname1($4, rcvr->right); $$->nname = methodname1(name, rcvr->right);
t = nod(OTFUNC, rcvr, N); t = nod(OTFUNC, rcvr, N);
t->list = $6; t->list = $6;
t->rlist = $8; t->rlist = $8;
$$->nname->ntype = t; $$->nname->ntype = t;
$$->shortname = $4; $$->shortname = name;
funchdr($$); funchdr($$);
} }
...@@ -1340,12 +1347,19 @@ stmt: ...@@ -1340,12 +1347,19 @@ stmt:
{ {
$$ = N; $$ = N;
} }
| simple_stmt
| compound_stmt | compound_stmt
| common_dcl | common_dcl
{ {
$$ = liststmt($1); $$ = liststmt($1);
} }
| non_dcl_stmt
| error
{
$$ = N;
}
non_dcl_stmt:
simple_stmt
| for_stmt | for_stmt
| switch_stmt | switch_stmt
| select_stmt | select_stmt
...@@ -1360,10 +1374,6 @@ stmt: ...@@ -1360,10 +1374,6 @@ stmt:
$$ = $1; $$ = $1;
$$->nelse = list1($3); $$->nelse = list1($3);
} }
| error
{
$$ = N;
}
| labelname ':' stmt | labelname ':' stmt
{ {
NodeList *l; NodeList *l;
......
// errchk $G -e $D/$F.go
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
fmt.Printf("hello") // ERROR "non-declaration statement outside function body"
func main() {
}
x++ // ERROR "non-declaration statement outside function body"
func init() {
}
x,y := 1, 2 // ERROR "non-declaration statement outside function body"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment