]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: add diagnostic for var, type, const named init
authorRuss Cox <rsc@golang.org>
Sat, 22 Dec 2012 22:23:33 +0000 (17:23 -0500)
committerRuss Cox <rsc@golang.org>
Sat, 22 Dec 2012 22:23:33 +0000 (17:23 -0500)
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
test/fixedbugs/issue3705.go [new file with mode: 0644]
test/fixedbugs/issue4517a.go [new file with mode: 0644]
test/fixedbugs/issue4517b.go [new file with mode: 0644]
test/fixedbugs/issue4517c.go [new file with mode: 0644]

index bf226d92a3895d87579ded2fe19d20489713129e..7bc9ce988ea887e5c8716c80d7ac40ec6e1a5856 100644 (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);
diff --git a/test/fixedbugs/issue3705.go b/test/fixedbugs/issue3705.go
new file mode 100644 (file)
index 0000000..c19bcea
--- /dev/null
@@ -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 (file)
index 0000000..a1b6b57
--- /dev/null
@@ -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 (file)
index 0000000..f04103f
--- /dev/null
@@ -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 (file)
index 0000000..47b21cf
--- /dev/null
@@ -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"