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
This commit is contained in:
Russ Cox 2012-12-22 17:23:33 -05:00
parent 3fc3597c9b
commit 3aed92f811
5 changed files with 39 additions and 0 deletions

View File

@ -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);

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"