]> Cypherpunks repositories - gostls13.git/commitdiff
fmt: clear flags before printing extra argument errors
authorMartin Möhrmann <martisch@uos.de>
Fri, 11 Mar 2016 07:10:55 +0000 (08:10 +0100)
committerRob Pike <r@golang.org>
Wed, 16 Mar 2016 03:46:24 +0000 (03:46 +0000)
Do a reset of the fmt flags before printing the extra argument
error message to prevent a malformed printing of extra arguments.

Regroup tests for extra argument error strings.

Change-Id: Ifd97f5ca36f6c97ed5a380d975cf154d17997d3f
Reviewed-on: https://go-review.googlesource.com/20571
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
src/fmt/fmt_test.go
src/fmt/print.go

index 16f0aabcd2abb5fb0e577854df7b77fa05ce7157..8ff53cf48705a424a9dd74e8f2b4a12740ba5f65 100644 (file)
@@ -426,10 +426,6 @@ var fmtTests = []struct {
        {"%-08g", complex(negInf, negInf), "(-Inf    -Inf    i)"},
        {"%-08G", complex(NaN, NaN), "(NaN     +NaN    i)"},
 
-       // erroneous formats
-       {"", 2, "%!(EXTRA int=2)"},
-       {"%d", "hello", "%!d(string=hello)"},
-
        // old test/fmt_test.go
        {"%d", 1234, "1234"},
        {"%d", -1234, "-1234"},
@@ -774,15 +770,15 @@ var fmtTests = []struct {
        {"%d", time.Time{}.Month(), "1"},
 
        // erroneous things
+       {"", nil, "%!(EXTRA <nil>)"},
+       {"", 2, "%!(EXTRA int=2)"},
+       {"no args", "hello", "no args%!(EXTRA string=hello)"},
        {"%s %", "hello", "hello %!(NOVERB)"},
        {"%s %.2", "hello", "hello %!(NOVERB)"},
-       {"%d", "hello", "%!d(string=hello)"},
-       {"no args", "hello", "no args%!(EXTRA string=hello)"},
-       {"%s", nil, "%!s(<nil>)"},
-       {"%T", nil, "<nil>"},
-       {"%-1", 100, "%!(NOVERB)%!(EXTRA int=100)"},
        {"%017091901790959340919092959340919017929593813360", 0, "%!(NOVERB)%!(EXTRA int=0)"},
        {"%184467440737095516170v", 0, "%!(NOVERB)%!(EXTRA int=0)"},
+       // Extra argument errors should format without flags set.
+       {"%010.2", "12345", "%!(NOVERB)%!(EXTRA string=12345)"},
 
        // The "<nil>" show up because maps are printed by
        // first obtaining a list of keys and then looking up
@@ -973,6 +969,7 @@ var fmtTests = []struct {
        {"%☠", []uint8{0}, "%!☠([]uint8=[0])"},
        {"%☠", [1]byte{0}, "%!☠([1]uint8=[0])"},
        {"%☠", [1]uint8{0}, "%!☠([1]uint8=[0])"},
+       {"%☠", "hello", "%!☠(string=hello)"},
        {"%☠", 1.2345678, "%!☠(float64=1.2345678)"},
        {"%☠", float32(1.2345678), "%!☠(float32=1.2345678)"},
        {"%☠", 1.2345678 + 1.2345678i, "%!☠(complex128=(1.2345678+1.2345678i))"},
index 460712cfe98aaceda397f62b90978dcd53f05036..e9876913b04a0a7c6f778eeef27742706bf7fd3b 100644 (file)
@@ -1164,8 +1164,6 @@ func (p *pp) doPrintf(format string, a []interface{}) {
                        p.buf.WriteString(missingString)
                        continue
                }
-               arg := a[argNum]
-               argNum++
 
                if c == 'v' {
                        if p.fmt.sharp {
@@ -1185,23 +1183,26 @@ func (p *pp) doPrintf(format string, a []interface{}) {
                        p.fmt.zero = false
                }
 
-               p.printArg(arg, c, 0)
+               p.printArg(a[argNum], c, 0)
+               argNum++
        }
 
        // Check for extra arguments unless the call accessed the arguments
        // out of order, in which case it's too expensive to detect if they've all
        // been used and arguably OK if they're not.
        if !p.reordered && argNum < len(a) {
+               p.fmt.clearflags()
                p.buf.WriteString(extraString)
-               for ; argNum < len(a); argNum++ {
-                       arg := a[argNum]
-                       if arg != nil {
+               for i, arg := range a[argNum:] {
+                       if i > 0 {
+                               p.buf.WriteString(commaSpaceString)
+                       }
+                       if arg == nil {
+                               p.buf.WriteString(nilAngleString)
+                       } else {
                                p.buf.WriteString(reflect.TypeOf(arg).String())
                                p.buf.WriteByte('=')
-                       }
-                       p.printArg(arg, 'v', 0)
-                       if argNum+1 < len(a) {
-                               p.buf.WriteString(commaSpaceString)
+                               p.printArg(arg, 'v', 0)
                        }
                }
                p.buf.WriteByte(')')