From 3aed92f81136da6dc5848593fcf6f8b8d5c65c5e Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Sat, 22 Dec 2012 17:23:33 -0500 Subject: [PATCH] cmd/gc: add diagnostic for var, type, const named init Before this CL, defining the variable worked fine, but then when the implicit package-level init func was created, that caused a name collision and a confusing error about the redeclaration. Also add a test for issue 3705 (func init() needs body). Fixes #4517. R=ken2 CC=golang-dev https://golang.org/cl/7008045 --- src/cmd/gc/dcl.c | 3 +++ test/fixedbugs/issue3705.go | 9 +++++++++ test/fixedbugs/issue4517a.go | 9 +++++++++ test/fixedbugs/issue4517b.go | 9 +++++++++ test/fixedbugs/issue4517c.go | 9 +++++++++ 5 files changed, 39 insertions(+) create mode 100644 test/fixedbugs/issue3705.go create mode 100644 test/fixedbugs/issue4517a.go create mode 100644 test/fixedbugs/issue4517b.go create mode 100644 test/fixedbugs/issue4517c.go diff --git a/src/cmd/gc/dcl.c b/src/cmd/gc/dcl.c index bf226d92a3..7bc9ce988e 100644 --- a/src/cmd/gc/dcl.c +++ b/src/cmd/gc/dcl.c @@ -188,6 +188,9 @@ declare(Node *n, int ctxt) if(importpkg == nil && !typecheckok && s->pkg != localpkg) yyerror("cannot declare name %S", s); + if(ctxt == PEXTERN && strcmp(s->name, "init") == 0) + yyerror("cannot declare init - must be func", s); + gen = 0; if(ctxt == PEXTERN) { externdcl = list(externdcl, n); diff --git a/test/fixedbugs/issue3705.go b/test/fixedbugs/issue3705.go new file mode 100644 index 0000000000..c19bcea1cc --- /dev/null +++ b/test/fixedbugs/issue3705.go @@ -0,0 +1,9 @@ +// errorcheck + +// Copyright 2012 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 p + +func init() // ERROR "missing function body" diff --git a/test/fixedbugs/issue4517a.go b/test/fixedbugs/issue4517a.go new file mode 100644 index 0000000000..a1b6b57e97 --- /dev/null +++ b/test/fixedbugs/issue4517a.go @@ -0,0 +1,9 @@ +// errorcheck + +// Copyright 2012 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 p + +var init = 1 // ERROR "cannot declare init - must be func" diff --git a/test/fixedbugs/issue4517b.go b/test/fixedbugs/issue4517b.go new file mode 100644 index 0000000000..f04103ff5b --- /dev/null +++ b/test/fixedbugs/issue4517b.go @@ -0,0 +1,9 @@ +// errorcheck + +// Copyright 2012 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 p + +const init = 1 // ERROR "cannot declare init - must be func" diff --git a/test/fixedbugs/issue4517c.go b/test/fixedbugs/issue4517c.go new file mode 100644 index 0000000000..47b21cf408 --- /dev/null +++ b/test/fixedbugs/issue4517c.go @@ -0,0 +1,9 @@ +// errorcheck + +// Copyright 2012 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 p + +type init byte // ERROR "cannot declare init - must be func" -- 2.48.1