]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: eliminate Named.instPos
authorRobert Griesemer <gri@golang.org>
Wed, 15 Sep 2021 00:13:32 +0000 (17:13 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 15 Sep 2021 03:29:46 +0000 (03:29 +0000)
This is a clean port of CL 349411 from go/types to types2.

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

index 5ef8855a1b38348351d1bff35cb238f8d5afb41c..fe9a3099fee13944d09196b29a5e292ed7b0e641 100644 (file)
@@ -50,13 +50,6 @@ func (env *Environment) TypeHash(typ Type, targs []Type) string {
                h.typ(typ)
        }
 
-       if debug {
-               // there should be no instance markers in type hashes
-               for _, b := range buf.Bytes() {
-                       assert(b != instanceMarker)
-               }
-       }
-
        return strings.Replace(buf.String(), " ", "#", -1) // ReplaceAll is not available in Go1.4
 }
 
index a68273271b7434493f60ad45609e12b8f18b2070..ea43fab1782dd03f97b548847aa5d74f5443326c 100644 (file)
@@ -246,7 +246,7 @@ func stripAnnotations(s string) string {
        var b bytes.Buffer
        for _, r := range s {
                // strip #'s and subscript digits
-               if r != instanceMarker && !('₀' <= r && r < '₀'+10) { // '₀' == U+2080
+               if r < '₀' || '₀'+10 <= r { // '₀' == U+2080
                        b.WriteRune(r)
                }
        }
index e1f0e83fc97d16f43be86cf4eb169d78e1bba284..72a2ce3655ae2002b1f8c5f2779d73ec42d79675 100644 (file)
@@ -35,7 +35,6 @@ func TestStripAnnotations(t *testing.T) {
                {"foo", "foo"},
                {"foo₀", "foo"},
                {"foo(T₀)", "foo(T)"},
-               {"#foo(T₀)", "foo(T)"},
        } {
                got := stripAnnotations(test.in)
                if got != test.want {
index 5a6a13a10790bd81e2bcb0ad14b93541c2d79187..7a9279943c190f0f93af895b649b8914e0e5645f 100644 (file)
@@ -118,8 +118,9 @@ func (check *Checker) instance(pos syntax.Pos, typ Type, targs []Type, env *Envi
                tname := NewTypeName(pos, t.obj.pkg, t.obj.name, nil)
                named := check.newNamed(tname, t, nil, nil, nil) // methods and tparams are set when named is resolved
                named.targs = NewTypeList(targs)
-               named.instPos = &pos
-               named.resolver = expandNamed
+               named.resolver = func(env *Environment, n *Named) (*TypeParamList, Type, []*Func) {
+                       return expandNamed(env, n, pos)
+               }
                if env != nil {
                        // It's possible that we've lost a race to add named to the environment.
                        // In this case, use whichever instance is recorded in the environment.
index 7883b7347bb07e3c30556bd3f0317f9def695909..c844012e39e31de5b05882896249a20f2f83382d 100644 (file)
@@ -17,7 +17,6 @@ type Named struct {
        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
-       instPos    *syntax.Pos    // position information for lazy instantiation, or nil
        tparams    *TypeParamList // type parameters, or nil
        targs      *TypeList      // type arguments (after instantiation), or nil
        methods    []*Func        // methods declared for this type (not the method set of this type); signatures are type-checked lazily
@@ -222,11 +221,11 @@ func (n *Named) setUnderlying(typ Type) {
 
 // expandNamed ensures that the underlying type of n is instantiated.
 // The underlying type will be Typ[Invalid] if there was an error.
-func expandNamed(env *Environment, n *Named) (*TypeParamList, Type, []*Func) {
+func expandNamed(env *Environment, n *Named, instPos syntax.Pos) (*TypeParamList, Type, []*Func) {
        n.orig.resolve(env)
 
        var u Type
-       if n.check.validateTArgLen(*n.instPos, n.orig.tparams.Len(), n.targs.Len()) {
+       if n.check.validateTArgLen(instPos, n.orig.tparams.Len(), n.targs.Len()) {
                // TODO(rfindley): handling an optional Checker and Environment here (and
                // in subst) feels overly complicated. Can we simplify?
                if env == nil {
@@ -245,11 +244,10 @@ func expandNamed(env *Environment, n *Named) (*TypeParamList, Type, []*Func) {
                        // shouldn't return that instance from expand.
                        env.typeForHash(h, n)
                }
-               u = n.check.subst(*n.instPos, n.orig.underlying, makeSubstMap(n.orig.tparams.list(), n.targs.list()), env)
+               u = n.check.subst(instPos, n.orig.underlying, makeSubstMap(n.orig.tparams.list(), n.targs.list()), env)
        } else {
                u = Typ[Invalid]
        }
-       n.instPos = nil
        return n.orig.tparams, u, n.orig.methods
 }
 
index bbaca8e0aab007ccc232d079028f7f98bab641f7..a7f1185fa89d73f0be54fffdd47eeb11b95c8f9d 100644 (file)
@@ -31,7 +31,7 @@ func TestSizeof(t *testing.T) {
                {Interface{}, 44, 88},
                {Map{}, 16, 32},
                {Chan{}, 12, 24},
-               {Named{}, 72, 136},
+               {Named{}, 68, 128},
                {TypeParam{}, 28, 48},
                {term{}, 12, 24},
                {top{}, 0, 0},
index 71da37c3a14d0c9789063508f27ca709982b50e3..bdafcf883db9b4b40722bc929889eecbf4cce3d1 100644 (file)
@@ -63,9 +63,6 @@ func WriteSignature(buf *bytes.Buffer, sig *Signature, qf Qualifier) {
        newTypeWriter(buf, qf).signature(sig)
 }
 
-// instanceMarker is the prefix for an instantiated type in unexpanded form.
-const instanceMarker = '#'
-
 type typeWriter struct {
        buf  *bytes.Buffer
        seen map[Type]bool
@@ -245,13 +242,6 @@ func (w *typeWriter) typ(typ Type) {
                }
 
        case *Named:
-               // Instance markers indicate unexpanded instantiated
-               // types. Write them to aid debugging, but don't write
-               // them when we need an instance hash: whether a type
-               // is fully expanded or not doesn't matter for identity.
-               if w.env == nil && t.instPos != nil {
-                       w.byte(instanceMarker)
-               }
                w.typePrefix(t)
                w.typeName(t.obj)
                if t.targs != nil {