]> Cypherpunks repositories - gostls13.git/commitdiff
Revert "go/types: make Interface.Complete a no-op"
authorRobert Findley <rfindley@google.com>
Mon, 16 Aug 2021 23:50:47 +0000 (23:50 +0000)
committerRobert Findley <rfindley@google.com>
Tue, 17 Aug 2021 02:49:38 +0000 (02:49 +0000)
This reverts commit fda8ee8b077dd8a5819cac7c52c3af1499a0674e.

Reason for revert: Interface.Complete is still necessary for safe concurrency.

For #47726

Change-Id: I8b924ca5f4af8c7d7e2b5a27bb03a5a5ed9b1d22
Reviewed-on: https://go-review.googlesource.com/c/go/+/342710
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/go/internal/gcimporter/iimport.go
src/go/types/interface.go
src/go/types/issues_test.go

index 5f05e8c0adc38b7f10a355dee7131f0fdc7b6eb6..dbc9b3a83e8ddeccec4a6c4687779536293b4a15 100644 (file)
@@ -174,6 +174,10 @@ func iImportData(fset *token.FileSet, imports map[string]*types.Package, dataRea
                p.doDecl(localpkg, name)
        }
 
+       for _, typ := range p.interfaceList {
+               typ.Complete()
+       }
+
        // record all referenced packages as imports
        list := append(([]*types.Package)(nil), pkgList[1:]...)
        sort.Sort(byPath(list))
index f4d560cb3ed6542eba38b030d4bf58fe4bd9a0c8..510c123e97b6c4db4cef2e98ea1dd49481dfc900 100644 (file)
@@ -104,12 +104,22 @@ func (t *Interface) IsComparable() bool { return t.typeSet().IsComparable() }
 // IsConstraint reports whether interface t is not just a method set.
 func (t *Interface) IsConstraint() bool { return !t.typeSet().IsMethodSet() }
 
-// Complete just returns its receiver. There's no other effect.
+// Complete computes the interface's type set. It must be called by users of
+// NewInterfaceType and NewInterface after the interface's embedded types are
+// fully defined and before using the interface type in any way other than to
+// form other types. The interface must not contain duplicate methods or a
+// panic occurs. Complete returns the receiver.
 //
-// Deprecated: Interfaces are now completed on demand; this function is only
-// here for backward-compatibility. It does not have to be called explicitly
-// anymore.
+// Deprecated: Type sets are now computed lazily, on demand; this function
+//             is only here for backward-compatibility. It does not have to
+//             be called explicitly anymore.
 func (t *Interface) Complete() *Interface {
+       // Some tests are still depending on the state change
+       // (string representation of an Interface not containing an
+       // /* incomplete */ marker) caused by the explicit Complete
+       // call, so we compute the type set eagerly here.
+       t.complete = true
+       t.typeSet()
        return t
 }
 
index 618db13fb9ed58cce065fd92dc496116940ebf34..51995af30afd39f7c174abaa1d61dfc9421277bb 100644 (file)
@@ -405,9 +405,8 @@ func TestIssue28282(t *testing.T) {
        // create type interface { error }
        et := Universe.Lookup("error").Type()
        it := NewInterfaceType(nil, []Type{et})
+       it.Complete()
        // verify that after completing the interface, the embedded method remains unchanged
-       // (interfaces are "completed" lazily now, so the completion happens implicitly when
-       // accessing Method(0))
        want := et.Underlying().(*Interface).Method(0)
        got := it.Method(0)
        if got != want {