]> Cypherpunks repositories - gostls13.git/commitdiff
gc: disallow declaration of variables outside package.
authorLuuk van Dijk <lvd@golang.org>
Tue, 10 Jan 2012 10:18:56 +0000 (11:18 +0100)
committerLuuk van Dijk <lvd@golang.org>
Tue, 10 Jan 2012 10:18:56 +0000 (11:18 +0100)
Fixes #2231.

Declaring main.i in package main in the same way already triggers syntax errors.

R=rsc
CC=golang-dev
https://golang.org/cl/5483078

src/cmd/gc/dcl.c
test/fixedbugs/bug388.go [new file with mode: 0644]

index f9f638ceb146f2dd7329fe173a9baf9056eda9cb..87dab3eecadf9d50ad929497fcdcd75b3a66b82e 100644 (file)
@@ -175,6 +175,11 @@ declare(Node *n, int ctxt)
 
        n->lineno = parserline();
        s = n->sym;
+
+       // kludgy: typecheckok means we're past parsing.  Eg genwrapper may declare out of package names later.
+       if(importpkg == nil && !typecheckok && s->pkg != localpkg)
+               yyerror("cannot declare name %S", s);
+
        gen = 0;
        if(ctxt == PEXTERN) {
                externdcl = list(externdcl, n);
diff --git a/test/fixedbugs/bug388.go b/test/fixedbugs/bug388.go
new file mode 100644 (file)
index 0000000..d480e85
--- /dev/null
@@ -0,0 +1,39 @@
+// errchk $G $D/$F.go
+
+// Copyright 2011 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.
+
+// Issue 2231
+
+package main
+import "runtime"
+
+func foo(runtime.UintType, i int) {  // ERROR "cannot declare name runtime.UintType"
+       println(i, runtime.UintType) 
+}
+
+func bar(i int) {
+       runtime.UintType := i       // ERROR "cannot declare name runtime.UintType"
+       println(runtime.UintType)
+}
+
+func baz() {
+       main.i := 1     // ERROR "non-name main.i"
+       println(main.i)
+}
+
+func qux() {
+       var main.i      // ERROR "unexpected [.]"
+       println(main.i)
+}
+
+func corge() {
+       var foo.i int  // ERROR "unexpected [.]"
+       println(foo.i)
+}
+
+func main() {
+       foo(42,43)
+       bar(1969)
+}