]> Cypherpunks.ru repositories - gostls13.git/commitdiff
go/types, types2: provide error codes where they were missing
authorRobert Griesemer <gri@golang.org>
Fri, 23 Sep 2022 00:38:17 +0000 (17:38 -0700)
committerRobert Griesemer <gri@google.com>
Mon, 26 Sep 2022 21:33:33 +0000 (21:33 +0000)
We need a better approach eventually, but this is ok for now.
In go/types, always use _UnsupportedFeature for unavailable
version-specific features.

Change-Id: I15b47e34eda167db3133bd481aa2f55cf3662c31
Reviewed-on: https://go-review.googlesource.com/c/go/+/433195
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
15 files changed:
src/cmd/compile/internal/types2/assignments.go
src/cmd/compile/internal/types2/call.go
src/cmd/compile/internal/types2/conversions.go
src/cmd/compile/internal/types2/decl.go
src/cmd/compile/internal/types2/initorder.go
src/cmd/compile/internal/types2/labels.go
src/cmd/compile/internal/types2/mono.go
src/cmd/compile/internal/types2/resolver.go
src/cmd/compile/internal/types2/signature.go
src/cmd/compile/internal/types2/stmt.go
src/cmd/compile/internal/types2/struct.go
src/cmd/compile/internal/types2/typeset.go
src/go/types/errors.go
src/go/types/stmt.go
src/go/types/typexpr.go

index 52b724c456affa638a8cedb6a9acf51c5b0385bc..1396284badd42b3cf61f01561a9bbfc56014348f 100644 (file)
@@ -346,6 +346,7 @@ func (check *Checker) initVars(lhs []*Var, orig_rhs []syntax.Expr, returnStmt sy
                                at = rhs[len(rhs)-1].expr // report at last value
                        }
                        var err error_
+                       err.code = _WrongResultCount
                        err.errorf(at, "%s return values", qualifier)
                        err.errorf(nopos, "have %s", check.typesSummary(operandTypes(rhs), false))
                        err.errorf(nopos, "want %s", check.typesSummary(varTypes(lhs), false))
index ee63708ea19d4b5d2f904884b384a2633d48299d..87b29d7260c6ab0a3ea9878523b7c74c9bfc34a2 100644 (file)
@@ -365,6 +365,7 @@ func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, targs []T
                        params = sig.params.vars
                }
                var err error_
+               err.code = _WrongArgCount
                err.errorf(at, "%s arguments in call to %s", qualifier, call.Fun)
                err.errorf(nopos, "have %s", check.typesSummary(operandTypes(args), false))
                err.errorf(nopos, "want %s", check.typesSummary(varTypes(params), sig.variadic))
