]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: better error message when referring to ambiguous method/field
authorRobert Griesemer <gri@golang.org>
Tue, 10 Apr 2018 22:56:17 +0000 (15:56 -0700)
committerRobert Griesemer <gri@golang.org>
Tue, 10 Apr 2018 23:39:13 +0000 (23:39 +0000)
Fixes #14321.

Change-Id: I9c92c767b01cf7938c4808a8fef9f2936fc667bc
Reviewed-on: https://go-review.googlesource.com/106119
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue14321.go [new file with mode: 0644]

index 9c9046bb3a06e01398a51690abbcb36d7b67aed6..bd0c4aec9e73a897e7c6c9963c4442212ef72a74 100644 (file)
@@ -2359,6 +2359,8 @@ func typecheckMethodExpr(n *Node) *Node {
        if m == nil {
                if lookdot1(n, s, t, ms, 1) != nil {
                        yyerror("%v undefined (cannot refer to unexported method %v)", n, s)
+               } else if _, ambig := dotpath(s, t, nil, false); ambig {
+                       yyerror("%v undefined (ambiguous selector)", n) // method or field
                } else {
                        yyerror("%v undefined (type %v has no method %v)", n, t, s)
                }
diff --git a/test/fixedbugs/issue14321.go b/test/fixedbugs/issue14321.go
new file mode 100644 (file)
index 0000000..058008c
--- /dev/null
@@ -0,0 +1,33 @@
+// errorcheck
+
+// Copyright 2018 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.
+
+// Verify that error message reports _ambiguous_ method.
+
+package p
+
+type A struct{
+       H int
+}
+
+func (A) F() {}
+func (A) G() {}
+
+type B struct{
+       G int
+       H int
+}
+
+func (B) F() {}
+
+type C struct {
+       A
+       B
+}
+
+var _ = C.F // ERROR "ambiguous selector"
+var _ = C.G // ERROR "ambiguous selector"
+var _ = C.H // ERROR "ambiguous selector"
+var _ = C.I // ERROR "no method I"