From 353cb71ea29e02a41f77b7576d658de4515e264d Mon Sep 17 00:00:00 2001 From: Robert Findley Date: Wed, 17 Nov 2021 19:22:22 -0500 Subject: [PATCH] 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 --- src/go/types/type.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) 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 }