]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile: use "method T.m already declared" for method redeclaration errors
authorRobert Griesemer <gri@golang.org>
Tue, 27 Sep 2022 04:27:20 +0000 (21:27 -0700)
committerRobert Griesemer <gri@google.com>
Tue, 27 Sep 2022 21:59:19 +0000 (21:59 +0000)
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>
src/cmd/compile/internal/types2/decl.go
src/go/types/decl.go
test/alias2.go
test/fixedbugs/bug350.go
test/fixedbugs/issue18655.go
test/method1.go

index f9d1431b82115f1b956b4558eac4207da87b94e1..ebce3ee2e250125826bee6d037fdd30271449db3 100644 (file)
@@ -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
                }
 
index a370c5c64685ff14599717bf084ce88e9d162a12..87d4f3fdf4381fa7bd3866ce94803ab302a76ec9 100644 (file)
@@ -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
                }
 
index 61c7551f79903223e61547a43c9f0f4366b54079..d7101420bdcafd2a054817ec017cecd59b343e94 100644 (file)
@@ -36,9 +36,9 @@ type (
 
 // Methods can be declared on the original named type and the alias.
 func (T0) m1()  {} // GCCGO_ERROR "previous"
-func (*T0) m1() {} // ERROR "method redeclared: T0\.m1|T0\.m1 redeclared in this block|redefinition of .m1."
-func (A0) m1()  {} // ERROR "T0\.m1 redeclared in this block|redefinition of .m1."
-func (A0) m1()  {} // ERROR "T0\.m1 redeclared in this block|redefinition of .m1."
+func (*T0) m1() {} // ERROR "method redeclared: T0\.m1|T0\.m1 already declared|redefinition of .m1."
+func (A0) m1()  {} // ERROR "T0\.m1 already declared|redefinition of .m1."
+func (A0) m1()  {} // ERROR "T0\.m1 already declared|redefinition of .m1."
 func (A0) m2()  {}
 
 // Type aliases and the original type name can be used interchangeably.
index 39f91d43a93e7e764b29a6fa15f581e93ebbd53d..0a8401770274b3498b3d7a19cd1e6c191d90954f 100644 (file)
@@ -9,7 +9,7 @@ package main
 type T int
 
 func (T) m() {} // GCCGO_ERROR "previous"
-func (T) m() {} // ERROR "T[.]m redeclared|redefinition"
+func (T) m() {} // ERROR "T\.m already declared|redefinition"
 
 func (*T) p() {} // GCCGO_ERROR "previous"
-func (*T) p() {} // ERROR "[(][*]T[)][.]p redeclared|redefinition|redeclared"
+func (*T) p() {} // ERROR "T\.p already declared|redefinition"
index 13762f1a94b9e666d1fc66dade33d244d856f2c2..f34e5a9aeba05746ab60e09c70e6560229c5f24f 100644 (file)
@@ -11,12 +11,12 @@ type A = T
 type B = T
 
 func (T) m() {}
-func (T) m() {} // ERROR "redeclared|redefinition"
-func (A) m() {} // ERROR "redeclared|redefinition"
-func (A) m() {} // ERROR "redeclared|redefinition"
-func (B) m() {} // ERROR "redeclared|redefinition"
-func (B) m() {} // ERROR "redeclared|redefinition"
+func (T) m() {} // ERROR "already declared|redefinition"
+func (A) m() {} // ERROR "already declared|redefinition"
+func (A) m() {} // ERROR "already declared|redefinition"
+func (B) m() {} // ERROR "already declared|redefinition"
+func (B) m() {} // ERROR "already declared|redefinition"
 
-func (*T) m() {} // ERROR "redeclared|redefinition"
-func (*A) m() {} // ERROR "redeclared|redefinition"
-func (*B) m() {} // ERROR "redeclared|redefinition"
+func (*T) m() {} // ERROR "already declared|redefinition"
+func (*A) m() {} // ERROR "already declared|redefinition"
+func (*B) m() {} // ERROR "already declared|redefinition"
index bb8c81d7461865d6107f9d1556e8b4d4325b2861..badfa55a7e203f456f83420a6bc9c23435310d8b 100644 (file)
@@ -12,10 +12,10 @@ package main
 type T struct{}
 
 func (t *T) M(int, string)  // GCCGO_ERROR "previous"
-func (t *T) M(int, float64) {} // ERROR "redeclared|redefinition"
+func (t *T) M(int, float64) {} // ERROR "already declared|redefinition"
 
 func (t T) H()  // GCCGO_ERROR "previous"
-func (t *T) H() {} // ERROR "redeclared|redefinition"
+func (t *T) H() {} // ERROR "already declared|redefinition"
 
 func f(int, string)  // GCCGO_ERROR "previous"
 func f(int, float64) {} // ERROR "redeclared|redefinition"