summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/compile/internal/base/print.go5
-rw-r--r--src/cmd/compile/internal/escape/escape.go2
-rw-r--r--src/cmd/compile/internal/escape/graph.go2
-rw-r--r--src/cmd/compile/internal/ir/func.go2
-rw-r--r--src/cmd/compile/internal/noder/irgen.go7
-rw-r--r--src/cmd/compile/internal/noder/noder.go2
-rw-r--r--src/cmd/compile/internal/noder/writer.go2
-rw-r--r--src/cmd/compile/internal/pkginit/initorder.go3
-rw-r--r--src/cmd/compile/internal/ssagen/abi.go4
-rw-r--r--src/cmd/compile/internal/ssagen/nowb.go4
-rw-r--r--src/cmd/compile/internal/ssagen/pgen.go4
-rw-r--r--src/cmd/compile/internal/staticdata/data.go2
-rw-r--r--src/cmd/compile/internal/staticdata/embed.go14
-rw-r--r--src/cmd/compile/internal/typecheck/const.go3
-rw-r--r--src/cmd/compile/internal/typecheck/dcl.go9
-rw-r--r--src/cmd/compile/internal/typecheck/stmt.go55
-rw-r--r--src/cmd/compile/internal/typecheck/typecheck.go5
-rw-r--r--src/cmd/compile/internal/types/size.go7
-rw-r--r--src/cmd/compile/internal/types/type.go3
-rw-r--r--src/cmd/compile/internal/walk/expr.go4
20 files changed, 74 insertions, 65 deletions
diff --git a/src/cmd/compile/internal/base/print.go b/src/cmd/compile/internal/base/print.go
index 21fa001457..6d21c33254 100644
--- a/src/cmd/compile/internal/base/print.go
+++ b/src/cmd/compile/internal/base/print.go
@@ -7,6 +7,7 @@ package base
import (
"fmt"
"internal/buildcfg"
+ "internal/types/errors"
"os"
"runtime/debug"
"sort"
@@ -105,11 +106,11 @@ func sameline(a, b src.XPos) bool {
// Errorf reports a formatted error at the current line.
func Errorf(format string, args ...interface{}) {
- ErrorfAt(Pos, format, args...)
+ ErrorfAt(Pos, 0, format, args...)
}
// ErrorfAt reports a formatted error message at pos.
-func ErrorfAt(pos src.XPos, format string, args ...interface{}) {
+func ErrorfAt(pos src.XPos, code errors.Code, format string, args ...interface{}) {
msg := fmt.Sprintf(format, args...)
if strings.HasPrefix(msg, "syntax error") {
diff --git a/src/cmd/compile/internal/escape/escape.go b/src/cmd/compile/internal/escape/escape.go
index 05fbe58bbc..f17ac13fe8 100644
--- a/src/cmd/compile/internal/escape/escape.go
+++ b/src/cmd/compile/internal/escape/escape.go
@@ -303,7 +303,7 @@ func (b *batch) finish(fns []*ir.Func) {
if loc.escapes {
if n.Op() == ir.ONAME {
if base.Flag.CompilingRuntime {
- base.ErrorfAt(n.Pos(), "%v escapes to heap, not allowed in runtime", n)
+ base.ErrorfAt(n.Pos(), 0, "%v escapes to heap, not allowed in runtime", n)
}
if base.Flag.LowerM != 0 {
base.WarnfAt(n.Pos(), "moved to heap: %v", n)
diff --git a/src/cmd/compile/internal/escape/graph.go b/src/cmd/compile/internal/escape/graph.go
index cc3d078add..fc18f7715f 100644
--- a/src/cmd/compile/internal/escape/graph.go
+++ b/src/cmd/compile/internal/escape/graph.go
@@ -218,7 +218,7 @@ func (e *escape) newLoc(n ir.Node, transient bool) *location {
base.Fatalf("e.curfn isn't set")
}
if n != nil && n.Type() != nil && n.Type().NotInHeap() {
- base.ErrorfAt(n.Pos(), "%v is incomplete (or unallocatable); stack allocation disallowed", n.Type())
+ base.ErrorfAt(n.Pos(), 0, "%v is incomplete (or unallocatable); stack allocation disallowed", n.Type())
}
if n != nil && n.Op() == ir.ONAME {
diff --git a/src/cmd/compile/internal/ir/func.go b/src/cmd/compile/internal/ir/func.go
index 76ab952157..2886185f0a 100644
--- a/src/cmd/compile/internal/ir/func.go
+++ b/src/cmd/compile/internal/ir/func.go
@@ -331,7 +331,7 @@ func ClosureDebugRuntimeCheck(clo *ClosureExpr) {
}
}
if base.Flag.CompilingRuntime && clo.Esc() == EscHeap && !clo.IsGoWrap {
- base.ErrorfAt(clo.Pos(), "heap-allocated closure %s, not allowed in runtime", FuncName(clo.Func))
+ base.ErrorfAt(clo.Pos(), 0, "heap-allocated closure %s, not allowed in runtime", FuncName(clo.Func))
}
}
diff --git a/src/cmd/compile/internal/noder/irgen.go b/src/cmd/compile/internal/noder/irgen.go
index f0addc4892..3adf9e5d11 100644
--- a/src/cmd/compile/internal/noder/irgen.go
+++ b/src/cmd/compile/internal/noder/irgen.go
@@ -6,6 +6,7 @@ package noder
import (
"fmt"
+ "internal/types/errors"
"regexp"
"sort"
@@ -47,7 +48,7 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
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)
+ base.ErrorfAt(m.makeXPos(terr.Pos), terr.Code, "%s", msg)
},
Importer: &importer,
Sizes: &gcSizes{},
@@ -72,7 +73,7 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
syntax.Inspect(file, func(n syntax.Node) bool {
if n, ok := n.(*syntax.InterfaceType); ok {
if f.hasCycle(n.GetTypeInfo().Type.(*types2.Interface)) {
- base.ErrorfAt(m.makeXPos(n.Pos()), "invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)")
+ base.ErrorfAt(m.makeXPos(n.Pos()), errors.InvalidTypeCycle, "invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)")
for typ := range f.cyclic {
f.cyclic[typ] = false // suppress duplicate errors
@@ -106,7 +107,7 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
return ti.pos.Before(tj.pos)
})
for _, targ := range nihTargs {
- base.ErrorfAt(targ.pos, "cannot use incomplete (or unallocatable) type as a type argument: %v", targ.typ)
+ base.ErrorfAt(targ.pos, 0, "cannot use incomplete (or unallocatable) type as a type argument: %v", targ.typ)
}
}
diff --git a/src/cmd/compile/internal/noder/noder.go b/src/cmd/compile/internal/noder/noder.go
index 16113e37a3..c846130976 100644
--- a/src/cmd/compile/internal/noder/noder.go
+++ b/src/cmd/compile/internal/noder/noder.go
@@ -65,7 +65,7 @@ func LoadPackage(filenames []string) {
var m posMap
for _, p := range noders {
for e := range p.err {
- base.ErrorfAt(m.makeXPos(e.Pos), "%s", e.Msg)
+ base.ErrorfAt(m.makeXPos(e.Pos), 0, "%s", e.Msg)
}
if p.file == nil {
base.ErrorExit()
diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go
index 97862938ee..72c7a1fc86 100644
--- a/src/cmd/compile/internal/noder/writer.go
+++ b/src/cmd/compile/internal/noder/writer.go
@@ -108,7 +108,7 @@ func newPkgWriter(m posMap, pkg *types2.Package, info *types2.Info) *pkgWriter {
// errorf reports a user error about thing p.
func (pw *pkgWriter) errorf(p poser, msg string, args ...interface{}) {
- base.ErrorfAt(pw.m.pos(p), msg, args...)
+ base.ErrorfAt(pw.m.pos(p), 0, msg, args...)
}
// fatalf reports an internal compiler error about thing p.
diff --git a/src/cmd/compile/internal/pkginit/initorder.go b/src/cmd/compile/internal/pkginit/initorder.go
index 426d2985ab..db24264989 100644
--- a/src/cmd/compile/internal/pkginit/initorder.go
+++ b/src/cmd/compile/internal/pkginit/initorder.go
@@ -7,6 +7,7 @@ package pkginit
import (
"container/heap"
"fmt"
+ "internal/types/errors"
"strings"
"cmd/compile/internal/base"
@@ -243,7 +244,7 @@ func reportInitLoopAndExit(l []*ir.Name) {
}
fmt.Fprintf(&msg, "\t%v: %v", ir.Line(l[0]), l[0])
- base.ErrorfAt(l[0].Pos(), msg.String())
+ base.ErrorfAt(l[0].Pos(), errors.InvalidInitCycle, msg.String())
base.ErrorExit()
}
diff --git a/src/cmd/compile/internal/ssagen/abi.go b/src/cmd/compile/internal/ssagen/abi.go
index 9c725b898d..a6e1b1812f 100644
--- a/src/cmd/compile/internal/ssagen/abi.go
+++ b/src/cmd/compile/internal/ssagen/abi.go
@@ -146,7 +146,7 @@ func (s *SymABIs) GenABIWrappers() {
defABI, hasDefABI := s.defs[symName]
if hasDefABI {
if len(fn.Body) != 0 {
- base.ErrorfAt(fn.Pos(), "%v defined in both Go and assembly", fn)
+ base.ErrorfAt(fn.Pos(), 0, "%v defined in both Go and assembly", fn)
}
fn.ABI = defABI
}
@@ -251,7 +251,7 @@ func makeABIWrapper(f *ir.Func, wrapperABI obj.ABI) {
// below to handle the receiver. Panic if we see this scenario.
ft := f.Nname.Type()
if ft.NumRecvs() != 0 {
- base.ErrorfAt(f.Pos(), "makeABIWrapper support for wrapping methods not implemented")
+ base.ErrorfAt(f.Pos(), 0, "makeABIWrapper support for wrapping methods not implemented")
return
}
diff --git a/src/cmd/compile/internal/ssagen/nowb.go b/src/cmd/compile/internal/ssagen/nowb.go
index 909319dcbf..9de1b9ae36 100644
--- a/src/cmd/compile/internal/ssagen/nowb.go
+++ b/src/cmd/compile/internal/ssagen/nowb.go
@@ -154,7 +154,7 @@ func (c *nowritebarrierrecChecker) check() {
}
// Check go:nowritebarrier functions.
if fn.Pragma&ir.Nowritebarrier != 0 && fn.WBPos.IsKnown() {
- base.ErrorfAt(fn.WBPos, "write barrier prohibited")
+ base.ErrorfAt(fn.WBPos, 0, "write barrier prohibited")
}
}
@@ -185,7 +185,7 @@ func (c *nowritebarrierrecChecker) check() {
fmt.Fprintf(&err, "\n\t%v: called by %v", base.FmtPos(call.lineno), call.target.Nname)
call = funcs[call.target]
}
- base.ErrorfAt(fn.WBPos, "write barrier prohibited by caller; %v%s", fn.Nname, err.String())
+ base.ErrorfAt(fn.WBPos, 0, "write barrier prohibited by caller; %v%s", fn.Nname, err.String())
continue
}
diff --git a/src/cmd/compile/internal/ssagen/pgen.go b/src/cmd/compile/internal/ssagen/pgen.go
index a0378c755a..9fd3f2aee4 100644
--- a/src/cmd/compile/internal/ssagen/pgen.go
+++ b/src/cmd/compile/internal/ssagen/pgen.go
@@ -327,9 +327,9 @@ func CheckLargeStacks() {
})
for _, large := range largeStackFrames {
if large.callee != 0 {
- base.ErrorfAt(large.pos, "stack frame too large (>1GB): %d MB locals + %d MB args + %d MB callee", large.locals>>20, large.args>>20, large.callee>>20)
+ base.ErrorfAt(large.pos, 0, "stack frame too large (>1GB): %d MB locals + %d MB args + %d MB callee", large.locals>>20, large.args>>20, large.callee>>20)
} else {
- base.ErrorfAt(large.pos, "stack frame too large (>1GB): %d MB locals + %d MB args", large.locals>>20, large.args>>20)
+ base.ErrorfAt(large.pos, 0, "stack frame too large (>1GB): %d MB locals + %d MB args", large.locals>>20, large.args>>20)
}
}
}
diff --git a/src/cmd/compile/internal/staticdata/data.go b/src/cmd/compile/internal/staticdata/data.go
index 662580f8e2..e39d0ee6a5 100644
--- a/src/cmd/compile/internal/staticdata/data.go
+++ b/src/cmd/compile/internal/staticdata/data.go
@@ -214,7 +214,7 @@ func dstringdata(s *obj.LSym, off int, t string, pos src.XPos, what string) int
// causing a cryptic error message by the linker. Check for oversize objects here
// and provide a useful error message instead.
if int64(len(t)) > 2e9 {
- base.ErrorfAt(pos, "%v with length %v is too big", what, len(t))
+ base.ErrorfAt(pos, 0, "%v with length %v is too big", what, len(t))
return 0
}
diff --git a/src/cmd/compile/internal/staticdata/embed.go b/src/cmd/compile/internal/staticdata/embed.go
index 8d4dedff59..a4d493ce5e 100644
--- a/src/cmd/compile/internal/staticdata/embed.go
+++ b/src/cmd/compile/internal/staticdata/embed.go
@@ -31,11 +31,11 @@ func embedFileList(v *ir.Name, kind int) []string {
for _, pattern := range e.Patterns {
files, ok := base.Flag.Cfg.Embed.Patterns[pattern]
if !ok {
- base.ErrorfAt(e.Pos, "invalid go:embed: build system did not map pattern: %s", pattern)
+ base.ErrorfAt(e.Pos, 0, "invalid go:embed: build system did not map pattern: %s", pattern)
}
for _, file := range files {
if base.Flag.Cfg.Embed.Files[file] == "" {
- base.ErrorfAt(e.Pos, "invalid go:embed: build system did not map file: %s", file)
+ base.ErrorfAt(e.Pos, 0, "invalid go:embed: build system did not map file: %s", file)
continue
}
if !have[file] {
@@ -57,7 +57,7 @@ func embedFileList(v *ir.Name, kind int) []string {
if kind == embedString || kind == embedBytes {
if len(list) > 1 {
- base.ErrorfAt(v.Pos(), "invalid go:embed: multiple files for type %v", v.Type())
+ base.ErrorfAt(v.Pos(), 0, "invalid go:embed: multiple files for type %v", v.Type())
return nil
}
}
@@ -109,12 +109,12 @@ func WriteEmbed(v *ir.Name) {
commentPos := (*v.Embed)[0].Pos
if base.Flag.Cfg.Embed.Patterns == nil {
- base.ErrorfAt(commentPos, "invalid go:embed: build system did not supply embed configuration")
+ base.ErrorfAt(commentPos, 0, "invalid go:embed: build system did not supply embed configuration")
return
}
kind := embedKind(v.Type())
if kind == embedUnknown {
- base.ErrorfAt(v.Pos(), "go:embed cannot apply to var of type %v", v.Type())
+ base.ErrorfAt(v.Pos(), 0, "go:embed cannot apply to var of type %v", v.Type())
return
}
@@ -124,7 +124,7 @@ func WriteEmbed(v *ir.Name) {
file := files[0]
fsym, size, err := fileStringSym(v.Pos(), base.Flag.Cfg.Embed.Files[file], kind == embedString, nil)
if err != nil {
- base.ErrorfAt(v.Pos(), "embed %s: %v", file, err)
+ base.ErrorfAt(v.Pos(), 0, "embed %s: %v", file, err)
}
sym := v.Linksym()
off := 0
@@ -160,7 +160,7 @@ func WriteEmbed(v *ir.Name) {
} else {
fsym, size, err := fileStringSym(v.Pos(), base.Flag.Cfg.Embed.Files[file], true, hash)
if err != nil {
- base.ErrorfAt(v.Pos(), "embed %s: %v", file, err)
+ base.ErrorfAt(v.Pos(), 0, "embed %s: %v", file, err)
}
off = objw.SymPtr(slicedata, off, fsym, 0) // data string
off = objw.Uintptr(slicedata, off, uint64(size))
diff --git a/src/cmd/compile/internal/typecheck/const.go b/src/cmd/compile/internal/typecheck/const.go
index d43fa31782..060053bc8d 100644
--- a/src/cmd/compile/internal/typecheck/const.go
+++ b/src/cmd/compile/internal/typecheck/const.go
@@ -8,6 +8,7 @@ import (
"fmt"
"go/constant"
"go/token"
+ "internal/types/errors"
"math"
"math/big"
"strings"
@@ -567,7 +568,7 @@ func OrigConst(n ir.Node, v constant.Value) ir.Node {
if what == "" {
base.Fatalf("unexpected overflow: %v", n.Op())
}
- base.ErrorfAt(n.Pos(), "constant %v overflow", what)
+ base.ErrorfAt(n.Pos(), errors.NumericOverflow, "constant %v overflow", what)
n.SetType(nil)
return n
}
diff --git a/src/cmd/compile/internal/typecheck/dcl.go b/src/cmd/compile/internal/typecheck/dcl.go
index fcac52a17c..029c14f819 100644
--- a/src/cmd/compile/internal/typecheck/dcl.go
+++ b/src/cmd/compile/internal/typecheck/dcl.go
@@ -6,6 +6,7 @@ package typecheck
import (
"fmt"
+ "internal/types/errors"
"sync"
"cmd/compile/internal/base"
@@ -48,15 +49,15 @@ func Declare(n *ir.Name, ctxt ir.Class) {
// kludgy: TypecheckAllowed means we're past parsing. Eg reflectdata.methodWrapper may declare out of package names later.
if !inimport && !TypecheckAllowed && s.Pkg != types.LocalPkg {
- base.ErrorfAt(n.Pos(), "cannot declare name %v", s)
+ base.ErrorfAt(n.Pos(), 0, "cannot declare name %v", s)
}
if ctxt == ir.PEXTERN {
if s.Name == "init" {
- base.ErrorfAt(n.Pos(), "cannot declare init - must be func")
+ base.ErrorfAt(n.Pos(), errors.InvalidInitDecl, "cannot declare init - must be func")
}
if s.Name == "main" && s.Pkg.Name == "main" {
- base.ErrorfAt(n.Pos(), "cannot declare main - must be func")
+ base.ErrorfAt(n.Pos(), errors.InvalidMainDecl, "cannot declare main - must be func")
}
Target.Externs = append(Target.Externs, n)
s.Def = n
@@ -154,7 +155,7 @@ func checkdupfields(what string, fss ...[]*types.Field) {
continue
}
if seen[f.Sym] {
- base.ErrorfAt(f.Pos, "duplicate %s %s", what, f.Sym.Name)
+ base.ErrorfAt(f.Pos, errors.DuplicateFieldAndMethod, "duplicate %s %s", what, f.Sym.Name)
continue
}
seen[f.Sym] = true
diff --git a/src/cmd/compile/internal/typecheck/stmt.go b/src/cmd/compile/internal/typecheck/stmt.go
index 2af6c26a16..eb13175384 100644
--- a/src/cmd/compile/internal/typecheck/stmt.go
+++ b/src/cmd/compile/internal/typecheck/stmt.go
@@ -9,6 +9,7 @@ import (
"cmd/compile/internal/ir"
"cmd/compile/internal/types"
"cmd/internal/src"
+ "internal/types/errors"
)
func RangeExprType(t *types.Type) *types.Type {
@@ -37,7 +38,7 @@ func typecheckrangeExpr(n *ir.RangeStmt) {
toomany := false
switch t.Kind() {
default:
- base.ErrorfAt(n.Pos(), "cannot range over %L", n.X)
+ base.ErrorfAt(n.Pos(), errors.InvalidRangeExpr, "cannot range over %L", n.X)
return
case types.TARRAY, types.TSLICE:
@@ -50,7 +51,7 @@ func typecheckrangeExpr(n *ir.RangeStmt) {
case types.TCHAN:
if !t.ChanDir().CanRecv() {
- base.ErrorfAt(n.Pos(), "invalid operation: range %v (receive from send-only type %v)", n.X, n.X.Type())
+ base.ErrorfAt(n.Pos(), errors.InvalidRangeExpr, "invalid operation: range %v (receive from send-only type %v)", n.X, n.X.Type())
return
}
@@ -66,7 +67,7 @@ func typecheckrangeExpr(n *ir.RangeStmt) {
}
if toomany {
- base.ErrorfAt(n.Pos(), "too many variables in range")
+ base.ErrorfAt(n.Pos(), errors.InvalidIterVar, "too many variables in range")
}
do := func(nn ir.Node, t *types.Type) {
@@ -75,7 +76,7 @@ func typecheckrangeExpr(n *ir.RangeStmt) {
nn.SetType(t)
} else if nn.Type() != nil {
if op, why := Assignop(t, nn.Type()); op == ir.OXXX {
- base.ErrorfAt(n.Pos(), "cannot assign type %v to %L in range%s", t, nn, why)
+ base.ErrorfAt(n.Pos(), errors.InvalidIterVar, "cannot assign type %v to %L in range%s", t, nn, why)
}
}
checkassign(nn)
@@ -185,10 +186,10 @@ assignOK:
if len(lhs) != cr {
if r, ok := rhs[0].(*ir.CallExpr); ok && len(rhs) == 1 {
if r.Type() != nil {
- base.ErrorfAt(stmt.Pos(), "assignment mismatch: %d variable%s but %v returns %d value%s", len(lhs), plural(len(lhs)), r.X, cr, plural(cr))
+ base.ErrorfAt(stmt.Pos(), errors.WrongAssignCount, "assignment mismatch: %d variable%s but %v returns %d value%s", len(lhs), plural(len(lhs)), r.X, cr, plural(cr))
}
} else {
- base.ErrorfAt(stmt.Pos(), "assignment mismatch: %d variable%s but %v value%s", len(lhs), plural(len(lhs)), len(rhs), plural(len(rhs)))
+ base.ErrorfAt(stmt.Pos(), errors.WrongAssignCount, "assignment mismatch: %d variable%s but %v value%s", len(lhs), plural(len(lhs)), len(rhs), plural(len(rhs)))
}
for i := range lhs {
@@ -298,7 +299,7 @@ func tcGoDefer(n *ir.GoDeferStmt) {
if orig := ir.Orig(n.Call); orig.Op() == ir.OCONV {
break
}
- base.ErrorfAt(n.Pos(), "%s discards result of %v", what, n.Call)
+ base.ErrorfAt(n.Pos(), errors.UnusedResults, "%s discards result of %v", what, n.Call)
return
}
@@ -379,7 +380,7 @@ func tcSelect(sel *ir.SelectStmt) {
if ncase.Comm == nil {
// default
if def != nil {
- base.ErrorfAt(ncase.Pos(), "multiple defaults in select (first at %v)", ir.Line(def))
+ base.ErrorfAt(ncase.Pos(), errors.DuplicateDefault, "multiple defaults in select (first at %v)", ir.Line(def))
} else {
def = ncase
}
@@ -403,7 +404,7 @@ func tcSelect(sel *ir.SelectStmt) {
// on the same line). This matches the approach before 1.10.
pos = ncase.Pos()
}
- base.ErrorfAt(pos, "select case must be receive, send or assign recv")
+ base.ErrorfAt(pos, errors.InvalidSelectCase, "select case must be receive, send or assign recv")
case ir.OAS:
// convert x = <-c into x, _ = <-c
@@ -417,7 +418,7 @@ func tcSelect(sel *ir.SelectStmt) {
}
}
if n.Y.Op() != ir.ORECV {
- base.ErrorfAt(n.Pos(), "select assignment must have receive on right hand side")
+ base.ErrorfAt(n.Pos(), errors.InvalidSelectCase, "select assignment must have receive on right hand side")
break
}
oselrecv2(n.X, n.Y, n.Def)
@@ -425,7 +426,7 @@ func tcSelect(sel *ir.SelectStmt) {
case ir.OAS2RECV:
n := n.(*ir.AssignListStmt)
if n.Rhs[0].Op() != ir.ORECV {
- base.ErrorfAt(n.Pos(), "select assignment must have receive on right hand side")
+ base.ErrorfAt(n.Pos(), errors.InvalidSelectCase, "select assignment must have receive on right hand side")
break
}
n.SetOp(ir.OSELRECV2)
@@ -502,9 +503,9 @@ func tcSwitchExpr(n *ir.SwitchStmt) {
case !types.IsComparable(t):
if t.IsStruct() {
- base.ErrorfAt(n.Pos(), "cannot switch on %L (struct containing %v cannot be compared)", n.Tag, types.IncomparableField(t).Type)
+ base.ErrorfAt(n.Pos(), errors.InvalidExprSwitch, "cannot switch on %L (struct containing %v cannot be compared)", n.Tag, types.IncomparableField(t).Type)
} else {
- base.ErrorfAt(n.Pos(), "cannot switch on %L", n.Tag)
+ base.ErrorfAt(n.Pos(), errors.InvalidExprSwitch, "cannot switch on %L", n.Tag)
}
t = nil
}
@@ -515,7 +516,7 @@ func tcSwitchExpr(n *ir.SwitchStmt) {
ls := ncase.List
if len(ls) == 0 { // default:
if defCase != nil {
- base.ErrorfAt(ncase.Pos(), "multiple defaults in switch (first at %v)", ir.Line(defCase))
+ base.ErrorfAt(ncase.Pos(), errors.DuplicateDefault, "multiple defaults in switch (first at %v)", ir.Line(defCase))
} else {
defCase = ncase
}
@@ -531,17 +532,17 @@ func tcSwitchExpr(n *ir.SwitchStmt) {
}
if nilonly != "" && !ir.IsNil(n1) {
- base.ErrorfAt(ncase.Pos(), "invalid case %v in switch (can only compare %s %v to nil)", n1, nilonly, n.Tag)
+ base.ErrorfAt(ncase.Pos(), errors.MismatchedTypes, "invalid case %v in switch (can only compare %s %v to nil)", n1, nilonly, n.Tag)
} else if t.IsInterface() && !n1.Type().IsInterface() && !types.IsComparable(n1.Type()) {
- base.ErrorfAt(ncase.Pos(), "invalid case %L in switch (incomparable type)", n1)
+ base.ErrorfAt(ncase.Pos(), errors.UndefinedOp, "invalid case %L in switch (incomparable type)", n1)
} else {
op1, _ := Assignop(n1.Type(), t)
op2, _ := Assignop(t, n1.Type())
if op1 == ir.OXXX && op2 == ir.OXXX {
if n.Tag != nil {
- base.ErrorfAt(ncase.Pos(), "invalid case %v in switch on %v (mismatched types %v and %v)", n1, n.Tag, n1.Type(), t)
+ base.ErrorfAt(ncase.Pos(), errors.MismatchedTypes, "invalid case %v in switch on %v (mismatched types %v and %v)", n1, n.Tag, n1.Type(), t)
} else {
- base.ErrorfAt(ncase.Pos(), "invalid case %v in switch (mismatched types %v and bool)", n1, n1.Type())
+ base.ErrorfAt(ncase.Pos(), errors.MismatchedTypes, "invalid case %v in switch (mismatched types %v and bool)", n1, n1.Type())
}
}
}
@@ -556,7 +557,7 @@ func tcSwitchType(n *ir.SwitchStmt) {
guard.X = Expr(guard.X)
t := guard.X.Type()
if t != nil && !t.IsInterface() {
- base.ErrorfAt(n.Pos(), "cannot type switch on non-interface value %L", guard.X)
+ base.ErrorfAt(n.Pos(), errors.InvalidTypeSwitch, "cannot type switch on non-interface value %L", guard.X)
t = nil
}
@@ -564,7 +565,7 @@ func tcSwitchType(n *ir.SwitchStmt) {
// declaration itself. So if there are no cases, we won't
// notice that it went unused.
if v := guard.Tag; v != nil && !ir.IsBlank(v) && len(n.Cases) == 0 {
- base.ErrorfAt(v.Pos(), "%v declared but not used", v.Sym())
+ base.ErrorfAt(v.Pos(), errors.UnusedVar, "%v declared but not used", v.Sym())
}
var defCase, nilCase ir.Node
@@ -573,7 +574,7 @@ func tcSwitchType(n *ir.SwitchStmt) {
ls := ncase.List
if len(ls) == 0 { // default:
if defCase != nil {
- base.ErrorfAt(ncase.Pos(), "multiple defaults in switch (first at %v)", ir.Line(defCase))
+ base.ErrorfAt(ncase.Pos(), errors.DuplicateDefault, "multiple defaults in switch (first at %v)", ir.Line(defCase))
} else {
defCase = ncase
}
@@ -590,7 +591,7 @@ func tcSwitchType(n *ir.SwitchStmt) {
var ptr int
if ir.IsNil(n1) { // case nil:
if nilCase != nil {
- base.ErrorfAt(ncase.Pos(), "multiple nil cases in type switch (first at %v)", ir.Line(nilCase))
+ base.ErrorfAt(ncase.Pos(), errors.DuplicateCase, "multiple nil cases in type switch (first at %v)", ir.Line(nilCase))
} else {
nilCase = ncase
}
@@ -600,18 +601,18 @@ func tcSwitchType(n *ir.SwitchStmt) {
continue
}
if n1.Op() != ir.OTYPE {
- base.ErrorfAt(ncase.Pos(), "%L is not a type", n1)
+ base.ErrorfAt(ncase.Pos(), errors.NotAType, "%L is not a type", n1)
continue
}
if !n1.Type().IsInterface() && !implements(n1.Type(), t, &missing, &have, &ptr) {
if have != nil {
- base.ErrorfAt(ncase.Pos(), "impossible type switch case: %L cannot have dynamic type %v"+
+ base.ErrorfAt(ncase.Pos(), errors.ImpossibleAssert, "impossible type switch case: %L cannot have dynamic type %v"+
" (wrong type for %v method)\n\thave %v%S\n\twant %v%S", guard.X, n1.Type(), missing.Sym, have.Sym, have.Type, missing.Sym, missing.Type)
} else if ptr != 0 {
- base.ErrorfAt(ncase.Pos(), "impossible type switch case: %L cannot have dynamic type %v"+
+ base.ErrorfAt(ncase.Pos(), errors.ImpossibleAssert, "impossible type switch case: %L cannot have dynamic type %v"+
" (%v method has pointer receiver)", guard.X, n1.Type(), missing.Sym)
} else {
- base.ErrorfAt(ncase.Pos(), "impossible type switch case: %L cannot have dynamic type %v"+
+ base.ErrorfAt(ncase.Pos(), errors.ImpossibleAssert, "impossible type switch case: %L cannot have dynamic type %v"+
" (missing %v method)", guard.X, n1.Type(), missing.Sym)
}
continue
@@ -659,7 +660,7 @@ func (s *typeSet) add(pos src.XPos, typ *types.Type) {
ls := typ.LinkString()
if prev, ok := s.m[ls]; ok {
- base.ErrorfAt(pos, "duplicate case %v in type switch\n\tprevious case at %s", typ, base.FmtPos(prev))
+ base.ErrorfAt(pos, errors.DuplicateCase, "duplicate case %v in type switch\n\tprevious case at %s", typ, base.FmtPos(prev))
return
}
s.m[ls] = pos
diff --git a/src/cmd/compile/internal/typecheck/typecheck.go b/src/cmd/compile/internal/typecheck/typecheck.go
index 0c84bfe242..29bc61db60 100644
--- a/src/cmd/compile/internal/typecheck/typecheck.go
+++ b/src/cmd/compile/internal/typecheck/typecheck.go
@@ -8,6 +8,7 @@ import (
"fmt"
"go/constant"
"go/token"
+ "internal/types/errors"
"strings"
"cmd/compile/internal/base"
@@ -286,7 +287,7 @@ func typecheck(n ir.Node, top int) (res ir.Node) {
return n
}
}
- base.ErrorfAt(n.Pos(), "invalid recursive type alias %v%s", n, cycleTrace(cycle))
+ base.ErrorfAt(n.Pos(), errors.InvalidDeclCycle, "invalid recursive type alias %v%s", n, cycleTrace(cycle))
}
case ir.OLITERAL:
@@ -294,7 +295,7 @@ func typecheck(n ir.Node, top int) (res ir.Node) {
base.Errorf("%v is not a type", n)
break
}
- base.ErrorfAt(n.Pos(), "constant definition loop%s", cycleTrace(cycleFor(n)))
+ base.ErrorfAt(n.Pos(), errors.InvalidInitCycle, "constant definition loop%s", cycleTrace(cycleFor(n)))
}
if base.Errors() == 0 {
diff --git a/src/cmd/compile/internal/types/size.go b/src/cmd/compile/internal/types/size.go
index b8b90b2a92..1c20350128 100644
--- a/src/cmd/compile/internal/types/size.go
+++ b/src/cmd/compile/internal/types/size.go
@@ -9,6 +9,7 @@ import (
"cmd/compile/internal/base"
"cmd/internal/src"
+ "internal/types/errors"
)
var PtrSize int
@@ -84,7 +85,7 @@ func expandiface(t *Type) {
case !explicit && Identical(m.Type, prev.Type):
return
default:
- base.ErrorfAt(m.Pos, "duplicate method %s", m.Sym.Name)
+ base.ErrorfAt(m.Pos, errors.DuplicateDecl, "duplicate method %s", m.Sym.Name)
}
methods = append(methods, m)
}
@@ -147,7 +148,7 @@ func expandiface(t *Type) {
sort.Sort(MethodsByName(methods))
if int64(len(methods)) >= MaxWidth/int64(PtrSize) {
- base.ErrorfAt(typePos(t), "interface too large")
+ base.ErrorfAt(typePos(t), 0, "interface too large")
}
for i, m := range methods {
m.Offset = int64(i) * int64(PtrSize)
@@ -212,7 +213,7 @@ func calcStructOffset(errtype *Type, t *Type, o int64, flag int) int64 {
maxwidth = 1<<31 - 1
}
if o >= maxwidth {
- base.ErrorfAt(typePos(errtype), "type %L too large", errtype)
+ base.ErrorfAt(typePos(errtype), 0, "type %L too large", errtype)
o = 8 // small but nonzero
}
}
diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go
index 77389495e1..513ce51b2c 100644
--- a/src/cmd/compile/internal/types/type.go
+++ b/src/cmd/compile/internal/types/type.go
@@ -8,6 +8,7 @@ import (
"cmd/compile/internal/base"
"cmd/internal/src"
"fmt"
+ "internal/types/errors"
"sync"
)
@@ -1663,7 +1664,7 @@ func (t *Type) SetUnderlying(underlying *Type) {
// Double-check use of type as embedded type.
if ft.Embedlineno.IsKnown() {
if t.IsPtr() || t.IsUnsafePtr() {
- base.ErrorfAt(ft.Embedlineno, "embedded type cannot be a pointer")
+ base.ErrorfAt(ft.Embedlineno, errors.InvalidPtrEmbed, "embedded type cannot be a pointer")
}
}
}
diff --git a/src/cmd/compile/internal/walk/expr.go b/src/cmd/compile/internal/walk/expr.go
index 6f4a5339ce..72f7832346 100644
--- a/src/cmd/compile/internal/walk/expr.go
+++ b/src/cmd/compile/internal/walk/expr.go
@@ -560,7 +560,7 @@ func walkCall(n *ir.CallExpr, init *ir.Nodes) ir.Node {
fn := arg.(*ir.ConvExpr).X.(*ir.Name)
abi := fn.Func.ABI
if abi != wantABI {
- base.ErrorfAt(n.Pos(), "internal/abi.%s expects an %v function, %s is defined as %v", name, wantABI, fn.Sym().Name, abi)
+ base.ErrorfAt(n.Pos(), 0, "internal/abi.%s expects an %v function, %s is defined as %v", name, wantABI, fn.Sym().Name, abi)
}
var e ir.Node = ir.NewLinksymExpr(n.Pos(), fn.Sym().LinksymABI(abi), types.Types[types.TUINTPTR])
e = ir.NewAddrExpr(n.Pos(), e)
@@ -570,7 +570,7 @@ func walkCall(n *ir.CallExpr, init *ir.Nodes) ir.Node {
// fn is not a defined function. It must be ABIInternal.
// Read the address from func value, i.e. *(*uintptr)(idata(fn)).
if wantABI != obj.ABIInternal {
- base.ErrorfAt(n.Pos(), "internal/abi.%s does not accept func expression, which is ABIInternal", name)
+ base.ErrorfAt(n.Pos(), 0, "internal/abi.%s does not accept func expression, which is ABIInternal", name)
}
arg = walkExpr(arg, init)
var e ir.Node = ir.NewUnaryExpr(n.Pos(), ir.OIDATA, arg)