mirror of
https://github.com/golang/go
synced 2024-11-22 06:24:38 -07:00
cmd/compile: remove quoting in favor of clearer prose in error messages
In an attempt to address issue #65790 (confusing error messages), quoting of names was introduced for some (but not all) names used in error messages. That CL solved the issue at hand at the cost of extra punctuation (the quotes) plus some inconsistency (not all names were quoted). This CL removes the quoting again in favor or adding a qualifying noun (such as "name", "label", "package", "built-in" etc.) before a user- specified name where needed. For instance, instead of invalid argument to `max' we now say invalid argument to built-in max There's still a chance for confusion. For instance, before an error might have been `sadly' not exported by package X and now it would be name sadly not exported by package X but adverbs (such as "sadly") seem unlikely names in programs. This change touches a lot of files but only affects error messages. Fixes #67685. Change-Id: I95435b388f92cade316e2844d59ecf6953b178bc Reviewed-on: https://go-review.googlesource.com/c/go/+/589118 Auto-Submit: Robert Griesemer <gri@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@google.com>
This commit is contained in:
parent
f1039180bd
commit
cc95d85fe4
@ -268,7 +268,7 @@ func (p *parser) syntaxErrorAt(pos Pos, msg string) {
|
||||
var tok string
|
||||
switch p.tok {
|
||||
case _Name:
|
||||
tok = "`" + p.lit + "'"
|
||||
tok = "name " + p.lit
|
||||
case _Semi:
|
||||
tok = p.lit
|
||||
case _Literal:
|
||||
|
@ -6,4 +6,4 @@
|
||||
// Line 9 must end in EOF for this test (no newline).
|
||||
|
||||
package e
|
||||
func([<-chan<-[func /* ERROR unexpected `u' */ u){go
|
||||
func([<-chan<-[func /* ERROR unexpected name u */ u){go
|
@ -7,7 +7,7 @@ package p
|
||||
func _() {
|
||||
_ = m[] // ERROR expected operand
|
||||
_ = m[x,]
|
||||
_ = m[x /* ERROR unexpected `a' */ a b c d]
|
||||
_ = m[x /* ERROR unexpected name a */ a b c d]
|
||||
}
|
||||
|
||||
// test case from the issue
|
||||
|
@ -7,7 +7,7 @@ package p
|
||||
// test case from issue
|
||||
|
||||
type _ interface{
|
||||
m /* ERROR unexpected `int' in interface type; possibly missing semicolon or newline or } */ int
|
||||
m /* ERROR unexpected name int in interface type; possibly missing semicolon or newline or } */ int
|
||||
}
|
||||
|
||||
// other cases where the fix for this issue affects the error message
|
||||
@ -16,12 +16,12 @@ const (
|
||||
x int = 10 /* ERROR unexpected literal "foo" in grouped declaration; possibly missing semicolon or newline or \) */ "foo"
|
||||
)
|
||||
|
||||
var _ = []int{1, 2, 3 /* ERROR unexpected `int' in composite literal; possibly missing comma or } */ int }
|
||||
var _ = []int{1, 2, 3 /* ERROR unexpected name int in composite literal; possibly missing comma or } */ int }
|
||||
|
||||
type _ struct {
|
||||
x y /* ERROR syntax error: unexpected comma in struct type; possibly missing semicolon or newline or } */ ,
|
||||
}
|
||||
|
||||
func f(a, b c /* ERROR unexpected `d' in parameter list; possibly missing comma or \) */ d) {
|
||||
f(a, b, c /* ERROR unexpected `d' in argument list; possibly missing comma or \) */ d)
|
||||
func f(a, b c /* ERROR unexpected name d in parameter list; possibly missing comma or \) */ d) {
|
||||
f(a, b, c /* ERROR unexpected name d in argument list; possibly missing comma or \) */ d)
|
||||
}
|
||||
|
@ -13,5 +13,5 @@ type _ interface {
|
||||
(int) | (string)
|
||||
(int) | ~(string)
|
||||
(/* ERROR unexpected ~ */ ~int)
|
||||
(int /* ERROR unexpected \| */ | /* ERROR unexpected `string' */ string /* ERROR unexpected \) */ )
|
||||
(int /* ERROR unexpected \| */ | /* ERROR unexpected name string */ string /* ERROR unexpected \) */ )
|
||||
}
|
||||
|
@ -9,6 +9,6 @@ import (
|
||||
)
|
||||
|
||||
func f() {
|
||||
int status // ERROR syntax error: unexpected `status' at end of statement
|
||||
int status // ERROR syntax error: unexpected name status at end of statement
|
||||
fmt.Println(status)
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) (
|
||||
if hasDots(call) && id != _Append {
|
||||
check.errorf(dddErrPos(call),
|
||||
InvalidDotDotDot,
|
||||
invalidOp+"invalid use of ... with built-in %s", quote(bin.name))
|
||||
invalidOp+"invalid use of ... with built-in %s", bin.name)
|
||||
check.use(argList...)
|
||||
return
|
||||
}
|
||||
@ -210,7 +210,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) (
|
||||
if id == _Len {
|
||||
code = InvalidLen
|
||||
}
|
||||
check.errorf(x, code, invalidArg+"%s for %s", x, quote(bin.name))
|
||||
check.errorf(x, code, invalidArg+"%s for built-in %s", x, bin.name)
|
||||
}
|
||||
return
|
||||
}
|
||||
@ -533,7 +533,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) (
|
||||
case _Max, _Min:
|
||||
// max(x, ...)
|
||||
// min(x, ...)
|
||||
check.verifyVersionf(call.Fun, go1_21, "%s", quote(bin.name))
|
||||
check.verifyVersionf(call.Fun, go1_21, "built-in %s", bin.name)
|
||||
|
||||
op := token.LSS
|
||||
if id == _Max {
|
||||
@ -576,7 +576,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) (
|
||||
if x.mode != constant_ {
|
||||
x.mode = value
|
||||
// A value must not be untyped.
|
||||
check.assignment(x, &emptyInterface, "argument to "+quote(bin.name))
|
||||
check.assignment(x, &emptyInterface, "argument to built-in "+bin.name)
|
||||
if x.mode == invalid {
|
||||
return
|
||||
}
|
||||
@ -641,7 +641,7 @@ func (check *Checker) builtin(x *operand, call *syntax.CallExpr, id builtinId) (
|
||||
if nargs > 0 {
|
||||
params = make([]Type, nargs)
|
||||
for i, a := range args {
|
||||
check.assignment(a, nil, "argument to "+quote(predeclaredFuncs[id].name))
|
||||
check.assignment(a, nil, "argument to built-in"+predeclaredFuncs[id].name)
|
||||
if a.mode == invalid {
|
||||
return
|
||||
}
|
||||
@ -992,7 +992,7 @@ func (check *Checker) applyTypeFunc(f func(Type) Type, x *operand, id builtinId)
|
||||
default:
|
||||
panic("unreachable")
|
||||
}
|
||||
check.softErrorf(x, code, "%s not supported as argument to %s for go1.18 (see go.dev/issue/50937)", x, quote(predeclaredFuncs[id].name))
|
||||
check.softErrorf(x, code, "%s not supported as argument to built-in %s for go1.18 (see go.dev/issue/50937)", x, predeclaredFuncs[id].name)
|
||||
|
||||
// Construct a suitable new type parameter for the result type.
|
||||
// The type parameter is placed in the current package so export/import
|
||||
|
@ -719,7 +719,7 @@ func (check *Checker) selector(x *operand, e *syntax.SelectorExpr, def *TypeName
|
||||
goto Error
|
||||
}
|
||||
if !exp.Exported() {
|
||||
check.errorf(e.Sel, UnexportedName, "%s not exported by package %s", quote(sel), quote(pkg.name))
|
||||
check.errorf(e.Sel, UnexportedName, "name %s not exported by package %s", sel, pkg.name)
|
||||
// ok to continue
|
||||
}
|
||||
}
|
||||
|
@ -310,7 +310,7 @@ func (check *Checker) initFiles(files []*syntax.File) {
|
||||
check.files = append(check.files, file)
|
||||
|
||||
default:
|
||||
check.errorf(file, MismatchedPkgName, "package %s; expected %s", quote(name), quote(pkg.name))
|
||||
check.errorf(file, MismatchedPkgName, "package %s; expected package %s", name, pkg.name)
|
||||
// ignore this file
|
||||
}
|
||||
}
|
||||
|
@ -743,7 +743,7 @@ func (check *Checker) checkFieldUniqueness(base *Named) {
|
||||
// For historical consistency, we report the primary error on the
|
||||
// method, and the alt decl on the field.
|
||||
err := check.newError(DuplicateFieldAndMethod)
|
||||
err.addf(alt, "field and method with the same name %s", quote(fld.name))
|
||||
err.addf(alt, "field and method with the same name %s", fld.name)
|
||||
err.addAltDecl(fld)
|
||||
err.report()
|
||||
}
|
||||
|
@ -14,39 +14,6 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// quote encloses s in `' quotes, as in `foo', except for _,
|
||||
// which is left alone.
|
||||
//
|
||||
// Use to prevent confusion when user supplied names alter the
|
||||
// meaning of an error message.
|
||||
//
|
||||
// For instance, report
|
||||
//
|
||||
// duplicate method `wanted'
|
||||
//
|
||||
// rather than
|
||||
//
|
||||
// duplicate method wanted
|
||||
//
|
||||
// Exceptions:
|
||||
//
|
||||
// - don't quote _:
|
||||
// `_' is ugly and not necessary
|
||||
// - don't quote after a ":" as there's no need for it:
|
||||
// undefined name: foo
|
||||
// - don't quote if the name is used correctly in a statement:
|
||||
// goto L jumps over variable declaration
|
||||
//
|
||||
// quote encloses s in `' quotes, as in `foo',
|
||||
// except for _ which is left alone.
|
||||
func quote(s string) string {
|
||||
if s == "_" {
|
||||
// `_' is ugly and not necessary
|
||||
return s
|
||||
}
|
||||
return "`" + s + "'"
|
||||
}
|
||||
|
||||
func sprintf(qf Qualifier, tpSubscripts bool, format string, args ...any) string {
|
||||
for i, arg := range args {
|
||||
switch a := arg.(type) {
|
||||
|
@ -258,11 +258,11 @@ func TestIssue22525(t *testing.T) {
|
||||
conf := Config{Error: func(err error) { got += err.Error() + "\n" }}
|
||||
typecheck(src, &conf, nil) // do not crash
|
||||
want := "\n" +
|
||||
"p:1:27: `a' declared and not used\n" +
|
||||
"p:1:30: `b' declared and not used\n" +
|
||||
"p:1:33: `c' declared and not used\n" +
|
||||
"p:1:36: `d' declared and not used\n" +
|
||||
"p:1:39: `e' declared and not used\n"
|
||||
"p:1:27: declared and not used: a\n" +
|
||||
"p:1:30: declared and not used: b\n" +
|
||||
"p:1:33: declared and not used: c\n" +
|
||||
"p:1:36: declared and not used: d\n" +
|
||||
"p:1:39: declared and not used: e\n"
|
||||
if got != want {
|
||||
t.Errorf("got: %swant: %s", got, want)
|
||||
}
|
||||
|
@ -26,13 +26,11 @@ func (check *Checker) labels(body *syntax.BlockStmt) {
|
||||
name := jmp.Label.Value
|
||||
if alt := all.Lookup(name); alt != nil {
|
||||
msg = "goto %s jumps into block"
|
||||
alt.(*Label).used = true // avoid another error
|
||||
code = JumpIntoBlock
|
||||
// don't quote name here because "goto L" matches the code
|
||||
alt.(*Label).used = true // avoid another error
|
||||
} else {
|
||||
msg = "label %s not declared"
|
||||
code = UndeclaredLabel
|
||||
name = quote(name)
|
||||
}
|
||||
check.errorf(jmp.Label, code, msg, name)
|
||||
}
|
||||
@ -41,7 +39,7 @@ func (check *Checker) labels(body *syntax.BlockStmt) {
|
||||
for name, obj := range all.elems {
|
||||
obj = resolve(name, obj)
|
||||
if lbl := obj.(*Label); !lbl.used {
|
||||
check.softErrorf(lbl.pos, UnusedLabel, "label %s declared and not used", quote(lbl.name))
|
||||
check.softErrorf(lbl.pos, UnusedLabel, "label %s declared and not used", lbl.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -137,7 +135,7 @@ func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *syntax.Lab
|
||||
if alt := all.Insert(lbl); alt != nil {
|
||||
err := check.newError(DuplicateLabel)
|
||||
err.soft = true
|
||||
err.addf(lbl.pos, "label %s already declared", quote(name))
|
||||
err.addf(lbl.pos, "label %s already declared", name)
|
||||
err.addAltDecl(alt)
|
||||
err.report()
|
||||
// ok to continue
|
||||
@ -193,7 +191,7 @@ func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *syntax.Lab
|
||||
}
|
||||
}
|
||||
if !valid {
|
||||
check.errorf(s.Label, MisplacedLabel, "invalid break label %s", quote(name))
|
||||
check.errorf(s.Label, MisplacedLabel, "invalid break label %s", name)
|
||||
return
|
||||
}
|
||||
|
||||
@ -208,7 +206,7 @@ func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *syntax.Lab
|
||||
}
|
||||
}
|
||||
if !valid {
|
||||
check.errorf(s.Label, MisplacedLabel, "invalid continue label %s", quote(name))
|
||||
check.errorf(s.Label, MisplacedLabel, "invalid continue label %s", name)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -64,7 +64,7 @@ func (check *Checker) usage(scope *Scope) {
|
||||
return cmpPos(unused[i].pos, unused[j].pos) < 0
|
||||
})
|
||||
for _, v := range unused {
|
||||
check.softErrorf(v.pos, UnusedVar, "%s declared and not used", quote(v.name))
|
||||
check.softErrorf(v.pos, UnusedVar, "declared and not used: %s", v.name)
|
||||
}
|
||||
|
||||
for _, scope := range scope.children {
|
||||
@ -496,7 +496,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 {
|
||||
err := check.newError(OutOfScopeResult)
|
||||
err.addf(s, "result parameter %s not in scope at return", quote(obj.name))
|
||||
err.addf(s, "result parameter %s not in scope at return", obj.name)
|
||||
err.addf(alt, "inner declaration of %s", obj)
|
||||
err.report()
|
||||
// ok to continue
|
||||
|
@ -226,8 +226,8 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_
|
||||
case explicit:
|
||||
if check != nil {
|
||||
err := check.newError(DuplicateDecl)
|
||||
err.addf(atPos(pos), "duplicate method %s", quote(m.name))
|
||||
err.addf(atPos(mpos[other.(*Func)]), "other declaration of %s", quote(m.name))
|
||||
err.addf(atPos(pos), "duplicate method %s", m.name)
|
||||
err.addf(atPos(mpos[other.(*Func)]), "other declaration of method %s", m.name)
|
||||
err.report()
|
||||
}
|
||||
default:
|
||||
@ -240,8 +240,8 @@ func computeInterfaceTypeSet(check *Checker, pos syntax.Pos, ityp *Interface) *_
|
||||
check.later(func() {
|
||||
if pos.IsKnown() && !check.allowVersion(atPos(pos), go1_14) || !Identical(m.typ, other.Type()) {
|
||||
err := check.newError(DuplicateDecl)
|
||||
err.addf(atPos(pos), "duplicate method %s", quote(m.name))
|
||||
err.addf(atPos(mpos[other.(*Func)]), "other declaration of %s", quote(m.name))
|
||||
err.addf(atPos(pos), "duplicate method %s", m.name)
|
||||
err.addf(atPos(mpos[other.(*Func)]), "other declaration of method %s", m.name)
|
||||
err.report()
|
||||
}
|
||||
}).describef(atPos(pos), "duplicate method check for %s", m.name)
|
||||
|
@ -95,7 +95,7 @@ func (check *Checker) ident(x *operand, e *syntax.Name, def *TypeName, wantType
|
||||
|
||||
switch obj := obj.(type) {
|
||||
case *PkgName:
|
||||
check.errorf(e, InvalidPkgUse, "use of package %s not in selector", quote(obj.name))
|
||||
check.errorf(e, InvalidPkgUse, "use of package %s not in selector", obj.name)
|
||||
return
|
||||
|
||||
case *Const:
|
||||
@ -117,7 +117,7 @@ func (check *Checker) ident(x *operand, e *syntax.Name, def *TypeName, wantType
|
||||
|
||||
case *TypeName:
|
||||
if !check.conf.EnableAlias && check.isBrokenAlias(obj) {
|
||||
check.errorf(e, InvalidDeclCycle, "invalid use of type alias %s in recursive type (see go.dev/issue/50729)", quote(obj.name))
|
||||
check.errorf(e, InvalidDeclCycle, "invalid use of type alias %s in recursive type (see go.dev/issue/50729)", obj.name)
|
||||
return
|
||||
}
|
||||
x.mode = typexpr
|
||||
|
@ -28,7 +28,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b
|
||||
if hasDots(call) && id != _Append {
|
||||
check.errorf(dddErrPos(call),
|
||||
InvalidDotDotDot,
|
||||
invalidOp+"invalid use of ... with built-in %s", quote(bin.name))
|
||||
invalidOp+"invalid use of ... with built-in %s", bin.name)
|
||||
check.use(argList...)
|
||||
return
|
||||
}
|
||||
@ -213,7 +213,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b
|
||||
if id == _Len {
|
||||
code = InvalidLen
|
||||
}
|
||||
check.errorf(x, code, invalidArg+"%s for %s", x, quote(bin.name))
|
||||
check.errorf(x, code, invalidArg+"%s for built-in %s", x, bin.name)
|
||||
}
|
||||
return
|
||||
}
|
||||
@ -536,7 +536,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b
|
||||
case _Max, _Min:
|
||||
// max(x, ...)
|
||||
// min(x, ...)
|
||||
check.verifyVersionf(call.Fun, go1_21, "%s", quote(bin.name))
|
||||
check.verifyVersionf(call.Fun, go1_21, "built-in %s", bin.name)
|
||||
|
||||
op := token.LSS
|
||||
if id == _Max {
|
||||
@ -579,7 +579,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b
|
||||
if x.mode != constant_ {
|
||||
x.mode = value
|
||||
// A value must not be untyped.
|
||||
check.assignment(x, &emptyInterface, "argument to "+quote(bin.name))
|
||||
check.assignment(x, &emptyInterface, "argument to built-in "+bin.name)
|
||||
if x.mode == invalid {
|
||||
return
|
||||
}
|
||||
@ -644,7 +644,7 @@ func (check *Checker) builtin(x *operand, call *ast.CallExpr, id builtinId) (_ b
|
||||
if nargs > 0 {
|
||||
params = make([]Type, nargs)
|
||||
for i, a := range args {
|
||||
check.assignment(a, nil, "argument to "+quote(predeclaredFuncs[id].name))
|
||||
check.assignment(a, nil, "argument to built-in"+predeclaredFuncs[id].name)
|
||||
if a.mode == invalid {
|
||||
return
|
||||
}
|
||||
@ -995,7 +995,7 @@ func (check *Checker) applyTypeFunc(f func(Type) Type, x *operand, id builtinId)
|
||||
default:
|
||||
panic("unreachable")
|
||||
}
|
||||
check.softErrorf(x, code, "%s not supported as argument to %s for go1.18 (see go.dev/issue/50937)", x, quote(predeclaredFuncs[id].name))
|
||||
check.softErrorf(x, code, "%s not supported as argument to built-in %s for go1.18 (see go.dev/issue/50937)", x, predeclaredFuncs[id].name)
|
||||
|
||||
// Construct a suitable new type parameter for the result type.
|
||||
// The type parameter is placed in the current package so export/import
|
||||
|
@ -722,7 +722,7 @@ func (check *Checker) selector(x *operand, e *ast.SelectorExpr, def *TypeName, w
|
||||
goto Error
|
||||
}
|
||||
if !exp.Exported() {
|
||||
check.errorf(e.Sel, UnexportedName, "%s not exported by package %s", quote(sel), quote(pkg.name))
|
||||
check.errorf(e.Sel, UnexportedName, "name %s not exported by package %s", sel, pkg.name)
|
||||
// ok to continue
|
||||
}
|
||||
}
|
||||
|
@ -332,7 +332,7 @@ func (check *Checker) initFiles(files []*ast.File) {
|
||||
check.files = append(check.files, file)
|
||||
|
||||
default:
|
||||
check.errorf(atPos(file.Package), MismatchedPkgName, "package %s; expected %s", quote(name), quote(pkg.name))
|
||||
check.errorf(atPos(file.Package), MismatchedPkgName, "package %s; expected package %s", name, pkg.name)
|
||||
// ignore this file
|
||||
}
|
||||
}
|
||||
|
@ -842,7 +842,7 @@ func (check *Checker) checkFieldUniqueness(base *Named) {
|
||||
// For historical consistency, we report the primary error on the
|
||||
// method, and the alt decl on the field.
|
||||
err := check.newError(DuplicateFieldAndMethod)
|
||||
err.addf(alt, "field and method with the same name %s", quote(fld.name))
|
||||
err.addf(alt, "field and method with the same name %s", fld.name)
|
||||
err.addAltDecl(fld)
|
||||
err.report()
|
||||
}
|
||||
|
@ -15,39 +15,6 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// quote encloses s in `' quotes, as in `foo', except for _,
|
||||
// which is left alone.
|
||||
//
|
||||
// Use to prevent confusion when user supplied names alter the
|
||||
// meaning of an error message.
|
||||
//
|
||||
// For instance, report
|
||||
//
|
||||
// duplicate method `wanted'
|
||||
//
|
||||
// rather than
|
||||
//
|
||||
// duplicate method wanted
|
||||
//
|
||||
// Exceptions:
|
||||
//
|
||||
// - don't quote _:
|
||||
// `_' is ugly and not necessary
|
||||
// - don't quote after a ":" as there's no need for it:
|
||||
// undefined name: foo
|
||||
// - don't quote if the name is used correctly in a statement:
|
||||
// goto L jumps over variable declaration
|
||||
//
|
||||
// quote encloses s in `' quotes, as in `foo',
|
||||
// except for _ which is left alone.
|
||||
func quote(s string) string {
|
||||
if s == "_" {
|
||||
// `_' is ugly and not necessary
|
||||
return s
|
||||
}
|
||||
return "`" + s + "'"
|
||||
}
|
||||
|
||||
func sprintf(fset *token.FileSet, qf Qualifier, tpSubscripts bool, format string, args ...any) string {
|
||||
for i, arg := range args {
|
||||
switch a := arg.(type) {
|
||||
|
@ -266,11 +266,11 @@ func TestIssue22525(t *testing.T) {
|
||||
conf := Config{Error: func(err error) { got += err.Error() + "\n" }}
|
||||
typecheck(src, &conf, nil) // do not crash
|
||||
want := "\n" +
|
||||
"p:1:27: `a' declared and not used\n" +
|
||||
"p:1:30: `b' declared and not used\n" +
|
||||
"p:1:33: `c' declared and not used\n" +
|
||||
"p:1:36: `d' declared and not used\n" +
|
||||
"p:1:39: `e' declared and not used\n"
|
||||
"p:1:27: declared and not used: a\n" +
|
||||
"p:1:30: declared and not used: b\n" +
|
||||
"p:1:33: declared and not used: c\n" +
|
||||
"p:1:36: declared and not used: d\n" +
|
||||
"p:1:39: declared and not used: e\n"
|
||||
if got != want {
|
||||
t.Errorf("got: %swant: %s", got, want)
|
||||
}
|
||||
|
@ -27,13 +27,11 @@ func (check *Checker) labels(body *ast.BlockStmt) {
|
||||
name := jmp.Label.Name
|
||||
if alt := all.Lookup(name); alt != nil {
|
||||
msg = "goto %s jumps into block"
|
||||
alt.(*Label).used = true // avoid another error
|
||||
code = JumpIntoBlock
|
||||
// don't quote name here because "goto L" matches the code
|
||||
alt.(*Label).used = true // avoid another error
|
||||
} else {
|
||||
msg = "label %s not declared"
|
||||
code = UndeclaredLabel
|
||||
name = quote(name)
|
||||
}
|
||||
check.errorf(jmp.Label, code, msg, name)
|
||||
}
|
||||
@ -42,7 +40,7 @@ func (check *Checker) labels(body *ast.BlockStmt) {
|
||||
for name, obj := range all.elems {
|
||||
obj = resolve(name, obj)
|
||||
if lbl := obj.(*Label); !lbl.used {
|
||||
check.softErrorf(lbl, UnusedLabel, "label %s declared and not used", quote(lbl.name))
|
||||
check.softErrorf(lbl, UnusedLabel, "label %s declared and not used", lbl.name)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -142,7 +140,7 @@ func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *ast.Labele
|
||||
if alt := all.Insert(lbl); alt != nil {
|
||||
err := check.newError(DuplicateLabel)
|
||||
err.soft = true
|
||||
err.addf(lbl, "label %s already declared", quote(name))
|
||||
err.addf(lbl, "label %s already declared", name)
|
||||
err.addAltDecl(alt)
|
||||
err.report()
|
||||
// ok to continue
|
||||
@ -198,7 +196,7 @@ func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *ast.Labele
|
||||
}
|
||||
}
|
||||
if !valid {
|
||||
check.errorf(s.Label, MisplacedLabel, "invalid break label %s", quote(name))
|
||||
check.errorf(s.Label, MisplacedLabel, "invalid break label %s", name)
|
||||
return
|
||||
}
|
||||
|
||||
@ -213,7 +211,7 @@ func (check *Checker) blockBranches(all *Scope, parent *block, lstmt *ast.Labele
|
||||
}
|
||||
}
|
||||
if !valid {
|
||||
check.errorf(s.Label, MisplacedLabel, "invalid continue label %s", quote(name))
|
||||
check.errorf(s.Label, MisplacedLabel, "invalid continue label %s", name)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ func (check *Checker) usage(scope *Scope) {
|
||||
return cmpPos(unused[i].pos, unused[j].pos) < 0
|
||||
})
|
||||
for _, v := range unused {
|
||||
check.softErrorf(v, UnusedVar, "%s declared and not used", quote(v.name))
|
||||
check.softErrorf(v, UnusedVar, "declared and not used: %s", v.name)
|
||||
}
|
||||
|
||||
for _, scope := range scope.children {
|
||||
@ -515,7 +515,7 @@ func (check *Checker) stmt(ctxt stmtContext, s ast.Stmt) {
|
||||
for _, obj := range res.vars {
|
||||
if alt := check.lookup(obj.name); alt != nil && alt != obj {
|
||||
err := check.newError(OutOfScopeResult)
|
||||
err.addf(s, "result parameter %s not in scope at return", quote(obj.name))
|
||||
err.addf(s, "result parameter %s not in scope at return", obj.name)
|
||||
err.addf(alt, "inner declaration of %s", obj)
|
||||
err.report()
|
||||
// ok to continue
|
||||
|
@ -229,8 +229,8 @@ func computeInterfaceTypeSet(check *Checker, pos token.Pos, ityp *Interface) *_T
|
||||
case explicit:
|
||||
if check != nil {
|
||||
err := check.newError(DuplicateDecl)
|
||||
err.addf(atPos(pos), "duplicate method %s", quote(m.name))
|
||||
err.addf(atPos(mpos[other.(*Func)]), "other declaration of %s", quote(m.name))
|
||||
err.addf(atPos(pos), "duplicate method %s", m.name)
|
||||
err.addf(atPos(mpos[other.(*Func)]), "other declaration of method %s", m.name)
|
||||
err.report()
|
||||
}
|
||||
default:
|
||||
@ -243,8 +243,8 @@ func computeInterfaceTypeSet(check *Checker, pos token.Pos, ityp *Interface) *_T
|
||||
check.later(func() {
|
||||
if pos.IsValid() && !check.allowVersion(atPos(pos), go1_14) || !Identical(m.typ, other.Type()) {
|
||||
err := check.newError(DuplicateDecl)
|
||||
err.addf(atPos(pos), "duplicate method %s", quote(m.name))
|
||||
err.addf(atPos(mpos[other.(*Func)]), "other declaration of %s", quote(m.name))
|
||||
err.addf(atPos(pos), "duplicate method %s", m.name)
|
||||
err.addf(atPos(mpos[other.(*Func)]), "other declaration of method %s", m.name)
|
||||
err.report()
|
||||
}
|
||||
}).describef(atPos(pos), "duplicate method check for %s", m.name)
|
||||
|
@ -95,7 +95,7 @@ func (check *Checker) ident(x *operand, e *ast.Ident, def *TypeName, wantType bo
|
||||
|
||||
switch obj := obj.(type) {
|
||||
case *PkgName:
|
||||
check.errorf(e, InvalidPkgUse, "use of package %s not in selector", quote(obj.name))
|
||||
check.errorf(e, InvalidPkgUse, "use of package %s not in selector", obj.name)
|
||||
return
|
||||
|
||||
case *Const:
|
||||
@ -117,7 +117,7 @@ func (check *Checker) ident(x *operand, e *ast.Ident, def *TypeName, wantType bo
|
||||
|
||||
case *TypeName:
|
||||
if !check.conf._EnableAlias && check.isBrokenAlias(obj) {
|
||||
check.errorf(e, InvalidDeclCycle, "invalid use of type alias %s in recursive type (see go.dev/issue/50729)", quote(obj.name))
|
||||
check.errorf(e, InvalidDeclCycle, "invalid use of type alias %s in recursive type (see go.dev/issue/50729)", obj.name)
|
||||
return
|
||||
}
|
||||
x.mode = typexpr
|
||||
|
@ -100,10 +100,10 @@ func cap1() {
|
||||
|
||||
var s [][]byte
|
||||
_ = cap(s)
|
||||
_ = cap(s... /* ERROR "invalid use of ... with built-in `cap'" */ )
|
||||
_ = cap(s... /* ERROR "invalid use of ... with built-in cap" */ )
|
||||
|
||||
var x int
|
||||
_ = cap(x /* ERROR "invalid argument: x (variable of type int) for `cap'" */ )
|
||||
_ = cap(x /* ERROR "invalid argument: x (variable of type int) for built-in cap" */ )
|
||||
}
|
||||
|
||||
func cap2() {
|
||||
|
2
src/internal/types/testdata/check/decls0.go
vendored
2
src/internal/types/testdata/check/decls0.go
vendored
@ -137,7 +137,7 @@ type (
|
||||
}
|
||||
I3 interface {
|
||||
m1()
|
||||
m1 /* ERROR "duplicate method `m1'" */ ()
|
||||
m1 /* ERROR "duplicate method m1" */ ()
|
||||
}
|
||||
I4 interface {
|
||||
m1(x, y, x /* ERROR "redeclared" */ float32)
|
||||
|
@ -16,7 +16,7 @@ type T1 struct{
|
||||
|
||||
func (T1) m() {}
|
||||
func (T1) m /* ERROR "already declared" */ () {}
|
||||
func (x *T1) f /* ERROR "field and method with the same name `f'" */ () {}
|
||||
func (x *T1) f /* ERROR "field and method with the same name f" */ () {}
|
||||
|
||||
// Conflict between embedded field and method name,
|
||||
// with the embedded field being a basic type.
|
||||
@ -30,7 +30,7 @@ type T1c struct {
|
||||
time.Time
|
||||
}
|
||||
|
||||
func (T1c) Time /* ERROR "field and method with the same name `Time'" */ () int { return 0 }
|
||||
func (T1c) Time /* ERROR "field and method with the same name Time" */ () int { return 0 }
|
||||
|
||||
// Disabled for now: LookupFieldOrMethod will find Pointer even though
|
||||
// it's double-declared (it would cost extra in the common case to verify
|
||||
|
4
src/internal/types/testdata/check/go1_13.go
vendored
4
src/internal/types/testdata/check/go1_13.go
vendored
@ -14,10 +14,10 @@ type I interface { m() }
|
||||
|
||||
type _ interface {
|
||||
m()
|
||||
I // ERROR "duplicate method `m'"
|
||||
I // ERROR "duplicate method m"
|
||||
}
|
||||
|
||||
type _ interface {
|
||||
I
|
||||
I // ERROR "duplicate method `m'"
|
||||
I // ERROR "duplicate method m"
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ import f2 "fmt"
|
||||
|
||||
// reflect.flag must not be visible in this package
|
||||
type flag int
|
||||
type _ reflect.flag /* ERROR "`flag' not exported by package `reflect'" */
|
||||
type _ reflect.flag /* ERROR "name flag not exported by package reflect" */
|
||||
|
||||
// imported package name may conflict with local objects
|
||||
type reflect /* ERROR "reflect already declared" */ int
|
||||
|
56
src/internal/types/testdata/check/labels.go
vendored
56
src/internal/types/testdata/check/labels.go
vendored
@ -10,23 +10,23 @@ package labels
|
||||
var x int
|
||||
|
||||
func f0() {
|
||||
L1 /* ERROR "label `L1' declared and not used" */ :
|
||||
L1 /* ERROR "label L1 declared and not used" */ :
|
||||
for {
|
||||
}
|
||||
L2 /* ERROR "label `L2' declared and not used" */ :
|
||||
L2 /* ERROR "label L2 declared and not used" */ :
|
||||
select {
|
||||
}
|
||||
L3 /* ERROR "label `L3' declared and not used" */ :
|
||||
L3 /* ERROR "label L3 declared and not used" */ :
|
||||
switch {
|
||||
}
|
||||
L4 /* ERROR "label `L4' declared and not used" */ :
|
||||
L4 /* ERROR "label L4 declared and not used" */ :
|
||||
if true {
|
||||
}
|
||||
L5 /* ERROR "label `L5' declared and not used" */ :
|
||||
L5 /* ERROR "label L5 declared and not used" */ :
|
||||
f0()
|
||||
L6:
|
||||
f0()
|
||||
L6 /* ERROR "label `L6' already declared" */ :
|
||||
L6 /* ERROR "label L6 already declared" */ :
|
||||
f0()
|
||||
if x == 20 {
|
||||
goto L6
|
||||
@ -35,7 +35,7 @@ L6 /* ERROR "label `L6' already declared" */ :
|
||||
L7:
|
||||
for {
|
||||
break L7
|
||||
break L8 /* ERROR "invalid break label `L8'" */
|
||||
break L8 /* ERROR "invalid break label L8" */
|
||||
}
|
||||
|
||||
// A label must be directly associated with a switch, select, or
|
||||
@ -43,8 +43,8 @@ L7:
|
||||
|
||||
L7a /* ERROR "declared and not used" */ : L7b:
|
||||
for {
|
||||
break L7a /* ERROR "invalid break label `L7a'" */
|
||||
continue L7a /* ERROR "invalid continue label `L7a'" */
|
||||
break L7a /* ERROR "invalid break label L7a" */
|
||||
continue L7a /* ERROR "invalid continue label L7a" */
|
||||
continue L7b
|
||||
}
|
||||
|
||||
@ -52,7 +52,7 @@ L8:
|
||||
for {
|
||||
if x == 21 {
|
||||
continue L8
|
||||
continue L7 /* ERROR "invalid continue label `L7'" */
|
||||
continue L7 /* ERROR "invalid continue label L7" */
|
||||
}
|
||||
}
|
||||
|
||||
@ -60,23 +60,23 @@ L9:
|
||||
switch {
|
||||
case true:
|
||||
break L9
|
||||
defalt /* ERROR "label `defalt' declared and not used" */ :
|
||||
defalt /* ERROR "label defalt declared and not used" */ :
|
||||
}
|
||||
|
||||
L10:
|
||||
select {
|
||||
default:
|
||||
break L10
|
||||
break L9 /* ERROR "invalid break label `L9'" */
|
||||
break L9 /* ERROR "invalid break label L9" */
|
||||
}
|
||||
|
||||
goto L10a
|
||||
L10a: L10b:
|
||||
select {
|
||||
default:
|
||||
break L10a /* ERROR "invalid break label `L10a'" */
|
||||
break L10a /* ERROR "invalid break label L10a" */
|
||||
break L10b
|
||||
continue L10b /* ERROR "invalid continue label `L10b'" */
|
||||
continue L10b /* ERROR "invalid continue label L10b" */
|
||||
}
|
||||
}
|
||||
|
||||
@ -99,7 +99,7 @@ L2:
|
||||
break L2
|
||||
}
|
||||
if x == 1 {
|
||||
continue L2 /* ERROR "invalid continue label `L2'" */
|
||||
continue L2 /* ERROR "invalid continue label L2" */
|
||||
}
|
||||
goto L2
|
||||
}
|
||||
@ -111,7 +111,7 @@ L3:
|
||||
break L3
|
||||
}
|
||||
if x == 12 {
|
||||
continue L3 /* ERROR "invalid continue label `L3'" */
|
||||
continue L3 /* ERROR "invalid continue label L3" */
|
||||
}
|
||||
goto L3
|
||||
}
|
||||
@ -119,10 +119,10 @@ L3:
|
||||
L4:
|
||||
if true {
|
||||
if x == 13 {
|
||||
break L4 /* ERROR "invalid break label `L4'" */
|
||||
break L4 /* ERROR "invalid break label L4" */
|
||||
}
|
||||
if x == 14 {
|
||||
continue L4 /* ERROR "invalid continue label `L4'" */
|
||||
continue L4 /* ERROR "invalid continue label L4" */
|
||||
}
|
||||
if x == 15 {
|
||||
goto L4
|
||||
@ -132,10 +132,10 @@ L4:
|
||||
L5:
|
||||
f1()
|
||||
if x == 16 {
|
||||
break L5 /* ERROR "invalid break label `L5'" */
|
||||
break L5 /* ERROR "invalid break label L5" */
|
||||
}
|
||||
if x == 17 {
|
||||
continue L5 /* ERROR "invalid continue label `L5'" */
|
||||
continue L5 /* ERROR "invalid continue label L5" */
|
||||
}
|
||||
if x == 18 {
|
||||
goto L5
|
||||
@ -143,10 +143,10 @@ L5:
|
||||
|
||||
for {
|
||||
if x == 19 {
|
||||
break L1 /* ERROR "invalid break label `L1'" */
|
||||
break L1 /* ERROR "invalid break label L1" */
|
||||
}
|
||||
if x == 20 {
|
||||
continue L1 /* ERROR "invalid continue label `L1'" */
|
||||
continue L1 /* ERROR "invalid continue label L1" */
|
||||
}
|
||||
if x == 21 {
|
||||
goto L1
|
||||
@ -157,10 +157,10 @@ L5:
|
||||
// Additional tests not in the original files.
|
||||
|
||||
func f2() {
|
||||
L1 /* ERROR "label `L1' declared and not used" */ :
|
||||
L1 /* ERROR "label L1 declared and not used" */ :
|
||||
if x == 0 {
|
||||
for {
|
||||
continue L1 /* ERROR "invalid continue label `L1'" */
|
||||
continue L1 /* ERROR "invalid continue label L1" */
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -170,11 +170,11 @@ L1:
|
||||
L2:
|
||||
L3:
|
||||
for {
|
||||
break L1 /* ERROR "invalid break label `L1'" */
|
||||
break L2 /* ERROR "invalid break label `L2'" */
|
||||
break L1 /* ERROR "invalid break label L1" */
|
||||
break L2 /* ERROR "invalid break label L2" */
|
||||
break L3
|
||||
continue L1 /* ERROR "invalid continue label `L1'" */
|
||||
continue L2 /* ERROR "invalid continue label `L2'" */
|
||||
continue L1 /* ERROR "invalid continue label L1" */
|
||||
continue L2 /* ERROR "invalid continue label L2" */
|
||||
continue L3
|
||||
goto L1
|
||||
goto L2
|
||||
|
4
src/internal/types/testdata/check/stmt0.go
vendored
4
src/internal/types/testdata/check/stmt0.go
vendored
@ -222,7 +222,7 @@ func selects() {
|
||||
ch2 := make(chan int)
|
||||
select {
|
||||
case <-ch1:
|
||||
var ch2 /* ERROR "`ch2' declared and not used" */ chan bool
|
||||
var ch2 /* ERROR "declared and not used: ch2" */ chan bool
|
||||
case i := <-ch2:
|
||||
print(i + 1)
|
||||
}
|
||||
@ -394,7 +394,7 @@ func returns2() (a, b int) {
|
||||
{
|
||||
type a int
|
||||
return 1, 2
|
||||
return /* ERROR "`a' not in scope at return" */
|
||||
return /* ERROR "result parameter a not in scope at return" */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,7 @@ type R[S any, P any] struct{}
|
||||
type SR = R[SS, ST]
|
||||
|
||||
type SS interface {
|
||||
NSR(any) *SR // ERROR "invalid use of type alias `SR' in recursive type"
|
||||
NSR(any) *SR // ERROR "invalid use of type alias SR in recursive type"
|
||||
}
|
||||
|
||||
type C interface {
|
||||
|
@ -19,7 +19,7 @@ import "io"
|
||||
|
||||
type _ interface {
|
||||
Reader
|
||||
Reader // ERROR "duplicate method `Read'"
|
||||
Reader // ERROR "duplicate method Read"
|
||||
}
|
||||
|
||||
type Reader interface {
|
||||
@ -28,10 +28,10 @@ type Reader interface {
|
||||
|
||||
type _ interface {
|
||||
io.Reader
|
||||
Reader // ERROR "duplicate method `Read'"
|
||||
Reader // ERROR "duplicate method Read"
|
||||
}
|
||||
|
||||
type _ interface {
|
||||
io.Reader
|
||||
io /* ERROR "duplicate method `Read'" */ .Reader
|
||||
io /* ERROR "duplicate method Read" */ .Reader
|
||||
}
|
||||
|
@ -8,4 +8,4 @@ package a
|
||||
|
||||
import "fmt" // GC_ERROR "imported and not used"
|
||||
|
||||
const n = fmt // ERROR "fmt without selector|unexpected reference to package|use of package `fmt' not in selector"
|
||||
const n = fmt // ERROR "fmt without selector|unexpected reference to package|use of package fmt not in selector"
|
||||
|
@ -10,4 +10,4 @@
|
||||
// there yet, so put it here for now. See also #20800.)
|
||||
|
||||
package e
|
||||
func([<-chan<-[func u){go // ERROR "unexpected `u'"
|
||||
func([<-chan<-[func u){go // ERROR "unexpected name u"
|
@ -45,8 +45,8 @@ func main() {
|
||||
log.Fatalf("expected cmd/compile to fail")
|
||||
}
|
||||
wantErrs := []string{
|
||||
"7:9: `n' declared and not used",
|
||||
"7:12: `err' declared and not used",
|
||||
"7:9: declared and not used: n",
|
||||
"7:12: declared and not used: err",
|
||||
}
|
||||
outStr := string(out)
|
||||
for _, want := range wantErrs {
|
||||
|
@ -9,9 +9,9 @@
|
||||
package p
|
||||
|
||||
func f() {
|
||||
if f() true { // ERROR "unexpected `true', expected {"
|
||||
if f() true { // ERROR "unexpected name true, expected {"
|
||||
}
|
||||
|
||||
switch f() true { // ERROR "unexpected `true', expected {"
|
||||
switch f() true { // ERROR "unexpected name true, expected {"
|
||||
}
|
||||
}
|
||||
|
@ -16,8 +16,8 @@ type T struct {
|
||||
|
||||
type E struct{}
|
||||
|
||||
func (T) b() {} // ERROR "field and method named b|redeclares struct field name|field and method with the same name `b'"
|
||||
func (*T) E() {} // ERROR "field and method named E|redeclares struct field name|field and method with the same name `E'"
|
||||
func (T) b() {} // ERROR "field and method named b|redeclares struct field name|field and method with the same name b"
|
||||
func (*T) E() {} // ERROR "field and method named E|redeclares struct field name|field and method with the same name E"
|
||||
|
||||
func _() {
|
||||
var x T
|
||||
|
@ -10,5 +10,5 @@
|
||||
package main
|
||||
|
||||
func _() {
|
||||
x := 7 // ERROR ".*x.* declared and not used"
|
||||
x := 7 // ERROR "declared and not used"
|
||||
}
|
||||
|
@ -10,5 +10,5 @@ type I interface { M() }
|
||||
|
||||
type _ interface {
|
||||
I
|
||||
I // ERROR "duplicate method `M'"
|
||||
I // ERROR "duplicate method M"
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user