mirror of https://github.com/golang/go.git
cmd/gc: reject methods on non-locals, even if symbol exists
Fixes #5089. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/7767044
This commit is contained in:
parent
d3c758d7d2
commit
7c3694c4de
|
|
@ -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 = nod(ODCLFIELD, newname(sf), N);
|
||||||
n->type = t;
|
n->type = t;
|
||||||
|
|
||||||
|
|
@ -1395,12 +1401,6 @@ addmethod(Sym *sf, Type *t, int local, int nointerface)
|
||||||
return;
|
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 = structfield(n);
|
||||||
f->nointerface = nointerface;
|
f->nointerface = nointerface;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue