1
0
mirror of https://github.com/golang/go synced 2024-09-29 02:24:33 -06:00

go/types, types2: add a const to control recursion panics in unification

Add a panicAtUnificationDepthLimit const to replace the use of the debug
const to control whether to panic when the unification recursion depth
is reached. Our tests should pass when debug==true.

Change-Id: I58847f49d66010bd4ca01c0408ec10acac95cba6
Reviewed-on: https://go-review.googlesource.com/c/go/+/382534
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Robert Findley 2022-02-02 13:47:31 -05:00
parent edbe4742a2
commit 77eff30ec0
2 changed files with 20 additions and 8 deletions

View File

@ -33,9 +33,15 @@ import (
// by setting up one of them (using init) and then assigning its value
// to the other.
// Upper limit for recursion depth. Used to catch infinite recursions
// due to implementation issues (e.g., see issues #48619, #48656).
const unificationDepthLimit = 50
const (
// Upper limit for recursion depth. Used to catch infinite recursions
// due to implementation issues (e.g., see issues #48619, #48656).
unificationDepthLimit = 50
// Whether to panic when unificationDepthLimit is reached. Turn on when
// investigating infinite recursion.
panicAtUnificationDepthLimit = false
)
// A unifier maintains the current type parameters for x and y
// and the respective types inferred for each type parameter.
@ -244,7 +250,7 @@ func (u *unifier) nifyEq(x, y Type, p *ifacePair) bool {
func (u *unifier) nify(x, y Type, p *ifacePair) bool {
// Stop gap for cases where unification fails.
if u.depth >= unificationDepthLimit {
if debug {
if panicAtUnificationDepthLimit {
panic("unification reached recursion depth limit")
}
return false

View File

@ -33,9 +33,15 @@ import (
// by setting up one of them (using init) and then assigning its value
// to the other.
// Upper limit for recursion depth. Used to catch infinite recursions
// due to implementation issues (e.g., see issues #48619, #48656).
const unificationDepthLimit = 50
const (
// Upper limit for recursion depth. Used to catch infinite recursions
// due to implementation issues (e.g., see issues #48619, #48656).
unificationDepthLimit = 50
// Whether to panic when unificationDepthLimit is reached. Turn on when
// investigating infinite recursion.
panicAtUnificationDepthLimit = false
)
// A unifier maintains the current type parameters for x and y
// and the respective types inferred for each type parameter.
@ -244,7 +250,7 @@ func (u *unifier) nifyEq(x, y Type, p *ifacePair) bool {
func (u *unifier) nify(x, y Type, p *ifacePair) bool {
// Stop gap for cases where unification fails.
if u.depth >= unificationDepthLimit {
if debug {
if panicAtUnificationDepthLimit {
panic("unification reached recursion depth limit")
}
return false