aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Findley <rfindley@google.com>2021-02-04 11:16:25 -0500
committerRobert Findley <rfindley@google.com>2021-02-04 20:43:49 +0000
commit120b819f45d1c109a1c2ef380edde9e826862a5c (patch)
tree601d248d9fa1f91f763a8d37426842d07617b45f
parent52d5cb2822966c00ce2ef97eb08bec4850d76fb2 (diff)
downloadgo-120b819f45d1c109a1c2ef380edde9e826862a5c.tar.gz
go-120b819f45d1c109a1c2ef380edde9e826862a5c.zip
[dev.regabi] go/types: report error for invalid main function signature
This is a port of CL 279424, which didn't make it into master in time for go1.16. Move it to dev.regabi so that it may be merged. Notably, this port no longer removes the _InvalidInitSig error code, instead opting to deprecate it. Now that error codes are 'locked in' for go1.16, even if their API may not yet be exposed, we should follow the practice of not changing their values. In the future, code generation can make it easier to keep error code values constant. For #43308 Change-Id: I5260b93fd063393d38d6458e45a67e7f9b7426ed Reviewed-on: https://go-review.googlesource.com/c/go/+/289714 Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
-rw-r--r--src/go/types/decl.go8
-rw-r--r--src/go/types/errorcodes.go7
-rw-r--r--src/go/types/testdata/main.src9
3 files changed, 20 insertions, 4 deletions
diff --git a/src/go/types/decl.go b/src/go/types/decl.go
index df01e92530..571e172351 100644
--- a/src/go/types/decl.go
+++ b/src/go/types/decl.go
@@ -751,8 +751,12 @@ func (check *Checker) funcDecl(obj *Func, decl *declInfo) {
obj.typ = sig // guard against cycles
fdecl := decl.fdecl
check.funcType(sig, fdecl.Recv, fdecl.Type)
- if sig.recv == nil && obj.name == "init" && (sig.params.Len() > 0 || sig.results.Len() > 0) {
- check.errorf(fdecl, _InvalidInitSig, "func init must have no arguments and no return values")
+ if sig.recv == nil {
+ if obj.name == "init" && (sig.params.Len() > 0 || sig.results.Len() > 0) {
+ check.errorf(fdecl, _InvalidInitDecl, "func init must have no arguments and no return values")
+ } else if obj.name == "main" && check.pkg.name == "main" && (sig.params.Len() > 0 || sig.results.Len() > 0) {
+ check.errorf(fdecl, _InvalidMainDecl, "func main must have no arguments and no return values")
+ }
// ok to continue
}
diff --git a/src/go/types/errorcodes.go b/src/go/types/errorcodes.go
index c01a12c346..d27abdf4d4 100644
--- a/src/go/types/errorcodes.go
+++ b/src/go/types/errorcodes.go
@@ -386,8 +386,8 @@ const (
// _InvalidInitSig occurs when an init function declares parameters or
// results.
//
- // Example:
- // func init() int { return 1 }
+ // Deprecated: no longer emitted by the type checker. _InvalidInitDecl is
+ // used instead.
_InvalidInitSig
// _InvalidInitDecl occurs when init is declared as anything other than a
@@ -395,6 +395,9 @@ const (
//
// Example:
// var init = 1
+ //
+ // Example:
+ // func init() int { return 1 }
_InvalidInitDecl
// _InvalidMainDecl occurs when main is declared as anything other than a
diff --git a/src/go/types/testdata/main.src b/src/go/types/testdata/main.src
new file mode 100644
index 0000000000..f892938d4a
--- /dev/null
+++ b/src/go/types/testdata/main.src
@@ -0,0 +1,9 @@
+// Copyright 2020 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 main()
+func /* ERROR "no arguments and no return values" */ main /* ERROR redeclared */ (int)
+func /* ERROR "no arguments and no return values" */ main /* ERROR redeclared */ () int