]> Cypherpunks repositories - gostls13.git/commitdiff
math/big: call norm when returning success from Rat SetString
authorShulhan <m.shulhan@gmail.com>
Tue, 16 Nov 2021 18:36:15 +0000 (01:36 +0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 31 Mar 2022 05:26:15 +0000 (05:26 +0000)
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>

src/math/big/ratconv.go
src/math/big/ratconv_test.go

index 90053a9c81d3b8c0fd697b4937d001a193344c93..dadd4d7b8ee9e9d4e001089bacf9daec09003b94 100644 (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
 
index e55e655718984abe1957cf3f521c602ca9393b11..45a35608f4b87483eafde59b8a2ff61a868f2dda 100644 (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 {