From: Rob Pike Date: Fri, 21 Sep 2012 19:53:51 +0000 (+1000) Subject: [release-branch.go1] fmt: set p.field before nil check X-Git-Tag: go1.0.3~185 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=ba76560a34d56b644ddcf3f17bbad0b1d7dba1d5;p=gostls13.git [release-branch.go1] fmt: set p.field before nil check ««« backport 5f13e0662e38 fmt: set p.field before nil check Fixes #3752. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/6331062 »»» --- diff --git a/src/pkg/fmt/fmt_test.go b/src/pkg/fmt/fmt_test.go index de0342967c..8e1984b4a6 100644 --- a/src/pkg/fmt/fmt_test.go +++ b/src/pkg/fmt/fmt_test.go @@ -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() %!s(*fmt_test.A=) %!s() {} %!s()" + if got != expect { + t.Errorf("expected:\n\t%q\ngot:\n\t%q", expect, got) + } +} diff --git a/src/pkg/fmt/print.go b/src/pkg/fmt/print.go index 13438243cd..f29e8c8e9f 100644 --- a/src/pkg/fmt/print.go +++ b/src/pkg/fmt/print.go @@ -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 {