]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: improve error message if init is directly invoked
authorEmmanuel Odeke <emm.odeke@gmail.com>
Sun, 1 Jan 2017 10:08:48 +0000 (03:08 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 2 Feb 2017 05:55:03 +0000 (05:55 +0000)
Fixes #8481.

Inform the user that init functions cannot be directly invoked
in user code, as mandated by the spec at:
http://golang.org/ref/spec#Program_initialization_and_execution.

Change-Id: Ib12c0c08718ffd48b76b6f9b13c76bb6612d2e7b
Reviewed-on: https://go-review.googlesource.com/34790
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue8481.go [new file with mode: 0644]
test/init.go

index 51fc7fd442194d420a37e8c58eb3c793b54b7f21..ee4eb0353e84051451e541db353c45fc6cd4befd 100644 (file)
@@ -3648,11 +3648,19 @@ func typecheckdef(n *Node) *Node {
                                lineno = n.Pos
                        }
 
-                       // Note: adderrorname looks for this string and
-                       // adds context about the outer expression
-                       yyerror("undefined: %v", n.Sym)
+                       switch n.Sym.Name {
+                       case "init":
+                               // As per the spec at:
+                               //  https://golang.org/ref/spec#Program_initialization_and_execution
+                               // init cannot be referred to in usercode.
+                               // See https://golang.org/issues/8481.
+                               yyerror("cannot refer to init functions")
+                       default:
+                               // Note: adderrorname looks for this string and
+                               // adds context about the outer expression
+                               yyerror("undefined: %v", n.Sym)
+                       }
                }
-
                return n
        }
 
diff --git a/test/fixedbugs/issue8481.go b/test/fixedbugs/issue8481.go
new file mode 100644 (file)
index 0000000..a692966
--- /dev/null
@@ -0,0 +1,14 @@
+// errorcheck
+
+// Copyright 2016 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 main
+
+func init() {
+}
+
+func main() {
+       init() // ERROR "cannot refer to init functions"
+}
index f4689443cf1415be71abe719d0c89aaebdecba76..1855b4ff56da2c57a3c0a24b59fe48281963ac73 100644 (file)
@@ -15,7 +15,7 @@ func init() {
 }
 
 func main() {
-       init()         // ERROR "undefined.*init"
+       init()         // ERROR "cannot refer to init functions"
        runtime.init() // ERROR "unexported.*runtime\.init"
-       var _ = init   // ERROR "undefined.*init"
+       var _ = init   // ERROR "cannot refer to init functions"
 }