Commit 4684df52 authored by Russ Cox's avatar Russ Cox

gc: explain why invalid receiver types are invalid

Fixes #1680.

R=ken2
CC=golang-dev
https://golang.org/cl/4446061
parent 8698bb6c
...@@ -1139,6 +1139,32 @@ addmethod(Sym *sf, Type *t, int local) ...@@ -1139,6 +1139,32 @@ addmethod(Sym *sf, Type *t, int local)
pa = pa->type; pa = pa->type;
f = methtype(pa); f = methtype(pa);
if(f == T) { if(f == T) {
t = pa;
if(t != T) {
if(isptr[t->etype]) {
if(t->sym != S) {
yyerror("invalid receiver type %T (%T is a pointer type)", pa, t);
return;
}
t = t->type;
}
}
if(t != T) {
if(t->sym == S) {
yyerror("invalid receiver type %T (%T is an unnamed type)", pa, t);
return;
}
if(isptr[t->etype]) {
yyerror("invalid receiver type %T (%T is a pointer type)", pa, t);
return;
}
if(t->etype == TINTER) {
yyerror("invalid receiver type %T (%T is an interface type)", pa, t);
return;
}
}
// Should have picked off all the reasons above,
// but just in case, fall back to generic error.
yyerror("invalid receiver type %T", pa); yyerror("invalid receiver type %T", pa);
return; return;
} }
......
...@@ -12,8 +12,14 @@ type T struct { ...@@ -12,8 +12,14 @@ type T struct {
type P *T type P *T
type P1 *T type P1 *T
func (p P) val() int { return 1 } // ERROR "receiver" func (p P) val() int { return 1 } // ERROR "receiver.* pointer"
func (p *P1) val() int { return 1 } // ERROR "receiver" func (p *P1) val() int { return 1 } // ERROR "receiver.* pointer"
type I interface{}
type I1 interface{}
func (p I) val() int { return 1 } // ERROR "receiver.*interface"
func (p *I1) val() int { return 1 } // ERROR "receiver.*interface"
type Val interface { type Val interface {
val() int val() int
......
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