From: Robert Findley Date: Thu, 18 Nov 2021 00:22:22 +0000 (-0500) Subject: go/types: optimize common case in structuralType X-Git-Tag: go1.18beta1~256 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=353cb71ea29e02a41f77b7576d658de4515e264d;p=gostls13.git go/types: optimize common case in structuralType This is a port of CL 363668 from types2 to go/types. Change-Id: Ic55acb2e27f57c33467cef2f687cd695e092ba6d Reviewed-on: https://go-review.googlesource.com/c/go/+/364898 Trust: Robert Findley Run-TryBot: Robert Findley TryBot-Result: Go Bot Reviewed-by: Robert Griesemer --- diff --git a/src/go/types/type.go b/src/go/types/type.go index 6611c25f25..e283c65289 100644 --- a/src/go/types/type.go +++ b/src/go/types/type.go @@ -56,15 +56,20 @@ func match(x, y Type) Type { return nil } -// If typ is a type parameter, structuralType returns the single underlying -// type of all types in the corresponding type constraint if it exists, or -// nil otherwise. If the type set contains only unrestricted and restricted -// channel types (with identical element types), the single underlying type -// is the restricted channel type if the restrictions are always the same. -// If typ is not a type parameter, structuralType returns the underlying type. -func structuralType(typ Type) Type { +// If t is not a type parameter, structuralType returns the underlying type. +// If t is a type parameter, structuralType returns the single underlying +// type of all types in its type set if it exists, or nil otherwise. If the +// type set contains only unrestricted and restricted channel types (with +// identical element types), the single underlying type is the restricted +// channel type if the restrictions are always the same, or nil otherwise. +func structuralType(t Type) Type { + tpar, _ := t.(*TypeParam) + if tpar == nil { + return under(t) + } + var su Type - if underIs(typ, func(u Type) bool { + if tpar.underIs(func(u Type) bool { if u == nil { return false }