]> Cypherpunks.ru repositories - gostls13.git/commitdiff
go/types, types2: add a const to control recursion panics in unification
authorRobert Findley <rfindley@google.com>
Wed, 2 Feb 2022 18:47:31 +0000 (13:47 -0500)
committerRobert Findley <rfindley@google.com>
Wed, 2 Feb 2022 19:37:44 +0000 (19:37 +0000)
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>

src/cmd/compile/internal/types2/unify.go
src/go/types/unify.go

index 13d5af671ed1c8a857ec99729cd90d47e0c5c5b7..079db3276c471c680d1daf2f5b7dc6b565f7128b 100644 (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
index 5d6d78bff042edda09c6c5c4ec1ba3be2c02d4aa..be2037ca814575bab53dca924cd445cd0507f326 100644 (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