]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1] fmt: set p.field before nil check
authorRob Pike <r@golang.org>
Fri, 21 Sep 2012 19:53:51 +0000 (05:53 +1000)
committerRob Pike <r@golang.org>
Fri, 21 Sep 2012 19:53:51 +0000 (05:53 +1000)
««« backport 5f13e0662e38
fmt: set p.field before nil check
Fixes #3752.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6331062

»»»

src/pkg/fmt/fmt_test.go
src/pkg/fmt/print.go

index de0342967cc36ae4e12c62d245526ad43105fc8f..8e1984b4a62db1f5716ac4149f4aab8ccad2ad51 100644 (file)
@@ -842,3 +842,15 @@ func TestIsSpace(t *testing.T) {
                }
        }
 }
+
+func TestNilDoesNotBecomeTyped(t *testing.T) {
+       type A struct{}
+       type B struct{}
+       var a *A = nil
+       var b B = B{}
+       got := Sprintf("%s %s %s %s %s", nil, a, nil, b, nil)
+       const expect = "%!s(<nil>) %!s(*fmt_test.A=<nil>) %!s(<nil>) {} %!s(<nil>)"
+       if got != expect {
+               t.Errorf("expected:\n\t%q\ngot:\n\t%q", expect, got)
+       }
+}
index 13438243cdddc75fd52a9b7eed8f94bc7596ccc1..f29e8c8e9f138bd033025ed7347695120ed7e518 100644 (file)
@@ -712,6 +712,9 @@ func (p *pp) handleMethods(verb rune, plus, goSyntax bool, depth int) (wasString
 }
 
 func (p *pp) printField(field interface{}, verb rune, plus, goSyntax bool, depth int) (wasString bool) {
+       p.field = field
+       p.value = reflect.Value{}
+
        if field == nil {
                if verb == 'T' || verb == 'v' {
                        p.buf.Write(nilAngleBytes)
@@ -721,8 +724,6 @@ func (p *pp) printField(field interface{}, verb rune, plus, goSyntax bool, depth
                return false
        }
 
-       p.field = field
-       p.value = reflect.Value{}
        // Special processing considerations.
        // %T (the value's type) and %p (its address) are special; we always do them first.
        switch verb {