]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: reject methods on non-locals, even if symbol exists
authorDaniel Morsing <daniel.morsing@gmail.com>
Wed, 20 Mar 2013 21:18:20 +0000 (22:18 +0100)
committerDaniel Morsing <daniel.morsing@gmail.com>
Wed, 20 Mar 2013 21:18:20 +0000 (22:18 +0100)
Fixes #5089.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/7767044

src/cmd/gc/dcl.c
test/fixedbugs/issue5089.go [new file with mode: 0644]

index 45945467b91afaea3ff71ab41e415af1187a6156..429f212e7fc501d8d278842ae20c8224128ece7f 100644 (file)
@@ -1380,6 +1380,12 @@ addmethod(Sym *sf, Type *t, int local, int nointerface)
                }
        }
 
+       if(local && !pa->local) {
+               // defining method on non-local type.
+               yyerror("cannot define new methods on non-local type %T", pa);
+               return;
+       }
+
        n = nod(ODCLFIELD, newname(sf), N);
        n->type = t;
 
@@ -1395,12 +1401,6 @@ addmethod(Sym *sf, Type *t, int local, int nointerface)
                return;
        }
 
-       if(local && !pa->local) {
-               // defining method on non-local type.
-               yyerror("cannot define new methods on non-local type %T", pa);
-               return;
-       }
-
        f = structfield(n);
        f->nointerface = nointerface;
 
diff --git a/test/fixedbugs/issue5089.go b/test/fixedbugs/issue5089.go
new file mode 100644 (file)
index 0000000..14d6bde
--- /dev/null
@@ -0,0 +1,15 @@
+// errorcheck
+
+// Copyright 2013 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 5089: gc allows methods on non-locals if symbol already exists
+
+package p
+
+import "bufio"
+
+func (b *bufio.Reader) Buffered() int { // ERROR "non-local"
+       return -1
+}