From 77eff30ec0bc63df61ea742bb8278f92e2c133dc Mon Sep 17 00:00:00 2001 From: Robert Findley Date: Wed, 2 Feb 2022 13:47:31 -0500 Subject: [PATCH] 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 Run-TryBot: Robert Findley Reviewed-by: Robert Griesemer TryBot-Result: Gopher Robot --- src/cmd/compile/internal/types2/unify.go | 14 ++++++++++---- src/go/types/unify.go | 14 ++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/cmd/compile/internal/types2/unify.go b/src/cmd/compile/internal/types2/unify.go index 13d5af671ed..079db3276c4 100644 --- a/src/cmd/compile/internal/types2/unify.go +++ b/src/cmd/compile/internal/types2/unify.go @@ -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 diff --git a/src/go/types/unify.go b/src/go/types/unify.go index 5d6d78bff04..be2037ca814 100644 --- a/src/go/types/unify.go +++ b/src/go/types/unify.go @@ -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