mirror of
https://github.com/golang/go
synced 2024-11-21 21:24:45 -07:00
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:
parent
80bce97e45
commit
11075ed893
@ -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;
|
||||
|
@ -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
28
test/fixedbugs/bug372.go
Normal 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\"")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user