mirror of
https://github.com/golang/go
synced 2024-11-27 04:21:24 -07:00
go/types, types2: use zero error code to indicate unset error code
Use InvalidSyntaxError where the zero error code was used before. Fix a couple of places that didn't set an error code. Panic in error reporting if no error code is provided. Change-Id: I3a537d42b720deb5c351bf38871e04919325e231 Reviewed-on: https://go-review.googlesource.com/c/go/+/439566 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com>
This commit is contained in:
parent
578523e4a0
commit
388fbf287c
@ -28,7 +28,8 @@ func (check *Checker) assignment(x *operand, T Type, context string) {
|
|||||||
// ok
|
// ok
|
||||||
default:
|
default:
|
||||||
// we may get here because of other problems (issue #39634, crash 12)
|
// we may get here because of other problems (issue #39634, crash 12)
|
||||||
check.errorf(x, 0, "cannot assign %s to %s in %s", x, T, context)
|
// TODO(gri) do we need a new "generic" error code here?
|
||||||
|
check.errorf(x, IncompatibleAssign, "cannot assign %s to %s in %s", x, T, context)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ func (check *Checker) arguments(call *syntax.CallExpr, sig *Signature, targs []T
|
|||||||
for _, a := range args {
|
for _, a := range args {
|
||||||
switch a.mode {
|
switch a.mode {
|
||||||
case typexpr:
|
case typexpr:
|
||||||
check.errorf(a, 0, "%s used as value", a)
|
check.errorf(a, NotAnExpr, "%s used as value", a)
|
||||||
return
|
return
|
||||||
case invalid:
|
case invalid:
|
||||||
return
|
return
|
||||||
|
@ -899,7 +899,7 @@ func (check *Checker) declStmt(list []syntax.Decl) {
|
|||||||
check.pop().setColor(black)
|
check.pop().setColor(black)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
check.errorf(s, 0, invalidAST+"unknown syntax.Decl node %T", s)
|
check.errorf(s, InvalidSyntaxTree, invalidAST+"unknown syntax.Decl node %T", s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -221,6 +221,10 @@ func (check *Checker) dump(format string, args ...interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (check *Checker) err(at poser, code Code, msg string, soft bool) {
|
func (check *Checker) err(at poser, code Code, msg string, soft bool) {
|
||||||
|
if code == 0 {
|
||||||
|
panic("no error code provided")
|
||||||
|
}
|
||||||
|
|
||||||
// Cheap trick: Don't report errors with messages containing
|
// Cheap trick: Don't report errors with messages containing
|
||||||
// "invalid operand" or "invalid type" as those tend to be
|
// "invalid operand" or "invalid type" as those tend to be
|
||||||
// follow-on errors which don't add useful information. Only
|
// follow-on errors which don't add useful information. Only
|
||||||
|
@ -78,7 +78,7 @@ func (check *Checker) op(m opPredicates, x *operand, op syntax.Operator) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
check.errorf(x, 0, invalidAST+"unknown operator %s", op)
|
check.errorf(x, InvalidSyntaxTree, invalidAST+"unknown operator %s", op)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
@ -1337,7 +1337,7 @@ func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKin
|
|||||||
x.mode = value
|
x.mode = value
|
||||||
x.typ = sig
|
x.typ = sig
|
||||||
} else {
|
} else {
|
||||||
check.errorf(e, 0, invalidAST+"invalid function literal %v", e)
|
check.errorf(e, InvalidSyntaxTree, invalidAST+"invalid function literal %v", e)
|
||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1594,7 +1594,7 @@ func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKin
|
|||||||
}
|
}
|
||||||
// x.(type) expressions are encoded via TypeSwitchGuards
|
// x.(type) expressions are encoded via TypeSwitchGuards
|
||||||
if e.Type == nil {
|
if e.Type == nil {
|
||||||
check.error(e, 0, invalidAST+"invalid use of AssertExpr")
|
check.error(e, InvalidSyntaxTree, invalidAST+"invalid use of AssertExpr")
|
||||||
goto Error
|
goto Error
|
||||||
}
|
}
|
||||||
T := check.varType(e.Type)
|
T := check.varType(e.Type)
|
||||||
@ -1607,7 +1607,7 @@ func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKin
|
|||||||
|
|
||||||
case *syntax.TypeSwitchGuard:
|
case *syntax.TypeSwitchGuard:
|
||||||
// x.(type) expressions are handled explicitly in type switches
|
// x.(type) expressions are handled explicitly in type switches
|
||||||
check.error(e, 0, invalidAST+"use of .(type) outside type switch")
|
check.error(e, InvalidSyntaxTree, invalidAST+"use of .(type) outside type switch")
|
||||||
goto Error
|
goto Error
|
||||||
|
|
||||||
case *syntax.CallExpr:
|
case *syntax.CallExpr:
|
||||||
@ -1615,7 +1615,7 @@ func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKin
|
|||||||
|
|
||||||
case *syntax.ListExpr:
|
case *syntax.ListExpr:
|
||||||
// catch-all for unexpected expression lists
|
// catch-all for unexpected expression lists
|
||||||
check.error(e, 0, invalidAST+"unexpected list of expressions")
|
check.error(e, InvalidSyntaxTree, invalidAST+"unexpected list of expressions")
|
||||||
goto Error
|
goto Error
|
||||||
|
|
||||||
// case *syntax.UnaryExpr:
|
// case *syntax.UnaryExpr:
|
||||||
@ -1692,7 +1692,7 @@ func (check *Checker) exprInternal(x *operand, e syntax.Expr, hint Type) exprKin
|
|||||||
|
|
||||||
case *syntax.KeyValueExpr:
|
case *syntax.KeyValueExpr:
|
||||||
// key:value expressions are handled in composite literals
|
// key:value expressions are handled in composite literals
|
||||||
check.error(e, 0, invalidAST+"no key:value expected")
|
check.error(e, InvalidSyntaxTree, invalidAST+"no key:value expected")
|
||||||
goto Error
|
goto Error
|
||||||
|
|
||||||
case *syntax.ArrayType, *syntax.SliceType, *syntax.StructType, *syntax.FuncType,
|
case *syntax.ArrayType, *syntax.SliceType, *syntax.StructType, *syntax.FuncType,
|
||||||
|
@ -274,7 +274,7 @@ func (check *Checker) sliceExpr(x *operand, e *syntax.SliceExpr) {
|
|||||||
|
|
||||||
// spec: "Only the first index may be omitted; it defaults to 0."
|
// spec: "Only the first index may be omitted; it defaults to 0."
|
||||||
if e.Full && (e.Index[1] == nil || e.Index[2] == nil) {
|
if e.Full && (e.Index[1] == nil || e.Index[2] == nil) {
|
||||||
check.error(e, 0, invalidAST+"2nd and 3rd index required in 3-index slice")
|
check.error(e, InvalidSyntaxTree, invalidAST+"2nd and 3rd index required in 3-index slice")
|
||||||
x.mode = invalid
|
x.mode = invalid
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -329,12 +329,12 @@ L:
|
|||||||
func (check *Checker) singleIndex(e *syntax.IndexExpr) syntax.Expr {
|
func (check *Checker) singleIndex(e *syntax.IndexExpr) syntax.Expr {
|
||||||
index := e.Index
|
index := e.Index
|
||||||
if index == nil {
|
if index == nil {
|
||||||
check.errorf(e, 0, invalidAST+"missing index for %s", e.X)
|
check.errorf(e, InvalidSyntaxTree, invalidAST+"missing index for %s", e.X)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if l, _ := index.(*syntax.ListExpr); l != nil {
|
if l, _ := index.(*syntax.ListExpr); l != nil {
|
||||||
if n := len(l.ElemList); n <= 1 {
|
if n := len(l.ElemList); n <= 1 {
|
||||||
check.errorf(e, 0, invalidAST+"invalid use of ListExpr for index expression %v with %d indices", e, n)
|
check.errorf(e, InvalidSyntaxTree, invalidAST+"invalid use of ListExpr for index expression %v with %d indices", e, n)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// len(l.ElemList) > 1
|
// len(l.ElemList) > 1
|
||||||
|
@ -143,7 +143,7 @@ func (check *Checker) interfaceType(ityp *Interface, iface *syntax.InterfaceType
|
|||||||
sig, _ := typ.(*Signature)
|
sig, _ := typ.(*Signature)
|
||||||
if sig == nil {
|
if sig == nil {
|
||||||
if typ != Typ[Invalid] {
|
if typ != Typ[Invalid] {
|
||||||
check.errorf(f.Type, 0, invalidAST+"%s is not a method signature", typ)
|
check.errorf(f.Type, InvalidSyntaxTree, invalidAST+"%s is not a method signature", typ)
|
||||||
}
|
}
|
||||||
continue // ignore
|
continue // ignore
|
||||||
}
|
}
|
||||||
|
@ -219,7 +219,7 @@ func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *syntax.Lab
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
check.errorf(s, 0, invalidAST+"branch statement: %s %s", s.Tok, name)
|
check.errorf(s, InvalidSyntaxTree, invalidAST+"branch statement: %s %s", s.Tok, name)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -467,7 +467,7 @@ func (check *Checker) collectObjects() {
|
|||||||
obj.setOrder(uint32(len(check.objMap)))
|
obj.setOrder(uint32(len(check.objMap)))
|
||||||
|
|
||||||
default:
|
default:
|
||||||
check.errorf(s, 0, invalidAST+"unknown syntax.Decl node %T", s)
|
check.errorf(s, InvalidSyntaxTree, invalidAST+"unknown syntax.Decl node %T", s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -550,7 +550,7 @@ L: // unpack receiver type
|
|||||||
case *syntax.BadExpr:
|
case *syntax.BadExpr:
|
||||||
// ignore - error already reported by parser
|
// ignore - error already reported by parser
|
||||||
case nil:
|
case nil:
|
||||||
check.error(ptyp, 0, invalidAST+"parameterized receiver contains nil parameters")
|
check.error(ptyp, InvalidSyntaxTree, invalidAST+"parameterized receiver contains nil parameters")
|
||||||
default:
|
default:
|
||||||
check.errorf(arg, BadDecl, "receiver type parameter %s must be an identifier", arg)
|
check.errorf(arg, BadDecl, "receiver type parameter %s must be an identifier", arg)
|
||||||
}
|
}
|
||||||
|
@ -289,7 +289,7 @@ func (check *Checker) collectParams(scope *Scope, list []*syntax.Field, variadic
|
|||||||
// named parameter
|
// named parameter
|
||||||
name := field.Name.Value
|
name := field.Name.Value
|
||||||
if name == "" {
|
if name == "" {
|
||||||
check.error(field.Name, 0, invalidAST+"anonymous parameter")
|
check.error(field.Name, InvalidSyntaxTree, invalidAST+"anonymous parameter")
|
||||||
// ok to continue
|
// ok to continue
|
||||||
}
|
}
|
||||||
par := NewParam(field.Name.Pos(), check.pkg, name, typ)
|
par := NewParam(field.Name.Pos(), check.pkg, name, typ)
|
||||||
@ -306,7 +306,7 @@ func (check *Checker) collectParams(scope *Scope, list []*syntax.Field, variadic
|
|||||||
}
|
}
|
||||||
|
|
||||||
if named && anonymous {
|
if named && anonymous {
|
||||||
check.error(list[0], 0, invalidAST+"list contains both named and anonymous parameters")
|
check.error(list[0], InvalidSyntaxTree, invalidAST+"list contains both named and anonymous parameters")
|
||||||
// ok to continue
|
// ok to continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -450,7 +450,7 @@ func (check *Checker) stmt(ctxt stmtContext, s syntax.Stmt) {
|
|||||||
if s.Rhs == nil {
|
if s.Rhs == nil {
|
||||||
// x++ or x--
|
// x++ or x--
|
||||||
if len(lhs) != 1 {
|
if len(lhs) != 1 {
|
||||||
check.errorf(s, 0, invalidAST+"%s%s requires one operand", s.Op, s.Op)
|
check.errorf(s, InvalidSyntaxTree, invalidAST+"%s%s requires one operand", s.Op, s.Op)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var x operand
|
var x operand
|
||||||
@ -554,7 +554,7 @@ func (check *Checker) stmt(ctxt stmtContext, s syntax.Stmt) {
|
|||||||
// goto's must have labels, should have been caught above
|
// goto's must have labels, should have been caught above
|
||||||
fallthrough
|
fallthrough
|
||||||
default:
|
default:
|
||||||
check.errorf(s, 0, invalidAST+"branch statement: %s", s.Tok)
|
check.errorf(s, InvalidSyntaxTree, invalidAST+"branch statement: %s", s.Tok)
|
||||||
}
|
}
|
||||||
|
|
||||||
case *syntax.BlockStmt:
|
case *syntax.BlockStmt:
|
||||||
@ -582,7 +582,7 @@ func (check *Checker) stmt(ctxt stmtContext, s syntax.Stmt) {
|
|||||||
case *syntax.IfStmt, *syntax.BlockStmt:
|
case *syntax.IfStmt, *syntax.BlockStmt:
|
||||||
check.stmt(inner, s.Else)
|
check.stmt(inner, s.Else)
|
||||||
default:
|
default:
|
||||||
check.error(s.Else, 0, invalidAST+"invalid else branch in if statement")
|
check.error(s.Else, InvalidSyntaxTree, invalidAST+"invalid else branch in if statement")
|
||||||
}
|
}
|
||||||
|
|
||||||
case *syntax.SwitchStmt:
|
case *syntax.SwitchStmt:
|
||||||
@ -674,7 +674,7 @@ func (check *Checker) stmt(ctxt stmtContext, s syntax.Stmt) {
|
|||||||
check.stmt(inner, s.Body)
|
check.stmt(inner, s.Body)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
check.error(s, 0, invalidAST+"invalid statement")
|
check.error(s, InvalidSyntaxTree, invalidAST+"invalid statement")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,7 +710,7 @@ func (check *Checker) switchStmt(inner stmtContext, s *syntax.SwitchStmt) {
|
|||||||
seen := make(valueMap) // map of seen case values to positions and types
|
seen := make(valueMap) // map of seen case values to positions and types
|
||||||
for i, clause := range s.Body {
|
for i, clause := range s.Body {
|
||||||
if clause == nil {
|
if clause == nil {
|
||||||
check.error(clause, 0, invalidAST+"incorrect expression switch case")
|
check.error(clause, InvalidSyntaxTree, invalidAST+"incorrect expression switch case")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
end := s.Rbrace
|
end := s.Rbrace
|
||||||
@ -773,7 +773,7 @@ func (check *Checker) typeSwitchStmt(inner stmtContext, s *syntax.SwitchStmt, gu
|
|||||||
seen := make(map[Type]syntax.Expr) // map of seen types to positions
|
seen := make(map[Type]syntax.Expr) // map of seen types to positions
|
||||||
for i, clause := range s.Body {
|
for i, clause := range s.Body {
|
||||||
if clause == nil {
|
if clause == nil {
|
||||||
check.error(s, 0, invalidAST+"incorrect type switch case")
|
check.error(s, InvalidSyntaxTree, invalidAST+"incorrect type switch case")
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
end := s.Rbrace
|
end := s.Rbrace
|
||||||
@ -836,7 +836,7 @@ func (check *Checker) rangeStmt(inner stmtContext, s *syntax.ForStmt, rclause *s
|
|||||||
var sValue, sExtra syntax.Expr
|
var sValue, sExtra syntax.Expr
|
||||||
if p, _ := sKey.(*syntax.ListExpr); p != nil {
|
if p, _ := sKey.(*syntax.ListExpr); p != nil {
|
||||||
if len(p.ElemList) < 2 {
|
if len(p.ElemList) < 2 {
|
||||||
check.error(s, 0, invalidAST+"invalid lhs in range clause")
|
check.error(s, InvalidSyntaxTree, invalidAST+"invalid lhs in range clause")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// len(p.ElemList) >= 2
|
// len(p.ElemList) >= 2
|
||||||
@ -918,7 +918,7 @@ func (check *Checker) rangeStmt(inner stmtContext, s *syntax.ForStmt, rclause *s
|
|||||||
vars = append(vars, obj)
|
vars = append(vars, obj)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
check.errorf(lhs, 0, invalidAST+"cannot declare %s", lhs)
|
check.errorf(lhs, InvalidSyntaxTree, invalidAST+"cannot declare %s", lhs)
|
||||||
obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable
|
obj = NewVar(lhs.Pos(), check.pkg, "_", nil) // dummy variable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ func (check *Checker) structType(styp *Struct, e *syntax.StructType) {
|
|||||||
pos := syntax.StartPos(f.Type)
|
pos := syntax.StartPos(f.Type)
|
||||||
name := embeddedFieldIdent(f.Type)
|
name := embeddedFieldIdent(f.Type)
|
||||||
if name == nil {
|
if name == nil {
|
||||||
check.errorf(pos, 0, invalidAST+"invalid embedded field type %s", f.Type)
|
check.errorf(pos, InvalidSyntaxTree, invalidAST+"invalid embedded field type %s", f.Type)
|
||||||
name = &syntax.Name{Value: "_"} // TODO(gri) need to set position to pos
|
name = &syntax.Name{Value: "_"} // TODO(gri) need to set position to pos
|
||||||
addInvalid(name, pos)
|
addInvalid(name, pos)
|
||||||
continue
|
continue
|
||||||
@ -217,7 +217,7 @@ func (check *Checker) tag(t *syntax.BasicLit) string {
|
|||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
check.errorf(t, 0, invalidAST+"incorrect tag syntax: %q", t.Value)
|
check.errorf(t, InvalidSyntaxTree, invalidAST+"incorrect tag syntax: %q", t.Value)
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
@ -385,7 +385,7 @@ func (check *Checker) typInternal(e0 syntax.Expr, def *Named) (T Type) {
|
|||||||
case syntax.RecvOnly:
|
case syntax.RecvOnly:
|
||||||
dir = RecvOnly
|
dir = RecvOnly
|
||||||
default:
|
default:
|
||||||
check.errorf(e, 0, invalidAST+"unknown channel direction %d", e.Dir)
|
check.errorf(e, InvalidSyntaxTree, invalidAST+"unknown channel direction %d", e.Dir)
|
||||||
// ok to continue
|
// ok to continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,8 @@ func (check *Checker) assignment(x *operand, T Type, context string) {
|
|||||||
// ok
|
// ok
|
||||||
default:
|
default:
|
||||||
// we may get here because of other problems (issue #39634, crash 12)
|
// we may get here because of other problems (issue #39634, crash 12)
|
||||||
check.errorf(x, 0, "cannot assign %s to %s in %s", x, T, context)
|
// TODO(gri) do we need a new "generic" error code here?
|
||||||
|
check.errorf(x, IncompatibleAssign, "cannot assign %s to %s in %s", x, T, context)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,7 +293,7 @@ func (check *Checker) arguments(call *ast.CallExpr, sig *Signature, targs []Type
|
|||||||
for _, a := range args {
|
for _, a := range args {
|
||||||
switch a.mode {
|
switch a.mode {
|
||||||
case typexpr:
|
case typexpr:
|
||||||
check.errorf(a, 0, "%s used as value", a)
|
check.errorf(a, NotAnExpr, "%s used as value", a)
|
||||||
return
|
return
|
||||||
case invalid:
|
case invalid:
|
||||||
return
|
return
|
||||||
|
@ -220,6 +220,10 @@ func (check *Checker) report(errp *error_) {
|
|||||||
panic("empty error details")
|
panic("empty error details")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if errp.code == 0 {
|
||||||
|
panic("no error code provided")
|
||||||
|
}
|
||||||
|
|
||||||
span := spanOf(errp.desc[0].posn)
|
span := spanOf(errp.desc[0].posn)
|
||||||
e := Error{
|
e := Error{
|
||||||
Fset: check.fset,
|
Fset: check.fset,
|
||||||
@ -301,7 +305,7 @@ func (check *Checker) versionErrorf(at positioner, goVersion string, format stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (check *Checker) invalidAST(at positioner, format string, args ...any) {
|
func (check *Checker) invalidAST(at positioner, format string, args ...any) {
|
||||||
check.errorf(at, 0, "invalid AST: "+format, args...)
|
check.errorf(at, InvalidSyntaxTree, "invalid AST: "+format, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (check *Checker) invalidArg(at positioner, code Code, format string, args ...any) {
|
func (check *Checker) invalidArg(at positioner, code Code, format string, args ...any) {
|
||||||
|
Loading…
Reference in New Issue
Block a user