From 41e7901ca41de2211567fe2d3f73a8da9ae6189b Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Mon, 21 Dec 2020 16:48:58 -0800 Subject: [PATCH] [dev.typeparams] cmd/compile/internal/types2: report error for invalid main function signature Updates #43308. Change-Id: I2caff83f304c7e104edda76ac3623cce9fc94a8d Reviewed-on: https://go-review.googlesource.com/c/go/+/279552 Trust: Robert Griesemer Run-TryBot: Robert Griesemer Reviewed-by: Robert Findley TryBot-Result: Go Bot --- src/cmd/compile/internal/types2/resolver.go | 11 ++++++----- src/cmd/compile/internal/types2/testdata/main.go2 | 7 +++++++ src/cmd/compile/internal/types2/testdata/main.src | 9 +++++++++ test/run.go | 1 - 4 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 src/cmd/compile/internal/types2/testdata/main.go2 create mode 100644 src/cmd/compile/internal/types2/testdata/main.src diff --git a/src/cmd/compile/internal/types2/resolver.go b/src/cmd/compile/internal/types2/resolver.go index 2c98ca20e3..7ea9bde5fa 100644 --- a/src/cmd/compile/internal/types2/resolver.go +++ b/src/cmd/compile/internal/types2/resolver.go @@ -397,15 +397,16 @@ func (check *Checker) collectObjects() { obj := NewFunc(d.Name.Pos(), pkg, name, nil) if d.Recv == nil { // regular function - if name == "init" { + if name == "init" || name == "main" && pkg.name == "main" { if d.TParamList != nil { - //check.softErrorf(d.TParamList.Pos(), "func init must have no type parameters") - check.softErrorf(d.Name, "func init must have no type parameters") + check.softErrorf(d, "func %s must have no type parameters", name) } if t := d.Type; len(t.ParamList) != 0 || len(t.ResultList) != 0 { - check.softErrorf(d, "func init must have no arguments and no return values") + check.softErrorf(d, "func %s must have no arguments and no return values", name) } - // don't declare init functions in the package scope - they are invisible + } + // don't declare init functions in the package scope - they are invisible + if name == "init" { obj.parent = pkg.scope check.recordDef(d.Name, obj) // init functions must have a body diff --git a/src/cmd/compile/internal/types2/testdata/main.go2 b/src/cmd/compile/internal/types2/testdata/main.go2 new file mode 100644 index 0000000000..b7ddeaa1a8 --- /dev/null +++ b/src/cmd/compile/internal/types2/testdata/main.go2 @@ -0,0 +1,7 @@ +// 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 /* ERROR "func main must have no type parameters" */ main[T any]() {} diff --git a/src/cmd/compile/internal/types2/testdata/main.src b/src/cmd/compile/internal/types2/testdata/main.src new file mode 100644 index 0000000000..f892938d4a --- /dev/null +++ b/src/cmd/compile/internal/types2/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 diff --git a/test/run.go b/test/run.go index 5ec33f16f2..fcf8a4fcc9 100644 --- a/test/run.go +++ b/test/run.go @@ -1936,7 +1936,6 @@ var excluded = map[string]bool{ "import6.go": true, // issue #43109 "initializerr.go": true, // types2 reports extra errors "linkname2.go": true, // error reported by noder (not running for types2 errorcheck test) - "mainsig.go": true, // issue #43308 "shift1.go": true, // issue #42989 "switch4.go": true, // error reported by noder (not running for types2 errorcheck test) "typecheck.go": true, // invalid function is not causing errors when called -- 2.50.0