From a18b4b3fb9b1b98f6eefa038b723f99fd6d13efd Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Fri, 11 Nov 2016 20:54:07 +0000 Subject: [PATCH] time: don't panic stringifying the zero Month Fixes #17720 Change-Id: Ib95c230deef3934db729856c17908f8e5a1e2b7f Reviewed-on: https://go-review.googlesource.com/33145 Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor Reviewed-by: Rob Pike --- src/time/time.go | 13 ++++++++++++- src/time/time_test.go | 11 +++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/time/time.go b/src/time/time.go index 03fde335c7..175c9a9ae6 100644 --- a/src/time/time.go +++ b/src/time/time.go @@ -114,7 +114,18 @@ var months = [...]string{ } // String returns the English name of the month ("January", "February", ...). -func (m Month) String() string { return months[m-1] } +func (m Month) String() string { + if January <= m && m <= December { + return months[m-1] + } + const prefix = "%!Month(" + buf := make([]byte, 20+len(prefix)+1) + buf[len(buf)-1] = ')' + n := fmtInt(buf[:len(buf)-1], uint64(m)) + n -= len(prefix) + copy(buf[n:], prefix) + return string(buf[n:]) +} // A Weekday specifies a day of the week (Sunday = 0, ...). type Weekday int diff --git a/src/time/time_test.go b/src/time/time_test.go index 0af9da34a2..07afcffc21 100644 --- a/src/time/time_test.go +++ b/src/time/time_test.go @@ -1117,8 +1117,8 @@ var defaultLocTests = []struct { {"Truncate", func(t1, t2 Time) bool { return t1.Truncate(Hour).Equal(t2.Truncate(Hour)) }}, {"Round", func(t1, t2 Time) bool { return t1.Round(Hour).Equal(t2.Round(Hour)) }}, - - {"== Time{}", func(t1, t2 Time) bool { return (t1==Time{}) == (t2==Time{}) }}, + + {"== Time{}", func(t1, t2 Time) bool { return (t1 == Time{}) == (t2 == Time{}) }}, } func TestDefaultLoc(t *testing.T) { @@ -1230,3 +1230,10 @@ func TestMarshalBinaryZeroTime(t *testing.T) { t.Errorf("t0=%#v\nt1=%#v\nwant identical structures", t0, t1) } } + +// Issue 17720: Zero value of time.Month fails to print +func TestZeroMonthString(t *testing.T) { + if got, want := Month(0).String(), "%!Month(0)"; got != want { + t.Errorf("zero month = %q; want %q", got, want) + } +}