mirror of
https://github.com/golang/go
synced 2024-11-21 19:34:46 -07:00
gc: explain why invalid receiver types are invalid
Fixes #1680. R=ken2 CC=golang-dev https://golang.org/cl/4446061
This commit is contained in:
parent
8698bb6c8c
commit
4684df520f
@ -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 {
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user