mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
cmd/compile: don't allow blank method declarations on builtins
Move test for isblank into addmethod so that most of the type checking for methods is also performed for blank methods. Fixes #11366. Change-Id: I13d554723bf96d906d0b3ff390d7b7c87c1a5020 Reviewed-on: https://go-review.googlesource.com/16866 Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
0c516c1632
commit
8a34cf7ee0
3 changed files with 14 additions and 8 deletions
|
@ -1374,6 +1374,15 @@ func addmethod(sf *Sym, t *Type, local bool, nointerface bool) {
|
|||
}
|
||||
|
||||
pa = f
|
||||
if local && !pa.Local {
|
||||
Yyerror("cannot define new methods on non-local type %v", pa)
|
||||
return
|
||||
}
|
||||
|
||||
if isblanksym(sf) {
|
||||
return
|
||||
}
|
||||
|
||||
if pa.Etype == TSTRUCT {
|
||||
for f := pa.Type; f != nil; f = f.Down {
|
||||
if f.Sym == sf {
|
||||
|
@ -1383,13 +1392,6 @@ func addmethod(sf *Sym, t *Type, local bool, nointerface bool) {
|
|||
}
|
||||
}
|
||||
|
||||
if local && !pa.Local {
|
||||
// defining method on non-local type.
|
||||
Yyerror("cannot define new methods on non-local type %v", pa)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
n := Nod(ODCLFIELD, newname(sf), nil)
|
||||
n.Type = t
|
||||
|
||||
|
|
|
@ -3441,7 +3441,7 @@ func typecheckfunc(n *Node) {
|
|||
n.Type = t
|
||||
t.Nname = n.Func.Nname
|
||||
rcvr := getthisx(t).Type
|
||||
if rcvr != nil && n.Func.Shortname != nil && !isblank(n.Func.Shortname) {
|
||||
if rcvr != nil && n.Func.Shortname != nil {
|
||||
addmethod(n.Func.Shortname.Sym, t, true, n.Func.Nname.Nointerface)
|
||||
}
|
||||
|
||||
|
|
|
@ -13,6 +13,10 @@ var t struct {
|
|||
_ int
|
||||
}
|
||||
|
||||
func (x int) _() { // ERROR "cannot define new methods on non-local type"
|
||||
println(x)
|
||||
}
|
||||
|
||||
type T struct {
|
||||
_ []int
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue