]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/go/types/version.go
go/types: record Config.GoVersion for reporting in Package.GoVersion method
[gostls13.git] / src / go / types / version.go
index 07a42a79eed24bdd257c005776fa597b6af856d7..108d9b34a062aefcfb5774556aaf760bde7ad175 100644 (file)
@@ -5,7 +5,6 @@
 package types
 
 import (
-       "errors"
        "fmt"
        "go/ast"
        "go/token"
@@ -45,23 +44,24 @@ var (
        go1_21 = version{1, 21}
 )
 
-var errVersionSyntax = errors.New("invalid Go version syntax")
-
 // parseGoVersion parses a Go version string (such as "go1.12")
 // and returns the version, or an error. If s is the empty
 // string, the version is 0.0.
 func parseGoVersion(s string) (v version, err error) {
+       bad := func() (version, error) {
+               return version{}, fmt.Errorf("invalid Go version syntax %q", s)
+       }
        if s == "" {
                return
        }
        if !strings.HasPrefix(s, "go") {
-               return version{}, errVersionSyntax
+               return bad()
        }
        s = s[len("go"):]
        i := 0
        for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
                if i >= 10 || i == 0 && s[i] == '0' {
-                       return version{}, errVersionSyntax
+                       return bad()
                }
                v.major = 10*v.major + int(s[i]) - '0'
        }
@@ -69,7 +69,7 @@ func parseGoVersion(s string) (v version, err error) {
                return
        }
        if i == 0 || s[i] != '.' {
-               return version{}, errVersionSyntax
+               return bad()
        }
        s = s[i+1:]
        if s == "0" {
@@ -82,14 +82,15 @@ func parseGoVersion(s string) (v version, err error) {
        i = 0
        for ; i < len(s) && '0' <= s[i] && s[i] <= '9'; i++ {
                if i >= 10 || i == 0 && s[i] == '0' {
-                       return version{}, errVersionSyntax
+                       return bad()
                }
                v.minor = 10*v.minor + int(s[i]) - '0'
        }
-       if i > 0 && i == len(s) {
-               return
-       }
-       return version{}, errVersionSyntax
+       // Accept any suffix after the minor number.
+       // We are only looking for the language version (major.minor)
+       // but want to accept any valid Go version, like go1.21.0
+       // and go1.21rc2.
+       return
 }
 
 // langCompat reports an error if the representation of a numeric