xerrors: fix crash in As Analogous change to CL 168598 Fixes golang/go#30970. Change-Id: I1810418a9d7cf92a35ca0f4a6d1b2bad560ab671 Reviewed-on: https://go-review.googlesource.com/c/xerrors/+/170960 Reviewed-by: Damien Neil <dneil@google.com> Run-TryBot: Marcel van Lohuizen <mpvl@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/wrap.go b/wrap.go index a33459d..ebfe244 100644 --- a/wrap.go +++ b/wrap.go
@@ -88,7 +88,7 @@ panic("errors: *target must be interface or implement error") } targetType := typ.Elem() - for { + for err != nil { if reflect.TypeOf(err).AssignableTo(targetType) { val.Elem().Set(reflect.ValueOf(err)) return true @@ -96,10 +96,9 @@ if x, ok := err.(interface{ As(interface{}) bool }); ok && x.As(target) { return true } - if err = Unwrap(err); err == nil { - return false - } + err = Unwrap(err) } + return false } var errorType = reflect.TypeOf((*error)(nil)).Elem()
diff --git a/wrap_test.go b/wrap_test.go index d08c325..1aec966 100644 --- a/wrap_test.go +++ b/wrap_test.go
@@ -30,6 +30,7 @@ match bool }{ {nil, nil, true}, + {nil, err1, false}, {err1, nil, false}, {err1, err1, true}, {erra, err1, true}, @@ -89,6 +90,10 @@ target interface{} match bool }{{ + nil, + &errP, + false, + }, { xerrors.Errorf("pittied the fool: %w", errorT{}), &errT, true,