mirror of
https://github.com/golang/go
synced 2024-11-17 05:54:46 -07:00
go/types,types2: disallow illegal cycles through Unions
Checker.validType was not considering Unions when looking for illegal cycles. Fixes #48582 Change-Id: I11ad0279eeaaa56bb6d5731b0572c1c3a0c459eb Reviewed-on: https://go-review.googlesource.com/c/go/+/351829 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>
This commit is contained in:
parent
5961134fa5
commit
13f3c57cef
@ -315,6 +315,13 @@ func (check *Checker) validType(typ Type, path []Object) typeInfo {
|
||||
}
|
||||
}
|
||||
|
||||
case *Union:
|
||||
for _, t := range t.terms {
|
||||
if check.validType(t.typ, path) == invalid {
|
||||
return invalid
|
||||
}
|
||||
}
|
||||
|
||||
case *Interface:
|
||||
for _, etyp := range t.embeddeds {
|
||||
if check.validType(etyp, path) == invalid {
|
||||
|
@ -6,7 +6,7 @@ package p
|
||||
|
||||
// Test case from issue.
|
||||
|
||||
type Nat interface {
|
||||
type Nat /* ERROR cycle */ interface {
|
||||
Zero|Succ
|
||||
}
|
||||
|
||||
|
29
src/cmd/compile/internal/types2/testdata/fixedbugs/issue48582.go2
vendored
Normal file
29
src/cmd/compile/internal/types2/testdata/fixedbugs/issue48582.go2
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright 2021 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 N /* ERROR cycle */ interface {
|
||||
int | N
|
||||
}
|
||||
|
||||
type A /* ERROR cycle */ interface {
|
||||
int | B
|
||||
}
|
||||
|
||||
type B interface {
|
||||
int | A
|
||||
}
|
||||
|
||||
type S /* ERROR cycle */ struct {
|
||||
I // ERROR interface contains type constraints
|
||||
}
|
||||
|
||||
type I interface {
|
||||
int | S
|
||||
}
|
||||
|
||||
type P interface {
|
||||
*P // ERROR interface contains type constraints
|
||||
}
|
@ -314,6 +314,13 @@ func (check *Checker) validType(typ Type, path []Object) typeInfo {
|
||||
}
|
||||
}
|
||||
|
||||
case *Union:
|
||||
for _, t := range t.terms {
|
||||
if check.validType(t.typ, path) == invalid {
|
||||
return invalid
|
||||
}
|
||||
}
|
||||
|
||||
case *Interface:
|
||||
for _, etyp := range t.embeddeds {
|
||||
if check.validType(etyp, path) == invalid {
|
||||
|
@ -6,13 +6,13 @@ package p
|
||||
|
||||
// Test case from issue.
|
||||
|
||||
type Nat interface {
|
||||
type Nat /* ERROR cycle */ interface {
|
||||
Zero|Succ
|
||||
}
|
||||
|
||||
type Zero struct{}
|
||||
type Succ struct{
|
||||
Nat // ERROR interface contains type constraints
|
||||
Nat /* ERROR interface contains type constraints */
|
||||
}
|
||||
|
||||
// Struct tests.
|
||||
|
29
src/go/types/testdata/fixedbugs/issue48582.go2
vendored
Normal file
29
src/go/types/testdata/fixedbugs/issue48582.go2
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
// Copyright 2021 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 N /* ERROR cycle */ interface {
|
||||
int | N
|
||||
}
|
||||
|
||||
type A /* ERROR cycle */ interface {
|
||||
int | B
|
||||
}
|
||||
|
||||
type B interface {
|
||||
int | A
|
||||
}
|
||||
|
||||
type S /* ERROR cycle */ struct {
|
||||
I // ERROR interface contains type constraints
|
||||
}
|
||||
|
||||
type I interface {
|
||||
int | S
|
||||
}
|
||||
|
||||
type P interface {
|
||||
*P // ERROR interface contains type constraints
|
||||
}
|
Loading…
Reference in New Issue
Block a user