Skip to content

Commit 79d0d33

Browse files
griesemergopherbot
authored andcommitted
go/types, types2: better error if there's a field with the name of a missing method
Fixes #51025. Change-Id: I469a705e7da059e7ac0b12b05beb9ed5d3617396 Reviewed-on: https://go-review.googlesource.com/c/go/+/438856 Reviewed-by: Robert Griesemer <[email protected]> Auto-Submit: Robert Griesemer <[email protected]> Reviewed-by: Robert Findley <[email protected]> TryBot-Result: Gopher Robot <[email protected]> Run-TryBot: Robert Griesemer <[email protected]>
1 parent 19095e1 commit 79d0d33

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed

src/cmd/compile/internal/types2/lookup.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,11 @@ func (check *Checker) missingMethodCause(V, T Type, m, alt *Func) string {
395395
return "(" + check.interfacePtrError(T) + ")"
396396
}
397397

398+
obj, _, _ := lookupFieldOrMethod(V, true /* auto-deref */, m.pkg, m.name, false)
399+
if fld, _ := obj.(*Var); fld != nil {
400+
return check.sprintf("(%s.%s is a field, not a method)", V, fld.Name())
401+
}
402+
398403
return check.sprintf("(missing %s)", mname)
399404
}
400405

src/go/types/lookup.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,11 @@ func (check *Checker) missingMethodCause(V, T Type, m, alt *Func) string {
395395
return "(" + check.interfacePtrError(T) + ")"
396396
}
397397

398+
obj, _, _ := lookupFieldOrMethod(V, true /* auto-deref */, m.pkg, m.name, false)
399+
if fld, _ := obj.(*Var); fld != nil {
400+
return check.sprintf("(%s.%s is a field, not a method)", V, fld.Name())
401+
}
402+
398403
return check.sprintf("(missing %s)", mname)
399404
}
400405

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright 2022 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package p
6+
7+
var _ interface{ m() } = struct /* ERROR m is a field, not a method */ {
8+
m func()
9+
}{}
10+
11+
var _ interface{ m() } = & /* ERROR m is a field, not a method */ struct {
12+
m func()
13+
}{}
14+
15+
var _ interface{ M() } = struct /* ERROR missing method M */ {
16+
m func()
17+
}{}
18+
19+
var _ interface{ M() } = & /* ERROR missing method M */ struct {
20+
m func()
21+
}{}
22+
23+
// test case from issue
24+
type I interface{ m() }
25+
type T struct{ m func() }
26+
type M struct{}
27+
28+
func (M) m() {}
29+
30+
func _() {
31+
var t T
32+
var m M
33+
var i I
34+
35+
i = m
36+
i = t // ERROR m is a field, not a method
37+
_ = i
38+
}

0 commit comments

Comments
 (0)