diff options
| author | Robert Griesemer <gri@golang.org> | 2022-09-26 21:27:20 -0700 |
|---|---|---|
| committer | Robert Griesemer <gri@google.com> | 2022-09-27 21:59:19 +0000 |
| commit | 7398c3c0c6d66a95d0c29c8fa59322e675ce7c86 (patch) | |
| tree | 550cd4a633b96c4b5ac9f00db0aa6e7e561a6fa8 /src | |
| parent | b16501c08b37235a67e2fc5b506f169152db57ae (diff) | |
| download | go-7398c3c0c6d66a95d0c29c8fa59322e675ce7c86.tar.xz | |
cmd/compile: use "method T.m already declared" for method redeclaration errors
Compromise between old compiler error "T.m redeclared in this block"
(where the "in this block" is not particularly helpful) and the old
type-checker error "method m already declared for type T ...".
In the case where we have position information for the original
declaration, the error message is "method T.m already declared at
<position>". The new message is both shorter and more precise.
For #55326.
Change-Id: Id4a7f326fe631b11db9e8030eccb417c72d6c7db
Reviewed-on: https://go-review.googlesource.com/c/go/+/435016
Run-TryBot: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/types2/decl.go | 10 | ||||
| -rw-r--r-- | src/go/types/decl.go | 7 |
2 files changed, 8 insertions, 9 deletions
diff --git a/src/cmd/compile/internal/types2/decl.go b/src/cmd/compile/internal/types2/decl.go index f9d1431b82..ebce3ee2e2 100644 --- a/src/cmd/compile/internal/types2/decl.go +++ b/src/cmd/compile/internal/types2/decl.go @@ -675,15 +675,11 @@ func (check *Checker) collectMethods(obj *TypeName) { // to it must be unique." assert(m.name != "_") if alt := mset.insert(m); alt != nil { - var err error_ - err.code = _DuplicateMethod - if check.conf.CompilerErrorMessages { - err.errorf(m.pos, "%s.%s redeclared in this block", obj.Name(), m.name) + if alt.Pos().IsKnown() { + check.errorf(m.pos, _DuplicateMethod, "method %s.%s already declared at %s", obj.Name(), m.name, alt.Pos()) } else { - err.errorf(m.pos, "method %s already declared for %s", m.name, obj) + check.errorf(m.pos, _DuplicateMethod, "method %s.%s already declared", obj.Name(), m.name) } - err.recordAltDecl(alt) - check.report(&err) continue } diff --git a/src/go/types/decl.go b/src/go/types/decl.go index a370c5c646..87d4f3fdf4 100644 --- a/src/go/types/decl.go +++ b/src/go/types/decl.go @@ -749,8 +749,11 @@ func (check *Checker) collectMethods(obj *TypeName) { // to it must be unique." assert(m.name != "_") if alt := mset.insert(m); alt != nil { - check.errorf(m, _DuplicateMethod, "method %s already declared for %s", m.name, obj) - check.reportAltDecl(alt) + if alt.Pos().IsValid() { + check.errorf(m, _DuplicateMethod, "method %s.%s already declared at %s", obj.Name(), m.name, alt.Pos()) + } else { + check.errorf(m, _DuplicateMethod, "method %s.%s already declared", obj.Name(), m.name) + } continue } |
