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: 's avatarRob Pike <r@golang.org>
parent ab5a2173
......@@ -1561,18 +1561,23 @@ func TestWidthAndPrecision(t *testing.T) {
}
}
// Panic is a type that panics in String.
type Panic struct {
// PanicS is a type that panics in String.
type PanicS struct {
message interface{}
}
// Value receiver.
func (p Panic) GoString() string {
func (p PanicS) String() string {
panic(p.message)
}
// PanicGo is a type that panics in GoString.
type PanicGo struct {
message interface{}
}
// Value receiver.
func (p Panic) String() string {
func (p PanicGo) GoString() string {
panic(p.message)
}
......@@ -1592,13 +1597,15 @@ var panictests = []struct {
out string
}{
// String
{"%s", (*Panic)(nil), "<nil>"}, // nil pointer special case
{"%s", Panic{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
{"%s", Panic{3}, "%!s(PANIC=3)"},
{"%s", (*PanicS)(nil), "<nil>"}, // nil pointer special case
{"%s", PanicS{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
{"%s", PanicS{3}, "%!s(PANIC=3)"},
// GoString
{"%#v", (*Panic)(nil), "<nil>"}, // nil pointer special case
{"%#v", Panic{io.ErrUnexpectedEOF}, "%!v(PANIC=unexpected EOF)"},
{"%#v", Panic{3}, "%!v(PANIC=3)"},
{"%#v", (*PanicGo)(nil), "<nil>"}, // nil pointer special case
{"%#v", PanicGo{io.ErrUnexpectedEOF}, "%!v(PANIC=unexpected EOF)"},
{"%#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
{"%s", (*PanicF)(nil), "<nil>"}, // nil pointer special case
{"%s", PanicF{io.ErrUnexpectedEOF}, "%!s(PANIC=unexpected EOF)"},
......
......@@ -535,7 +535,11 @@ func (p *pp) catchPanic(arg interface{}, verb rune) {
// Nested panics; the recursion in printArg cannot succeed.
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.WriteRune(verb)
p.buf.WriteString(panicString)
......@@ -543,6 +547,8 @@ func (p *pp) catchPanic(arg interface{}, verb rune) {
p.printArg(err, 'v')
p.panicking = false
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