index da3a31736a7425c3061dc7ed8e2da8bc04aeef6e..eb12b632621c76adadff38879e43e65761c00d2c 100644 (file)
@@ -71,6 +71,7 @@ func (check *Checker) conversion(x *operand, T Type) {
 
        if !ok {
                var err error_
+               err.code = _InvalidConversion
                if check.conf.CompilerErrorMessages {
                        if cause != "" {
                                // Add colon at end of line if we have a following cause.
index 5e3bb28e705d9aff4d551beace080bb35654522d..bc92b64b7e19eb3b11721c88b29790b93935c4b3 100644 (file)
@@ -28,6 +28,7 @@ func (check *Checker) declare(scope *Scope, id *syntax.Name, obj Object, pos syn
        if obj.Name() != "_" {
                if alt := scope.Insert(obj); alt != nil {
                        var err error_
+                       err.code = _DuplicateDecl
                        err.errorf(obj, "%s redeclared in this block", obj.Name())
                        err.recordAltDecl(alt)
                        check.report(&err)
index 5f5334e1b8b88e532dd1a776cb6365e0b27fd5bb..af43f53c1699a0e66b9a6c7a300af4485ce67176 100644 (file)
@@ -153,6 +153,7 @@ func findPath(objMap map[Object]*declInfo, from, to Object, seen map[Object]bool
 func (check *Checker) reportCycle(cycle []Object) {
        obj := cycle[0]
        var err error_
+       err.code = _InvalidInitCycle
        err.errorf(obj, "initialization cycle for %s", obj.Name())
        // subtle loop: print cycle[i] for i = 0, n-1, n-2, ... 1 for len(cycle) = n
        for i := len(cycle) - 1; i >= 0; i-- {
index 7cb3ec846533d52673320c16751df83999f617c6..24349e3c57ff80c12b04f4adf7e3cb96c46b8cc4 100644 (file)
@@ -133,6 +133,7 @@ func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *syntax.Lab
                                lbl := NewLabel(s.Label.Pos(), check.pkg, name)
                                if alt := all.Insert(lbl); alt != nil {
                                        var err error_
+                                       err.code = _DuplicateLabel
                                        err.soft = true
                                        err.errorf(lbl.pos, "label %s already declared", name)
                                        err.recordAltDecl(alt)
index 7bd79f4282efdcc1d196c4149428c07c3c459169..b25f6b0165145cd9fafe57760816606110d06e32 100644 (file)
@@ -137,6 +137,7 @@ func (check *Checker) reportInstanceLoop(v int) {
        // TODO(mdempsky): Pivot stack so we report the cycle from the top?
 
        var err error_
+       err.code = _InvalidInstanceCycle
        obj0 := check.mono.vertices[v].obj
        err.errorf(obj0, "instantiation cycle:")
 
index 5301b64790fe19aa1f81c9969e87f46ecf2ccf08..ac89124fbbfdb25054b3b5901e502cfb59512a58 100644 (file)
@@ -314,6 +314,7 @@ func (check *Checker) collectObjects() {
                                                        // concurrently. See issue #32154.)
                                                        if alt := fileScope.Lookup(name); alt != nil {
                                                                var err error_
+                                                               err.code = _DuplicateDecl
                                                                err.errorf(s.LocalPkgName, "%s redeclared in this block", alt.Name())
                                                                err.recordAltDecl(alt)
                                                                check.report(&err)
index 07399f77aa1281ce44e32f9d5f86846551a96cf5..47454a3adffd92b4b4ab7dfc12799038241fd848 100644 (file)
@@ -178,6 +178,7 @@ func (check *Checker) funcType(sig *Signature, recvPar *syntax.Field, tparams []
        results, _ := check.collectParams(scope, ftyp.ResultList, false)
        scope.Squash(func(obj, alt Object) {
                var err error_
+               err.code = _DuplicateDecl
                err.errorf(obj, "%s redeclared in this block", obj.Name())
                err.recordAltDecl(alt)
                check.report(&err)
index e02217fb88edaa7a86b98e210ad9f724998c17ae..6502315e99f063446d79ced03d4f689779f31652 100644 (file)
@@ -263,6 +263,7 @@ L:
                        for _, vt := range seen[val] {
                                if Identical(v.typ, vt.typ) {
                                        var err error_
+                                       err.code = _DuplicateCase
                                        err.errorf(&v, "duplicate case %s in expression switch", &v)
                                        err.errorf(vt.pos, "previous case")
                                        check.report(&err)
@@ -309,6 +310,7 @@ L:
                                        Ts = TypeString(T, check.qualifier)
                                }
                                var err error_
+                               err.code = _DuplicateCase
                                err.errorf(e, "duplicate case %s in type switch", Ts)
                                err.errorf(other, "previous case")
                                check.report(&err)
@@ -351,6 +353,7 @@ L:
 //                             Ts = TypeString(T, check.qualifier)
 //                     }
 //                     var err error_
+//                     err.code = _DuplicateCase
 //                     err.errorf(e, "duplicate case %s in type switch", Ts)
 //                     err.errorf(other, "previous case")
 //                     check.report(&err)
@@ -501,6 +504,7 @@ func (check *Checker) stmt(ctxt stmtContext, s syntax.Stmt) {
                        for _, obj := range res.vars {
                                if alt := check.lookup(obj.name); alt != nil && alt != obj {
                                        var err error_
+                                       err.code = _OutOfScopeResult
                                        err.errorf(s, "result parameter %s not in scope at return", obj.name)
                                        err.errorf(alt, "inner declaration of %s", obj)
                                        check.report(&err)
index 00cae4c80079da4ea4013bb319bc1d3fc06b6ea4..77f8b6d93bf4fac5063d3f4858946c7b0101d49e 100644 (file)
@@ -199,6 +199,7 @@ func embeddedFieldIdent(e syntax.Expr) *syntax.Name {
 func (check *Checker) declareInSet(oset *objset, pos syntax.Pos, obj Object) bool {
        if alt := oset.insert(obj); alt != nil {
                var err error_
+               err.code = _DuplicateDecl
                err.errorf(pos, "%s redeclared", obj.Name())
                err.recordAltDecl(alt)
                check.report(&err)
index 9bbe0bef90483f8558b77f5d630912ccd0699572..79fab12be870d0a212ac77dfbe639a0e701d0221 100644 (file)
@@ -226,6 +226,7 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_
                        }
                        // check != nil
                        var err error_
+                       err.code = _DuplicateDecl
                        err.errorf(pos, "duplicate method %s", m.name)
                        err.errorf(mpos[other.(*Func)], "other declaration of %s", m.name)
                        check.report(&err)
@@ -244,6 +245,7 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_
                        check.later(func() {
                                if !check.allowVersion(m.pkg, 1, 14) || !Identical(m.typ, other.Type()) {
                                        var err error_
+                                       err.code = _DuplicateDecl
                                        err.errorf(pos, "duplicate method %s", m.name)
                                        err.errorf(mpos[other.(*Func)], "other declaration of %s", m.name)
                                        check.report(&err)
index c6a69714950395b494a17b1065e7979aeb65b1d1..28ee276272da423c9f63ee86f844ff1a374828e5 100644 (file)
@@ -292,10 +292,10 @@ func (check *Checker) softErrorf(at positioner, code errorCode, format string, a
        check.report(err)
 }
 
-func (check *Checker) versionErrorf(at positioner, code errorCode, goVersion string, format string, args ...interface{}) {
+func (check *Checker) versionErrorf(at positioner, goVersion string, format string, args ...interface{}) {
        msg := check.sprintf(format, args...)
        var err *error_
-       err = newErrorf(at, code, "%s requires %s or later", msg, goVersion)
+       err = newErrorf(at, _UnsupportedFeature, "%s requires %s or later", msg, goVersion)
        check.report(err)
 }
 
index 0fab70719ec21efb2bd8545647aaf0357cf9a4cd..9bfc1cd216fdc0c0b87b13c2428998c6595eb381 100644 (file)
@@ -344,6 +344,7 @@ L:
 //                             Ts = TypeString(T, check.qualifier)
 //                     }
 //                     var err error_
+//                     err.code = _DuplicateCase
 //                     err.errorf(e, "duplicate case %s in type switch", Ts)
 //                     err.errorf(other, "previous case")
 //                     check.report(&err)
index ff6bb3625589c7b030d23fdabaedc598b28a8479..fb34bcc2b246061ffaed5befe1a2cf22ff138d90 100644 (file)
@@ -43,7 +43,7 @@ func (check *Checker) ident(x *operand, e *ast.Ident, def *Named, wantType bool)
                return
        case universeAny, universeComparable:
                if !check.allowVersion(check.pkg, 1, 18) {
-                       check.versionErrorf(e, _UndeclaredName, "go1.18", "predeclared %s", e.Name)
+                       check.versionErrorf(e, "go1.18", "predeclared %s", e.Name)
                        return // avoid follow-on errors
                }
        }