From 4bcc9c6b5e91eca8de1329ea2151610e2f3e3ada Mon Sep 17 00:00:00 2001 From: Luuk van Dijk Date: Tue, 10 Jan 2012 11:18:56 +0100 Subject: [PATCH] gc: disallow declaration of variables outside package. 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 | 5 +++++ test/fixedbugs/bug388.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 test/fixedbugs/bug388.go diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index f9f638ceb14..87dab3eecad 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -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 index 00000000000..d480e852f09 --- /dev/null +++ b/test/fixedbugs/bug388.go @@ -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) +}