]> Cypherpunks.ru repositories - gostls13.git/commit
go/types, types2: use a type lookup by identity in method lookup
authorRobert Findley <rfindley@google.com>
Wed, 4 May 2022 21:41:39 +0000 (17:41 -0400)
committerRobert Findley <rfindley@google.com>
Mon, 9 May 2022 19:54:59 +0000 (19:54 +0000)
commitf088f4962e628992833444df7486d392715ea73d
treebe63d0ea6542fbb66d8dc28bc6c4293c6eba6b89
parent6399b24539c78686e5eaf8402ac623f341c0350f
go/types, types2: use a type lookup by identity in method lookup

Named type identity is no longer canonical. For correctness, named types
need to be compared with types.Identical. Our method set algorithm was
not doing this: it was using a map to de-duplicate named types, relying
on their pointer identity. As a result it was possible to get incorrect
results or even infinite recursion, as encountered in #52715.

To fix this, look up types by identity in NewMethodSet and
LookupFieldOrMethod. This does a linear search among types with equal
origin. Alternatively we could use a *Context to do a hash lookup, but
in practice we will be considering a small number of types, and so
performance is not a concern and a linear lookup is simpler. This also
means we don't have to rely on our type hash being perfect, which we
don't depend on elsewhere.

Also add more tests for NewMethodSet and LookupFieldOrMethod involving
generics.

Fixes #52715
Fixes #51580

Change-Id: I04dfeff54347bc3544d95a30224c640ef448e9b7
Reviewed-on: https://go-review.googlesource.com/c/go/+/404099
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/types2/api_test.go
src/cmd/compile/internal/types2/lookup.go
src/go/types/api_test.go
src/go/types/lookup.go
src/go/types/methodset.go
src/go/types/methodset_test.go