Commit 8a34cf7e authored by Håvard Haugen's avatar Håvard Haugen Committed by Robert Griesemer

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/16866Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent 0c516c16
......@@ -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
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment