From 18b843646c26a912c60bf9cbf02dc38daf90cd04 Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Wed, 22 Apr 2020 19:26:05 +0200 Subject: [PATCH] fix: parsing of recursive interface types --- _test/interface36.go | 37 +++++++++++++++++++++++++++++++++++++ interp/type.go | 6 ++++-- 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 _test/interface36.go diff --git a/_test/interface36.go b/_test/interface36.go new file mode 100644 index 00000000..a5ff7191 --- /dev/null +++ b/_test/interface36.go @@ -0,0 +1,37 @@ +package main + +import "fmt" + +var ( + t *S + _ I = t + _ J = t +) + +type S struct { + Name string +} + +func (s *S) F() int { return len(s.Name) } +func (s *S) G() int { return s.F() } +func (s *S) Ri() I { return s } +func (s *S) Rj() J { return s } + +type J interface { + I + G() int + Rj() J +} + +type I interface { + F() int + Ri() I +} + +func main() { + var j J + fmt.Println(j) +} + +// Output: +// diff --git a/interp/type.go b/interp/type.go index df974dfd..3b66334a 100644 --- a/interp/type.go +++ b/interp/type.go @@ -423,6 +423,7 @@ func nodeType(interp *Interpreter, sc *scope, n *node) (*itype, error) { case interfaceType: t.cat = interfaceT + var incomplete bool if sname := typeName(n); sname != "" { if sym, _, found := sc.lookup(sname); found && sym.kind == typeSym { sym.typ = t @@ -435,16 +436,17 @@ func nodeType(interp *Interpreter, sc *scope, n *node) (*itype, error) { return nil, err } t.field = append(t.field, structField{name: fieldName(field.child[0]), embed: true, typ: typ}) - t.incomplete = t.incomplete || typ.incomplete + incomplete = incomplete || typ.incomplete } else { typ, err := nodeType(interp, sc, field.child[1]) if err != nil { return nil, err } t.field = append(t.field, structField{name: field.child[0].ident, typ: typ}) - t.incomplete = t.incomplete || typ.incomplete + incomplete = incomplete || typ.incomplete } } + t.incomplete = incomplete case landExpr, lorExpr: t.cat = boolT