This is a port of CL 363665 from types2 to go/types.
Change-Id: I20c4e20ab97f1e4de66a29095dc4a9b160810fe5
Reviewed-on: https://go-review.googlesource.com/c/go/+/364897
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
// Otherwise it returns (typ, false).
func deref(typ Type) (Type, bool) {
if p, _ := typ.(*Pointer); p != nil {
+ // p.base should never be nil, but be conservative
+ if p.base == nil {
+ if debug {
+ panic("pointer with nil base type (possibly due to an invalid cyclic declaration)")
+ }
+ return Typ[Invalid], true
+ }
return p.base, true
}
return typ, false
// pointers
P0 *P0
+ PP *struct{ PP.f /* ERROR no field or method f */ }
// functions
F0 func(F0)
// under must only be called when a type is known
// to be fully set up.
func under(t Type) Type {
- switch t := t.(type) {
- case *Named:
+ if t, _ := t.(*Named); t != nil {
return t.under()
- case *TypeParam:
- return t.iface()
}
- return t
+ return t.Underlying()
}
// If x and y are identical, match returns x.
case *ast.StarExpr:
typ := new(Pointer)
+ typ.base = Typ[Invalid] // avoid nil base in invalid recursive type declaration
def.setUnderlying(typ)
typ.base = check.varType(e.X)
return typ