Skip to content

Commit

Permalink
go/types: fix error message for embedded non-interface types in inter…
Browse files Browse the repository at this point in the history
…faces

Fixes golang#10979.

Change-Id: Iac25645ba8181a56a75ddfcd29ff6d64c15c4f57
Reviewed-on: https://go-review.googlesource.com/10466
Reviewed-by: Alan Donovan <[email protected]>
  • Loading branch information
griesemer committed May 28, 2015
1 parent 3ba6387 commit ccc0376
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 12 deletions.
24 changes: 24 additions & 0 deletions src/go/types/testdata/issues.src
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,27 @@ func issue9473(a []int, b ...int) {
append_(f0(), f1()... /* ERROR cannot use */ )
append_(f0(), f2()... /* ERROR cannot use */ )
}

// Check that embedding a non-interface type in an interface results in a good error message.
func issue10979() {
type _ interface {
int /* ERROR int is not an interface */
}
type T struct{}
type _ interface {
T /* ERROR T is not an interface */
}
type _ interface {
nosuchtype /* ERROR undeclared name: nosuchtype */
}
type _ interface {
fmt /* ERROR Nosuchtype not declared by package fmt */ .Nosuchtype
}
type _ interface {
nosuchpkg /* ERROR undeclared name: nosuchpkg */ .Nosuchtype
}
type I interface {
I /* ERROR I\.m \(value of type func\(I\)\) is not a type */ .m
m()
}
}
18 changes: 6 additions & 12 deletions src/go/types/typexpr.go
Original file line number Diff line number Diff line change
Expand Up @@ -525,20 +525,14 @@ func (check *Checker) interfaceType(iface *Interface, ityp *ast.InterfaceType, d
for _, e := range embedded {
pos := e.Pos()
typ := check.typExpr(e, nil, path)
// Determine underlying embedded (possibly incomplete) type
// by following its forward chain.
named, _ := typ.(*Named)
if named == nil {
if typ != Typ[Invalid] {
check.invalidAST(pos, "%s is not named type", typ)
}
continue
}
// determine underlying (possibly incomplete) type
// by following its forward chain
u := underlying(named)
embed, _ := u.(*Interface)
under := underlying(named)
embed, _ := under.(*Interface)
if embed == nil {
if u != Typ[Invalid] {
check.errorf(pos, "%s is not an interface", named)
if typ != Typ[Invalid] {
check.errorf(pos, "%s is not an interface", typ)
}
continue
}
Expand Down

0 comments on commit ccc0376

Please sign in to comment.