go/types: improve documentation on *types.Named
identity
#53914
Labels
Documentation
Issues describing a change to documentation.
help wanted
NeedsFix
The path to resolution is known, but the work has not been done.
Milestone
What version of Go are you using (
go version
)?Does this issue reproduce with the latest release?
It also reproduces in Go 1.18.3.
What operating system and processor architecture are you using (
go env
)?go env
OutputWhat did you do?
I am using golang.org/x/tools/go/ssa to build the SSA form for TinyGo.
We recently added generics support, which was surprisingly easy because the ssa package does all the hard work of instantiating generic functions.
Unfortunately, it resulted in an issue. Previously, we could rely on
*types.Named
to have pointer identity, meaning, that we could create amap[*types.Named]someOtherType
and rely on the fact that every unique named type would have only one entry in the map.What did you expect to see?
I expected this to remain the same while adding support for generics.
What did you see instead?
It broke. It works most of the time, but in some cases (in particular, methods on generic structs) there can be two
*types.Named
objects for the same named type.Here is a reproducer:
https://go.dev/play/p/AIZZDnqqm0l?v=gotip
I've tried to look at the documentation and comments inside the package what the intended behavior is, but I see somewhat conflicting information. In any case, it would be very helpful if
*types.Named
would be unique again.*types.Named
is intended to have pointer identity but doesn't at the moment.go/src/go/types/predicates.go
Lines 428 to 431 in 2aa473c
types.Instantiate
says that not all types may be uniqued:*types.Named
may not be unique:go/src/go/types/named.go
Lines 74 to 81 in 2aa473c
From this, it appears to be a design decision to change the uniqueness of
*types.Named
pointers for generic types.This is a problem for me, as I need a way to create unique IDs per
*types.Named
instance (types.Identical
is not a solution, because you can't use it in a map). I triedtyp.Obj().Pkg().Path() + "." + typ.Obj().Name()
but that doesn't work for named types inside functions (which create a new scope but may have the same name as a named type in the outer scope).I'm reporting this as a bug as it feels like a regression to me, even though it's not technically a regression.
The text was updated successfully, but these errors were encountered: