]> Cypherpunks repositories - gostls13.git/commitdiff
fmt: undo clearflags in catchPanic after error message has been printed
authorMartin Möhrmann <moehrmann@google.com>
Sun, 11 Dec 2016 11:55:17 +0000 (12:55 +0100)
committerRob Pike <r@golang.org>
Sun, 11 Dec 2016 21:59:59 +0000 (21:59 +0000)
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: Rob Pike <r@golang.org>
src/fmt/fmt_test.go
src/fmt/print.go

index 6f8c1550a09153e8f46749f5288541d7b2e55395..b7089be1a1b1adc9ce97f69be39650a7c5439953 100644 (file)
@@ -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 PanicString() 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)"},
index a95edacc993afe00ec4acf106aaa76319551f957..a7ef2e5ac210728da99aa51872744f81979d85cb 100644 (file)
@@ -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
        }
 }