1
0
mirror of https://github.com/golang/go synced 2024-11-26 08:07:57 -07:00

go/types: no need to validate substituted instances

This is a straightforward port of CL 342150 to go/types.

Change-Id: I7363e4642ade7ab30ca822a2be71f4d2804cc4a9
Reviewed-on: https://go-review.googlesource.com/c/go/+/342669
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>
This commit is contained in:
Robert Findley 2021-08-16 16:03:59 -04:00
parent e49775e057
commit 30a423eb39

View File

@ -228,10 +228,15 @@ func (subst *subster) typ(typ Type) Type {
return named return named
} }
// create a new named type and populate typMap to avoid endless recursion // Create a new named type and populate typMap to avoid endless recursion.
// The position used here is irrelevant because validation only occurs on t
// (we don't call validType on named), but we use subst.pos to help with
// debugging.
tname := NewTypeName(subst.pos, t.obj.pkg, t.obj.name, nil) tname := NewTypeName(subst.pos, t.obj.pkg, t.obj.name, nil)
t.load() t.load()
named := subst.check.newNamed(tname, t.orig, t.underlying, t.TParams(), t.methods) // method signatures are updated lazily // It's ok to provide a nil *Checker because the newly created type
// doesn't need to be (lazily) expanded; it's expanded below.
named := (*Checker)(nil).newNamed(tname, t.orig, nil, t.tparams, t.methods) // t is loaded, so tparams and methods are available
named.targs = newTArgs named.targs = newTArgs
subst.typMap[h] = named subst.typMap[h] = named
t.expand(subst.typMap) // must happen after typMap update to avoid infinite recursion t.expand(subst.typMap) // must happen after typMap update to avoid infinite recursion
@ -241,7 +246,7 @@ func (subst *subster) typ(typ Type) Type {
named.underlying = subst.typOrNil(t.underlying) named.underlying = subst.typOrNil(t.underlying)
dump(">>> underlying: %v", named.underlying) dump(">>> underlying: %v", named.underlying)
assert(named.underlying != nil) assert(named.underlying != nil)
named.fromRHS = named.underlying // for cycle detection (Checker.validType) named.fromRHS = named.underlying // for consistency, though no cycle detection is necessary
return named return named