mirror of https://github.com/golang/go.git
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
|
|
@ -1374,6 +1374,15 @@ func addmethod(sf *Sym, t *Type, local bool, nointerface bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pa = f
|
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 {
|
if pa.Etype == TSTRUCT {
|
||||||
for f := pa.Type; f != nil; f = f.Down {
|
for f := pa.Type; f != nil; f = f.Down {
|
||||||
if f.Sym == sf {
|
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 := Nod(ODCLFIELD, newname(sf), nil)
|
||||||
n.Type = t
|
n.Type = t
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3441,7 +3441,7 @@ func typecheckfunc(n *Node) {
|
||||||
n.Type = t
|
n.Type = t
|
||||||
t.Nname = n.Func.Nname
|
t.Nname = n.Func.Nname
|
||||||
rcvr := getthisx(t).Type
|
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)
|
addmethod(n.Func.Shortname.Sym, t, true, n.Func.Nname.Nointerface)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,10 @@ var t struct {
|
||||||
_ int
|
_ int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x int) _() { // ERROR "cannot define new methods on non-local type"
|
||||||
|
println(x)
|
||||||
|
}
|
||||||
|
|
||||||
type T struct {
|
type T struct {
|
||||||
_ []int
|
_ []int
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue