1
0
mirror of https://github.com/golang/go synced 2024-11-17 04:14:52 -07:00

math/big: call norm when returning success from Rat SetString

After CL 24430, reflect.DeepEqual no longer returns true when comparing
a *Rat built with (*Rat).SetString("0") with one built with
(*Rat).SetInt64(0).
These should be equivalent, but because (*Rat).SetString does not call
norm() when returning the zero value, the result of reflect.DeepEqual
will be false.

One could suggest that developers should use (*Rat).Cmp instead
of relying on reflect.DeepEqual, but if a (*Rat) is part of a
larger struct that is being compared, this can be cumbersome.

This is fixed by calling z.norm() when returning zero in SetString.

Fixes #50944

Change-Id: Ib84ae975bf82fe02d1203aa9668a01960c0fd59d
Reviewed-on: https://go-review.googlesource.com/c/go/+/364434
Reviewed-by: Katie Hockman <katie@golang.org>
Trust: Katie Hockman <katie@golang.org>
Trust: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
Shulhan 2021-11-17 01:36:15 +07:00 committed by Ian Lance Taylor
parent cc46cac3bc
commit a80070e0cf
2 changed files with 10 additions and 1 deletions

View File

@ -113,7 +113,7 @@ func (z *Rat) SetString(s string) (*Rat, bool) {
// special-case 0 (see also issue #16176)
if len(z.a.abs) == 0 {
return z, true
return z.norm(), true
}
// len(z.a.abs) > 0

View File

@ -9,6 +9,7 @@ import (
"fmt"
"io"
"math"
"reflect"
"strconv"
"strings"
"testing"
@ -205,6 +206,14 @@ func TestRatSetString(t *testing.T) {
}
}
func TestRatSetStringZero(t *testing.T) {
got, _ := new(Rat).SetString("0")
want := new(Rat).SetInt64(0)
if !reflect.DeepEqual(got, want) {
t.Errorf("got %#+v, want %#+v", got, want)
}
}
func TestRatScan(t *testing.T) {
var buf bytes.Buffer
for i, test := range setStringTests {