From 30a423eb3934251286bb57954c9d9d4b2385815e Mon Sep 17 00:00:00 2001 From: Robert Findley Date: Mon, 16 Aug 2021 16:03:59 -0400 Subject: [PATCH] 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 Run-TryBot: Robert Findley TryBot-Result: Go Bot Reviewed-by: Robert Griesemer --- src/go/types/subst.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/go/types/subst.go b/src/go/types/subst.go index da0578ff5c..e47d20774f 100644 --- a/src/go/types/subst.go +++ b/src/go/types/subst.go @@ -228,10 +228,15 @@ func (subst *subster) typ(typ Type) Type { 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) 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 subst.typMap[h] = named 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) dump(">>> underlying: %v", named.underlying) 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