]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: use the orig object for Named.Obj
authorRob Findley <rfindley@google.com>
Wed, 11 Aug 2021 16:43:27 +0000 (12:43 -0400)
committerRobert Findley <rfindley@google.com>
Sat, 14 Aug 2021 15:14:57 +0000 (15:14 +0000)
Exposing a synthetic type name for instantiated types is problematic:
there is no way to ensure that type instances are first created in the
same type checking pass, and therefore no guarantee that their
instantiation positions are the same. Even type checking a given package
with different file ordering could result in different positions being
associated with type instances. This is therefore an implementation
detail that we should not expose.

Keep the synthetic type name for accurate error reporting, but hide it
in the API.

Change-Id: I61f0e3ed322e97b157eb1ca316480f5719dcc174
Reviewed-on: https://go-review.googlesource.com/c/go/+/341858
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/types2/named.go

index 596717267534b57829bd980fdc7366ed1fa98a5b..ad29886f7d6285baef73baa79d3f213ec9a11807 100644 (file)
@@ -15,7 +15,7 @@ import (
 type Named struct {
        check      *Checker
        info       typeInfo    // for cycle detection
-       obj        *TypeName   // corresponding declared object
+       obj        *TypeName   // corresponding declared object for declared types; placeholder for instantiated types
        orig       *Named      // original, uninstantiated type
        fromRHS    Type        // type (on RHS of declaration) this *Named type is derived from (for cycle reporting)
        underlying Type        // possibly a *Named during setup; never a *Named once set up completely
@@ -108,8 +108,11 @@ func (check *Checker) newNamed(obj *TypeName, orig *Named, underlying Type, tpar
        return typ
 }
 
-// Obj returns the type name for the named type t.
-func (t *Named) Obj() *TypeName { return t.obj }
+// Obj returns the type name for the declaration defining the named type t. For
+// instantiated types, this is the type name of the base type.
+func (t *Named) Obj() *TypeName {
+       return t.orig.obj // for non-instances this is the same as t.obj
+}
 
 // Orig returns the original generic type an instantiated type is derived from.
 // If t is not an instantiated type, the result is t.