mirror of
https://github.com/golang/go
synced 2024-11-22 03:14:41 -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.
|
// generating code if necessary.
|
||||||
a = nil;
|
a = nil;
|
||||||
for(f=mt->xmethod; f; f=f->down) {
|
for(f=mt->xmethod; f; f=f->down) {
|
||||||
if(f->type->etype != TFUNC)
|
|
||||||
continue;
|
|
||||||
if(f->etype != TFIELD)
|
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;
|
method = f->sym;
|
||||||
if(method == nil)
|
if(method == nil)
|
||||||
continue;
|
continue;
|
||||||
|
@ -2178,8 +2178,11 @@ expandmeth(Sym *s, Type *t)
|
|||||||
if(c == 0)
|
if(c == 0)
|
||||||
continue;
|
continue;
|
||||||
if(c == 1) {
|
if(c == 1) {
|
||||||
sl->good = 1;
|
// addot1 may have dug out arbitrary fields, we only want methods.
|
||||||
sl->field = f;
|
if(f->type->etype == TFUNC && f->type->thistuple > 0) {
|
||||||
|
sl->good = 1;
|
||||||
|
sl->field = f;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
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