]> Cypherpunks repositories - gostls13.git/commit
[release-branch.go1.18] go/types, types2: use a type lookup by identity in method...
authorRobert Findley <rfindley@google.com>
Wed, 4 May 2022 21:41:39 +0000 (17:41 -0400)
committerHeschi Kreinick <heschi@google.com>
Tue, 10 May 2022 15:00:03 +0000 (15:00 +0000)
commit020fc475017b3f86068052efc6dd5b2350ec03fe
treecc4bfc395b3011205a72acc744aac5a83925799d
parentb2b4b9e015998bd1a0b9ab3d5a5d5138951a3bf5
[release-branch.go1.18] 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 #52804

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>
(cherry picked from commit f088f4962e628992833444df7486d392715ea73d)
Reviewed-on: https://go-review.googlesource.com/c/go/+/405117
Reviewed-by: Alan Donovan <adonovan@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