]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: handle go.mod error msg reference in noder, not type checker
authorRobert Griesemer <gri@golang.org>
Thu, 22 Sep 2022 01:38:23 +0000 (18:38 -0700)
committerGopher Robot <gobot@golang.org>
Fri, 23 Sep 2022 20:27:07 +0000 (20:27 +0000)
Currently, for version errors, types2 adds the helpful hint

(-lang was set to go1.xx; check go.mod)

where 1.xx is the respective language version, to the error message.
This requires that the type checker knows that it was invoked by the
compiler, which is done through the Config.CompilerErrorMessages flag.

This change looks for version errors being returned by the type checker
and then adds the hint at that point, external to the type checker.
This removes a dependency on the Config.CompilerErrorMessages. Once
we have removed all dependencies on Config.CompilerErrorMessages we
can remove it.

For #55326.

Change-Id: I1f9b2e472c49fe785a2075e26c4b3d9b8fcdbf4d
Reviewed-on: https://go-review.googlesource.com/c/go/+/432559
Reviewed-by: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/noder/irgen.go
src/cmd/compile/internal/types2/conversions.go
src/cmd/compile/internal/types2/errors.go
src/go/types/conversions.go
src/go/types/errors.go

index dc69e949249ee2c143fa0618be1e3e1ecc844f98..bf471e08fa076efe0a5463d5cba09def5244b1be 100644 (file)
@@ -6,6 +6,7 @@ package noder
 
 import (
        "fmt"
+       "regexp"
        "sort"
 
        "cmd/compile/internal/base"
@@ -18,6 +19,8 @@ import (
        "cmd/internal/src"
 )
 
+var versionErrorRx = regexp.MustCompile(`requires go[0-9]+\.[0-9]+ or later`)
+
 // checkFiles configures and runs the types2 checker on the given
 // parsed source files and then returns the result.
 func checkFiles(noders []*noder) (posMap, *types2.Package, *types2.Info) {
@@ -46,7 +49,12 @@ func checkFiles(noders []*noder) (posMap, *types2.Package, *types2.Info) {
                CompilerErrorMessages: true, // use error strings matching existing compiler errors
                Error: func(err error) {
                        terr := err.(types2.Error)
-                       base.ErrorfAt(m.makeXPos(terr.Pos), "%s", terr.Msg)
+                       msg := terr.Msg
+                       // if we have a version error, hint at the -lang setting
+                       if versionErrorRx.MatchString(msg) {
+                               msg = fmt.Sprintf("%s (-lang was set to %s; check go.mod)", msg, base.Flag.Lang)
+                       }
+                       base.ErrorfAt(m.makeXPos(terr.Pos), "%s", msg)
                },
                Importer: &importer,
                Sizes:    &gcSizes{},
index d15645499b33f67e4f00a905a96894fc0f08d9a7..da3a31736a7425c3061dc7ed8e2da8bc04aeef6e 100644 (file)
@@ -7,7 +7,6 @@
 package types2
 
 import (
-       "fmt"
        "go/constant"
        "unicode"
 )
@@ -201,9 +200,6 @@ func (x *operand) convertibleTo(check *Checker, T Type, cause *string) bool {
                                if cause != nil {
                                        // TODO(gri) consider restructuring versionErrorf so we can use it here and below
                                        *cause = "conversion of slices to arrays requires go1.20 or later"
-                                       if check.conf.CompilerErrorMessages {
-                                               *cause += fmt.Sprintf(" (-lang was set to %s; check go.mod)", check.conf.GoVersion)
-                                       }
                                }
                                return false
                        }
@@ -216,9 +212,6 @@ func (x *operand) convertibleTo(check *Checker, T Type, cause *string) bool {
                                        // check != nil
                                        if cause != nil {
                                                *cause = "conversion of slices to array pointers requires go1.17 or later"
-                                               if check.conf.CompilerErrorMessages {
-                                                       *cause += fmt.Sprintf(" (-lang was set to %s; check go.mod)", check.conf.GoVersion)
-                                               }
                                        }
                                        return false
                                }
index 7df66565431d3cd8d22994e51c61d72e189d26ac..09d44f68994e1ce2ebbc156464774e4c36e62465 100644 (file)
@@ -286,11 +286,7 @@ func (check *Checker) softErrorf(at poser, code errorCode, format string, args .
 
 func (check *Checker) versionErrorf(at poser, goVersion string, format string, args ...interface{}) {
        msg := check.sprintf(format, args...)
-       if check.conf.CompilerErrorMessages {
-               msg = fmt.Sprintf("%s requires %s or later (-lang was set to %s; check go.mod)", msg, goVersion, check.conf.GoVersion)
-       } else {
-               msg = fmt.Sprintf("%s requires %s or later", msg, goVersion)
-       }
+       msg = fmt.Sprintf("%s requires %s or later", msg, goVersion)
        check.err(at, _UnsupportedFeature, msg, true)
 }
 
index 926a79cf5e24cc3f41923eea5a925bb989f0680e..edb983ddb9523ee8a42437434ca2ba3860e5f85c 100644 (file)
@@ -7,7 +7,6 @@
 package types
 
 import (
-       "fmt"
        "go/constant"
        "go/token"
        "unicode"
@@ -201,9 +200,6 @@ func (x *operand) convertibleTo(check *Checker, T Type, cause *string) bool {
                                if cause != nil {
                                        // TODO(gri) consider restructuring versionErrorf so we can use it here and below
                                        *cause = "conversion of slices to arrays requires go1.20 or later"
-                                       if compilerErrorMessages {
-                                               *cause += fmt.Sprintf(" (-lang was set to %s; check go.mod)", check.conf.GoVersion)
-                                       }
                                }
                                return false
                        }
@@ -216,9 +212,6 @@ func (x *operand) convertibleTo(check *Checker, T Type, cause *string) bool {
                                        // check != nil
                                        if cause != nil {
                                                *cause = "conversion of slices to array pointers requires go1.17 or later"
-                                               if compilerErrorMessages {
-                                                       *cause += fmt.Sprintf(" (-lang was set to %s; check go.mod)", check.conf.GoVersion)
-                                               }
                                        }
                                        return false
                                }
index 9869ec7d4a14d6f71aa9cd5a52ea891f539c655e..c6a69714950395b494a17b1065e7979aeb65b1d1 100644 (file)
@@ -295,11 +295,7 @@ func (check *Checker) softErrorf(at positioner, code errorCode, format string, a
 func (check *Checker) versionErrorf(at positioner, code errorCode, goVersion string, format string, args ...interface{}) {
        msg := check.sprintf(format, args...)
        var err *error_
-       if compilerErrorMessages {
-               err = newErrorf(at, code, "%s requires %s or later (-lang was set to %s; check go.mod)", msg, goVersion, check.conf.GoVersion)
-       } else {
-               err = newErrorf(at, code, "%s requires %s or later", msg, goVersion)
-       }
+       err = newErrorf(at, code, "%s requires %s or later", msg, goVersion)
        check.report(err)
 }