]> Cypherpunks repositories - gostls13.git/commitdiff
gc: Don't pollute the xmethod list with non-methods.
authorLuuk van Dijk <lvd@golang.org>
Thu, 3 Nov 2011 16:51:15 +0000 (17:51 +0100)
committerLuuk van Dijk <lvd@golang.org>
Thu, 3 Nov 2011 16:51:15 +0000 (17:51 +0100)
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

src/cmd/gc/reflect.c
src/cmd/gc/subr.c
test/fixedbugs/bug372.go [new file with mode: 0644]

index 86df3a378d07534797f9d086b73e81ee61bf1b60..d59d1a5397710478124b0a74530ea2b280630097 100644 (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;
index b12153df34f680845819b582c8595c5535e7bef1..11feb61a9738d773048ddf10266bb9003b080845 100644 (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;
                }
diff --git a/test/fixedbugs/bug372.go b/test/fixedbugs/bug372.go
new file mode 100644 (file)
index 0000000..a6f7208
--- /dev/null
@@ -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\"")
+       }
+}