]> Cypherpunks repositories - gostls13.git/commitdiff
fmt: set p.field before nil check
authorRob Pike <r@golang.org>
Mon, 25 Jun 2012 23:48:20 +0000 (16:48 -0700)
committerRob Pike <r@golang.org>
Mon, 25 Jun 2012 23:48:20 +0000 (16:48 -0700)
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 e7a5bd82aa8f71379ce8f2ba844dd27f55c6f623..bce859581f0df724f519e608deed1b5f645cbed1 100644 (file)
@@ -851,3 +851,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 5007de2e39e17468858add4c57ce6e65d40e0373..8691004eca83d5ce0ce7bb1c485dd5494719d0eb 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 {