]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: Fix `internal compiler: getinarg: not a func` when returning invalid...
authoracanino <anthony.canino1@gmail.com>
Sat, 22 Aug 2015 02:24:20 +0000 (22:24 -0400)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 3 Oct 2015 15:32:46 +0000 (15:32 +0000)
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>
src/cmd/compile/internal/gc/subr.go
test/fixedbugs/issue10975.go [new file with mode: 0644]

index d2d51a03667160dab6cba7fd71f53529da7a719f..3280710b224b996c369e2e9c4f9a3e9de75c41be 100644 (file)
@@ -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) {
diff --git a/test/fixedbugs/issue10975.go b/test/fixedbugs/issue10975.go
new file mode 100644 (file)
index 0000000..0a4b7be
--- /dev/null
@@ -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{}{}
+}
+