]> Cypherpunks repositories - gostls13.git/commitdiff
text/template: fix type bug in eq
authorRuss Cox <rsc@golang.org>
Thu, 6 May 2021 01:13:24 +0000 (21:13 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 6 May 2021 13:39:39 +0000 (13:39 +0000)
{{eq .x 0}} where .x is a nil interface{} should be false, not a type error.

Similarly, {{eq .x .x}} should succeed, not panic in reflect.

Fixes #45982.

Change-Id: I90aba82bb2f1a9e162bde1290c94f5028f56f412
Reviewed-on: https://go-review.googlesource.com/c/go/+/317470
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Rob Pike <r@golang.org>
src/text/template/exec_test.go
src/text/template/funcs.go

index e73fce4fa80edfb46e405cc1843297a3d9ed51f4..ef521645a7f5d5b71c30ddee90362448971ed561 100644 (file)
@@ -1201,8 +1201,11 @@ var cmpTests = []cmpTest{
        {"eq .Ptr .NilPtr", "false", true},
        {"eq .NilPtr .NilPtr", "true", true},
        {"eq .Iface1 .Iface1", "true", true},
-       {"eq .Iface1 .Iface2", "false", true},
-       {"eq .Iface2 .Iface2", "true", true},
+       {"eq .Iface1 .NilIface", "false", true},
+       {"eq .NilIface .NilIface", "true", true},
+       {"eq .NilIface .Iface1", "false", true},
+       {"eq .NilIface 0", "false", true},
+       {"eq 0 .NilIface", "false", true},
        // Errors
        {"eq `xy` 1", "", false},       // Different types.
        {"eq 2 2.0", "", false},        // Different types.
@@ -1217,12 +1220,12 @@ var cmpTests = []cmpTest{
 func TestComparison(t *testing.T) {
        b := new(bytes.Buffer)
        var cmpStruct = struct {
-               Uthree, Ufour  uint
-               NegOne, Three  int
-               Ptr, NilPtr    *int
-               Map            map[int]int
-               V1, V2         V
-               Iface1, Iface2 fmt.Stringer
+               Uthree, Ufour    uint
+               NegOne, Three    int
+               Ptr, NilPtr      *int
+               Map              map[int]int
+               V1, V2           V
+               Iface1, NilIface fmt.Stringer
        }{
                Uthree: 3,
                Ufour:  4,
index 9dd332c06800f2b25460ebc87744e849730d0d5c..fff833ed29813e21f8826914acf20b1e038ddf7b 100644 (file)
@@ -478,7 +478,9 @@ func eq(arg1 reflect.Value, arg2 ...reflect.Value) (bool, error) {
                        case k1 == uintKind && k2 == intKind:
                                truth = arg.Int() >= 0 && arg1.Uint() == uint64(arg.Int())
                        default:
-                               return false, errBadComparison
+                               if arg1 != zero && arg != zero {
+                                       return false, errBadComparison
+                               }
                        }
                } else {
                        switch k1 {
@@ -495,7 +497,7 @@ func eq(arg1 reflect.Value, arg2 ...reflect.Value) (bool, error) {
                        case uintKind:
                                truth = arg1.Uint() == arg.Uint()
                        default:
-                               if arg == zero {
+                               if arg == zero || arg1 == zero {
                                        truth = arg1 == arg
                                } else {
                                        if t2 := arg.Type(); !t2.Comparable() {