Commit cbcc1db4 authored by Martin Möhrmann's avatar Martin Möhrmann Committed by Rob Pike

fmt: undo clearflags in catchPanic after error message has been printed

Fixes #18282

Change-Id: I024ca4a03bbbcccd48a0a6245bc3ec22c6a90288
Reviewed-on: https://go-review.googlesource.com/34254
TryBot-Result: Gobot Gobot <gobot@golang.org>
Run-TryBot: Martin Möhrmann <moehrmann@google.com>
Reviewed-by: default avatarRob Pike <r@golang.org>
parent ab5a2173
...@@ -1561,18 +1561,23 @@ func TestWidthAndPrecision(t *testing.T) { ...@@ -1561,18 +1561,23 @@ func TestWidthAndPrecision(t *testing.T) {
} }
} }
// Panic is a type that panics in String. // PanicS is a type that panics in String.
type Panic struct { type PanicS struct {
message interface{} message interface{}
} }
// Value receiver. // Value receiver.
func (p Panic) GoString() string { func (p PanicS) String() string {
panic(p.message) panic(p.message)
} }
// PanicGo is a type that panics in GoString.
type PanicGo struct {
message interface{}
}
// Value receiver. // Value receiver.
func (p Panic) String() string { func (p PanicGo) GoString() string {
panic(p.message) panic(p.message)
} }
...@@ -1592,13 +1597,15 @@ var panictests = []struct { ...@@ -1592,13 +1597,15 @@ var panictests = []struct {
out string out string
}{ }{
// String // String
{"%s", (*Panic)(nil), "<nil>"}, // nil pointer special case {"%s", (*PanicS)(nil), "<nil>"}, // nil pointer special case
{"%s", Panic{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"}, {"%s", PanicS{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
{"%s", Panic{3}, "%!s(PANIC=3)"}, {"%s", PanicS{3}, "%!s(PANIC=3)"},
// GoString // GoString
{"%#v", (*Panic)(nil), "<nil>"}, // nil pointer special case {"%#v", (*PanicGo)(nil), "<nil>"}, // nil pointer special case
{"%#v", Panic{io.ErrUnexpectedEOF}, "%!v(PANIC=unexpected EOF)"}, {"%#v", PanicGo{io.ErrUnexpectedEOF}, "%!v(PANIC=unexpected EOF)"},
{"%#v", Panic{3}, "%!v(PANIC=3)"}, {"%#v", PanicGo{3}, "%!v(PANIC=3)"},
// Issue 18282. catchPanic should not clear fmtFlags permanently.
{"%#v", []interface{}{PanicGo{3}, PanicGo{3}}, "[]interface {}{%!v(PANIC=3), %!v(PANIC=3)}"},
// Format // Format
{"%s", (*PanicF)(nil), "<nil>"}, // nil pointer special case {"%s", (*PanicF)(nil), "<nil>"}, // nil pointer special case
{"%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"}, {"%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
......
...@@ -535,7 +535,11 @@ func (p *pp) catchPanic(arg interface{}, verb rune) { ...@@ -535,7 +535,11 @@ func (p *pp) catchPanic(arg interface{}, verb rune) {
// Nested panics; the recursion in printArg cannot succeed. // Nested panics; the recursion in printArg cannot succeed.
panic(err) panic(err)
} }
p.fmt.clearflags() // We are done, and for this output we want default behavior.
oldFlags := p.fmt.fmtFlags
// For this output we want default behavior.
p.fmt.clearflags()
p.buf.WriteString(percentBangString) p.buf.WriteString(percentBangString)
p.buf.WriteRune(verb) p.buf.WriteRune(verb)
p.buf.WriteString(panicString) p.buf.WriteString(panicString)
...@@ -543,6 +547,8 @@ func (p *pp) catchPanic(arg interface{}, verb rune) { ...@@ -543,6 +547,8 @@ func (p *pp) catchPanic(arg interface{}, verb rune) {
p.printArg(err, 'v') p.printArg(err, 'v')
p.panicking = false p.panicking = false
p.buf.WriteByte(')') p.buf.WriteByte(')')
p.fmt.fmtFlags = oldFlags
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment