Skip to content

Commit

Permalink
cmd/compile: remove interfacecycles debug flag
Browse files Browse the repository at this point in the history
Per the discussion on the issue, since no problems related to this
appeared since Go 1.20, remove the ability to disable the check for
anonymous interface cycles permanently.

Adjust various tests accordingly.

For golang#56103.

Change-Id: Ica2b28752dca08934bbbc163a9b062ae1eb2a834
Reviewed-on: https://go-review.googlesource.com/c/go/+/550896
Run-TryBot: Robert Griesemer <[email protected]>
Auto-Submit: Robert Griesemer <[email protected]>
Reviewed-by: Robert Griesemer <[email protected]>
TryBot-Result: Gopher Robot <[email protected]>
Reviewed-by: Matthew Dempsky <[email protected]>
  • Loading branch information
griesemer authored and ezz-no committed Feb 17, 2024
1 parent 7b8ac55 commit e628d1e
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 23 deletions.
1 change: 0 additions & 1 deletion src/cmd/compile/internal/base/debug.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ type DebugFlags struct {
Gossahash string `help:"hash value for use in debugging the compiler"`
InlFuncsWithClosures int `help:"allow functions with closures to be inlined" concurrent:"ok"`
InlStaticInit int `help:"allow static initialization of inlined calls" concurrent:"ok"`
InterfaceCycles int `help:"allow anonymous interface cycles"`
Libfuzzer int `help:"enable coverage instrumentation for libfuzzer"`
LoopVar int `help:"shared (0, default), 1 (private loop variables), 2, private + log"`
LoopVarHash string `help:"for debugging changes in loop behavior. Overrides experiment and loopvar flag."`
Expand Down
29 changes: 14 additions & 15 deletions src/cmd/compile/internal/noder/irgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,23 +92,22 @@ func checkFiles(m posMap, noders []*noder) (*types2.Package, *types2.Info) {
}

// Check for anonymous interface cycles (#56103).
if base.Debug.InterfaceCycles == 0 {
var f cycleFinder
for _, file := range files {
syntax.Inspect(file, func(n syntax.Node) bool {
if n, ok := n.(*syntax.InterfaceType); ok {
if f.hasCycle(n.GetTypeInfo().Type.(*types2.Interface)) {
base.ErrorfAt(m.makeXPos(n.Pos()), errors.InvalidTypeCycle, "invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)")

for typ := range f.cyclic {
f.cyclic[typ] = false // suppress duplicate errors
}
// TODO(gri) move this code into the type checkers (types2 and go/types)
var f cycleFinder
for _, file := range files {
syntax.Inspect(file, func(n syntax.Node) bool {
if n, ok := n.(*syntax.InterfaceType); ok {
if f.hasCycle(n.GetTypeInfo().Type.(*types2.Interface)) {
base.ErrorfAt(m.makeXPos(n.Pos()), errors.InvalidTypeCycle, "invalid recursive type: anonymous interface refers to itself (see https://go.dev/issue/56103)")

for typ := range f.cyclic {
f.cyclic[typ] = false // suppress duplicate errors
}
return false
}
return true
})
}
return false
}
return true
})
}
base.ExitIfErrors()

Expand Down
1 change: 1 addition & 0 deletions src/cmd/compile/internal/types2/stdlib_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ func TestStdFixed(t *testing.T) {

testTestDir(t, filepath.Join(testenv.GOROOT(t), "test", "fixedbugs"),
"bug248.go", "bug302.go", "bug369.go", // complex test instructions - ignore
"bug398.go", // types2 doesn't check for anonymous interface cycles (go.dev/issue/56103)
"issue6889.go", // gc-specific test
"issue11362.go", // canonical import path check
"issue16369.go", // types2 handles this correctly - not an issue
Expand Down
1 change: 1 addition & 0 deletions src/go/types/stdlib_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ func TestStdFixed(t *testing.T) {

testTestDir(t, filepath.Join(testenv.GOROOT(t), "test", "fixedbugs"),
"bug248.go", "bug302.go", "bug369.go", // complex test instructions - ignore
"bug398.go", // go/types doesn't check for anonymous interface cycles (go.dev/issue/56103)
"issue6889.go", // gc-specific test
"issue11362.go", // canonical import path check
"issue16369.go", // go/types handles this correctly - not an issue
Expand Down
10 changes: 5 additions & 5 deletions test/fixedbugs/bug398.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// compile -d=interfacecycles
// errorcheck

// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
Expand All @@ -11,11 +11,11 @@ package p

// exported interfaces

type I1 interface {
type I1 interface { // ERROR "invalid recursive type: anonymous interface refers to itself"
F() interface{I1}
}

type I2 interface {
type I2 interface { // ERROR "invalid recursive type: anonymous interface refers to itself"
F() interface{I2}
}

Expand All @@ -28,11 +28,11 @@ func F() bool {

// non-exported interfaces

type i1 interface {
type i1 interface { // ERROR "invalid recursive type: anonymous interface refers to itself"
F() interface{i1}
}

type i2 interface {
type i2 interface { // ERROR "invalid recursive type: anonymous interface refers to itself"
F() interface{i2}
}

Expand Down
4 changes: 2 additions & 2 deletions test/fixedbugs/issue16369.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// compile -d=interfacecycles
// errorcheck

// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package p

type T interface {
type T interface { // ERROR "invalid recursive type: anonymous interface refers to itself"
M(interface {
T
})
Expand Down

0 comments on commit e628d1e

Please sign in to comment.