]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types2: better error if there's a field with the name of a missing method
authorRobert Griesemer <gri@golang.org>
Wed, 5 Oct 2022 01:40:38 +0000 (18:40 -0700)
committerGopher Robot <gobot@golang.org>
Wed, 12 Oct 2022 23:03:51 +0000 (23:03 +0000)
Fixes #51025.

Change-Id: I469a705e7da059e7ac0b12b05beb9ed5d3617396
Reviewed-on: https://go-review.googlesource.com/c/go/+/438856
Reviewed-by: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Robert Griesemer <gri@google.com>

src/cmd/compile/internal/types2/lookup.go
src/go/types/lookup.go
src/internal/types/testdata/fixedbugs/issue51025.go [new file with mode: 0644]

index 860535cf490cbaee9370383fc63675e61adb120f..5f767520864a89d2faea7a76f2dbe58801576dca 100644 (file)
@@ -395,6 +395,11 @@ func (check *Checker) missingMethodCause(V, T Type, m, alt *Func) string {
                return "(" + check.interfacePtrError(T) + ")"
        }
 
+       obj, _, _ := lookupFieldOrMethod(V, true /* auto-deref */, m.pkg, m.name, false)
+       if fld, _ := obj.(*Var); fld != nil {
+               return check.sprintf("(%s.%s is a field, not a method)", V, fld.Name())
+       }
+
        return check.sprintf("(missing %s)", mname)
 }
 
index 43fd8d9947a6d200057560752d237e89b580c34c..9e0a06aedb670ea2d735da6b5732b30ed5e9e400 100644 (file)
@@ -395,6 +395,11 @@ func (check *Checker) missingMethodCause(V, T Type, m, alt *Func) string {
                return "(" + check.interfacePtrError(T) + ")"
        }
 
+       obj, _, _ := lookupFieldOrMethod(V, true /* auto-deref */, m.pkg, m.name, false)
+       if fld, _ := obj.(*Var); fld != nil {
+               return check.sprintf("(%s.%s is a field, not a method)", V, fld.Name())
+       }
+
        return check.sprintf("(missing %s)", mname)
 }
 
diff --git a/src/internal/types/testdata/fixedbugs/issue51025.go b/src/internal/types/testdata/fixedbugs/issue51025.go
new file mode 100644 (file)
index 0000000..207b06e
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package p
+
+var _ interface{ m() } = struct /* ERROR m is a field, not a method */ {
+       m func()
+}{}
+
+var _ interface{ m() } = & /* ERROR m is a field, not a method */ struct {
+       m func()
+}{}
+
+var _ interface{ M() } = struct /* ERROR missing method M */ {
+       m func()
+}{}
+
+var _ interface{ M() } = & /* ERROR missing method M */ struct {
+       m func()
+}{}
+
+// test case from issue
+type I interface{ m() }
+type T struct{ m func() }
+type M struct{}
+
+func (M) m() {}
+
+func _() {
+       var t T
+       var m M
+       var i I
+
+       i = m
+       i = t // ERROR m is a field, not a method
+       _ = i
+}