From 1f90d081391d4f5911960fd28d81d7ea5e554a8f Mon Sep 17 00:00:00 2001 From: Marcel van Lohuizen Date: Wed, 13 Mar 2019 16:25:02 +0100 Subject: fmt: make type of fmt.Errorf the same as that of errors.New This applies only for cases where %w is not used. The purpose of this change is to reduce test failures where tests depend on these two being the same type, as they previously were. Change-Id: I2dd28b93fe1d59f3cfbb4eb0875d1fb8ee699746 Reviewed-on: https://go-review.googlesource.com/c/go/+/167402 Run-TryBot: Marcel van Lohuizen TryBot-Result: Gobot Gobot Reviewed-by: Damien Neil --- src/errors/errors.go | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'src/errors/errors.go') diff --git a/src/errors/errors.go b/src/errors/errors.go index ebb136cdd4..51175b13c8 100644 --- a/src/errors/errors.go +++ b/src/errors/errors.go @@ -5,7 +5,10 @@ // Package errors implements functions to manipulate errors. package errors -import "runtime" +import ( + "internal/errinternal" + "runtime" +) // New returns an error that formats as the given text. // @@ -15,21 +18,33 @@ func New(text string) error { // Inline call to errors.Callers to improve performance. var s Frame runtime.Callers(2, s.frames[:]) - return &errorString{text, s} + return &errorString{text, nil, s} +} + +func init() { + errinternal.NewError = func(text string, err error) error { + var s Frame + runtime.Callers(3, s.frames[:]) + return &errorString{text, err, s} + } } // errorString is a trivial implementation of error. type errorString struct { s string + err error frame Frame } func (e *errorString) Error() string { + if e.err != nil { + return e.s + ": " + e.err.Error() + } return e.s } func (e *errorString) FormatError(p Printer) (next error) { p.Print(e.s) e.frame.Format(p) - return nil + return e.err } -- cgit v1.3