notenough:
if n == nil || n.Diag == 0 {
if call != nil {
- Yyerror("not enough arguments in call to %v", call)
+ // call is the expression being called, not the overall call.
+ // Method expressions have the form T.M, and the compiler has
+ // rewritten those to ONAME nodes but left T in Left.
+ if call.Op == ONAME && call.Left != nil && call.Left.Op == OTYPE {
+ Yyerror("not enough arguments in call to method expression %v", call)
+ } else {
+ Yyerror("not enough arguments in call to %v", call)
+ }
} else {
Yyerror("not enough arguments to %v", Oconv(int(op), 0))
}
--- /dev/null
+// errorcheck
+
+// Copyright 2014 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.
+
+// Issue 8385: provide a more descriptive error when a method expression
+// is called without a receiver.
+
+package main
+
+type Fooer interface {
+ Foo(i, j int)
+}
+
+func f(x int) {
+}
+
+type I interface {
+ M(int)
+}
+type T struct{}
+
+func (t T) M(x int) {
+}
+
+func g() func(int)
+
+func main() {
+ Fooer.Foo(5, 6) // ERROR "not enough arguments in call to method expression Fooer.Foo"
+
+ var i I
+ var t *T
+
+ g()() // ERROR "not enough arguments in call to g\(\)"
+ f() // ERROR "not enough arguments in call to f"
+ i.M() // ERROR "not enough arguments in call to i\.M"
+ I.M() // ERROR "not enough arguments in call to method expression I\.M"
+ t.M() // ERROR "not enough arguments in call to t\.M"
+ T.M() // ERROR "not enough arguments in call to method expression T\.M"
+ (*T).M() // ERROR "not enough arguments in call to method expression \(\*T\)\.M"
+}