]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] go/types, types2: set tset when constructing interfaces in the universe
authorRob Findley <rfindley@google.com>
Fri, 23 Jul 2021 14:00:10 +0000 (10:00 -0400)
committerRobert Findley <rfindley@google.com>
Sat, 24 Jul 2021 01:54:15 +0000 (01:54 +0000)
As of CL 334894, type sets are lazily evaluated on interfaces. For the
universe interfaces error and comparable, this can lead to data races
when type checking concurrently. Fix this by computing their type set
when they are defined.

Tested using the repro from #47345. I considered checking this in as a
test, but it probably wouldn't add much value going forward.

Fixes #47345

Change-Id: I014a511b8e3c092c86201a8bfc7f5f494f8f20e8
Reviewed-on: https://go-review.googlesource.com/c/go/+/336910
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/types2/universe.go
src/go/types/universe.go

index e2dd0df69e85fc6b22e53a5a6cfc2698c71fe890..0f711a6b684618f6a9c0ae00ed6874965e1e3440 100644 (file)
@@ -88,7 +88,9 @@ func defPredeclaredTypes() {
                res := NewVar(nopos, nil, "", Typ[String])
                sig := NewSignature(nil, nil, NewTuple(res), false)
                err := NewFunc(nopos, nil, "Error", sig)
-               typ := NewNamed(obj, NewInterfaceType([]*Func{err}, nil), nil)
+               ityp := NewInterfaceType([]*Func{err}, nil)
+               computeTypeSet(nil, nopos, ityp) // prevent races due to lazy computation of tset
+               typ := NewNamed(obj, ityp, nil)
                sig.recv = NewVar(nopos, nil, "", typ)
                def(obj)
        }
@@ -99,7 +101,9 @@ func defPredeclaredTypes() {
                obj.setColor(black)
                sig := NewSignature(nil, nil, nil, false)
                eql := NewFunc(nopos, nil, "==", sig)
-               typ := NewNamed(obj, NewInterfaceType([]*Func{eql}, nil), nil)
+               ityp := NewInterfaceType([]*Func{eql}, nil)
+               computeTypeSet(nil, nopos, ityp) // prevent races due to lazy computation of tset
+               typ := NewNamed(obj, ityp, nil)
                sig.recv = NewVar(nopos, nil, "", typ)
                def(obj)
        }
index 59952bc64270afc8c38855f7bf739def49a7b726..489587f393827f768ac37e0f17ecee8334010366 100644 (file)
@@ -89,7 +89,9 @@ func defPredeclaredTypes() {
                res := NewVar(token.NoPos, nil, "", Typ[String])
                sig := NewSignature(nil, nil, NewTuple(res), false)
                err := NewFunc(token.NoPos, nil, "Error", sig)
-               typ := NewNamed(obj, NewInterfaceType([]*Func{err}, nil), nil)
+               ityp := NewInterfaceType([]*Func{err}, nil)
+               computeTypeSet(nil, token.NoPos, ityp) // prevent races due to lazy computation of tset
+               typ := NewNamed(obj, ityp, nil)
                sig.recv = NewVar(token.NoPos, nil, "", typ)
                def(obj)
        }
@@ -100,7 +102,9 @@ func defPredeclaredTypes() {
                obj.setColor(black)
                sig := NewSignature(nil, nil, nil, false)
                eql := NewFunc(token.NoPos, nil, "==", sig)
-               typ := NewNamed(obj, NewInterfaceType([]*Func{eql}, nil), nil)
+               ityp := NewInterfaceType([]*Func{eql}, nil)
+               computeTypeSet(nil, token.NoPos, ityp) // prevent races due to lazy computation of tset
+               typ := NewNamed(obj, ityp, nil)
                sig.recv = NewVar(token.NoPos, nil, "", typ)
                def(obj)
        }