Commit 32f2f72c authored by Michael Matloob's avatar Michael Matloob Committed by Michael Matloob

cmd/compile: provide better error when method called without receiver

When a method is called using the Type.Method(receiver, args...) syntax
without the receiver, or enough arguments, provide the more helpful
error message "not enough arguments in call to method expression
Type.Method" instead of the old message "not enough arguments in call
to Type.Method".

Fixes #8385

Change-Id: Id5037eb1ee5fa93687d4a6557b4a8233b29e9df2
Reviewed-on: https://go-review.googlesource.com/2193Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent 3925a7c5
...@@ -2787,7 +2787,14 @@ out: ...@@ -2787,7 +2787,14 @@ out:
notenough: notenough:
if n == nil || n.Diag == 0 { if n == nil || n.Diag == 0 {
if call != nil { 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 { } else {
Yyerror("not enough arguments to %v", Oconv(int(op), 0)) Yyerror("not enough arguments to %v", Oconv(int(op), 0))
} }
......
// 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"
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment