1
0
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:
Robert Griesemer 2024-05-29 14:19:14 -07:00 committed by Gopher Robot
parent f1039180bd
commit cc95d85fe4
42 changed files with 117 additions and 187 deletions

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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)
}

View File

@ -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 \) */ )
}

View File

@ -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)
}

View File

@ -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

View File

@ -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
}
}

View File

@ -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
}
}

View 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()
}

View File

@ -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) {

View File

@ -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)
}

View File

@ -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
}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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
}
}

View File

@ -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
}
}

View 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()
}

View File

@ -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) {

View File

@ -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)
}

View File

@ -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
}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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() {

View File

@ -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)

View File

@ -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

View File

@ -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"
}

View File

@ -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

View File

@ -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

View File

@ -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" */
}
}

View File

@ -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 {

View File

@ -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
}

View File

@ -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"

View File

@ -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"

View File

@ -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 {

View File

@ -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 {"
}
}

View File

@ -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

View File

@ -10,5 +10,5 @@
package main
func _() {
x := 7 // ERROR ".*x.* declared and not used"
x := 7 // ERROR "declared and not used"
}

View File

@ -10,5 +10,5 @@ type I interface { M() }
type _ interface {
I
I // ERROR "duplicate method `M'"
I // ERROR "duplicate method M"
}