mirror of
https://github.com/golang/go
synced 2024-11-24 00:20:14 -07:00
cmd/compile: Fix internal compiler: getinarg: not a func
when returning invalid interface.
Internal error arose from calling methodfunc on a invalid interface field during the implements check. int obviously isn't a function, and errors on getinarg... for im := iface.Type; im != nil; im = im.Down { imtype = methodfunc(im.Type, nil) // ... } Fix handles the internal compiler error, but does not throw an additional error, i.e. the following code will error on the I interface, but type A will pass the implements check since 'Read(string) string' is implemented and 'int' is skipped type I interface { Read(string) string int } type A struct { } func (a *A) Read(s string) string { return s } func New() I { return new(A) } Fixes #10975 Change-Id: I4b54013afb2814db3f315515f0c742d8631ca500 Reviewed-on: https://go-review.googlesource.com/13747 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
788eb99b76
commit
acc90c53e8
@ -2986,6 +2986,9 @@ func implements(t *Type, iface *Type, m **Type, samename **Type, ptr *int) bool
|
||||
var followptr bool
|
||||
var rcvr *Type
|
||||
for im := iface.Type; im != nil; im = im.Down {
|
||||
if im.Broke == 1 {
|
||||
continue
|
||||
}
|
||||
imtype = methodfunc(im.Type, nil)
|
||||
tm = ifacelookdot(im.Sym, t, &followptr, 0)
|
||||
if tm == nil || tm.Nointerface || !Eqtype(methodfunc(tm.Type, nil), imtype) {
|
||||
|
19
test/fixedbugs/issue10975.go
Normal file
19
test/fixedbugs/issue10975.go
Normal file
@ -0,0 +1,19 @@
|
||||
// errorcheck
|
||||
|
||||
// Copyright 2015 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 10975: Returning an invalid interface would cause
|
||||
// `internal compiler error: getinarg: not a func`.
|
||||
|
||||
package main
|
||||
|
||||
type I interface {
|
||||
int // ERROR "interface contains embedded non-interface int"
|
||||
}
|
||||
|
||||
func New() I {
|
||||
return struct{}{}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user