gc: Don't pollute the xmethod list with non-methods.

Fixes #2355.

I have a test, but not sure if it's worth adding.  Instead i've made
the patching-over in reflect.c methods more fatal and more descriptive.

R=rsc
CC=golang-dev
https://golang.org/cl/5302082
This commit is contained in:
Luuk van Dijk 2011-11-03 17:51:15 +01:00
parent 80bce97e45
commit 11075ed893
3 changed files with 39 additions and 5 deletions

View file

@ -158,10 +158,13 @@ methods(Type *t)
// generating code if necessary.
a = nil;
for(f=mt->xmethod; f; f=f->down) {
if(f->type->etype != TFUNC)
continue;
if(f->etype != TFIELD)
fatal("methods: not field");
fatal("methods: not field %T", f);
if (f->type->etype != TFUNC || f->type->thistuple == 0)
fatal("non-method on %T method %S %T\n", mt, f->sym, f);
if (!getthisx(f->type)->type)
fatal("receiver with no type on %T method %S %T\n", mt, f->sym, f);
method = f->sym;
if(method == nil)
continue;

View file

@ -2178,8 +2178,11 @@ expandmeth(Sym *s, Type *t)
if(c == 0)
continue;
if(c == 1) {
sl->good = 1;
sl->field = f;
// addot1 may have dug out arbitrary fields, we only want methods.
if(f->type->etype == TFUNC && f->type->thistuple > 0) {
sl->good = 1;
sl->field = f;
}
}
break;
}

28
test/fixedbugs/bug372.go Normal file
View file

@ -0,0 +1,28 @@
// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug372
// Copyright 2011 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 2355
package main
type T struct {}
func (T) m() string { return "T" }
type TT struct {
T
m func() string
}
func ff() string { return "ff" }
func main() {
var tt TT
tt.m = ff
if tt.m() != "ff" {
println(tt.m(), "!= \"ff\"")
}
}