Skip to content

Commit

Permalink
Drop hacks to work around Go reflection bugs in Go1.9 (#282)
Browse files Browse the repository at this point in the history
Now that Go 1.11 is the minimally supported version,
we can drop some local hacks to work around bugs in
reflect that were present in Go1.9.
  • Loading branch information
dsnet authored Dec 7, 2021
1 parent f59cd61 commit 3242228
Show file tree
Hide file tree
Showing 4 changed files with 2 additions and 49 deletions.
17 changes: 0 additions & 17 deletions cmp/compare.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ import (
"strings"

"github.com/google/go-cmp/cmp/internal/diff"
"github.com/google/go-cmp/cmp/internal/flags"
"github.com/google/go-cmp/cmp/internal/function"
"github.com/google/go-cmp/cmp/internal/value"
)
Expand Down Expand Up @@ -319,7 +318,6 @@ func (s *state) tryMethod(t reflect.Type, vx, vy reflect.Value) bool {
}

func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value {
v = sanitizeValue(v, f.Type().In(0))
if !s.dynChecker.Next() {
return f.Call([]reflect.Value{v})[0]
}
Expand All @@ -343,8 +341,6 @@ func (s *state) callTRFunc(f, v reflect.Value, step Transform) reflect.Value {
}

func (s *state) callTTBFunc(f, x, y reflect.Value) bool {
x = sanitizeValue(x, f.Type().In(0))
y = sanitizeValue(y, f.Type().In(1))
if !s.dynChecker.Next() {
return f.Call([]reflect.Value{x, y})[0].Bool()
}
Expand Down Expand Up @@ -372,19 +368,6 @@ func detectRaces(c chan<- reflect.Value, f reflect.Value, vs ...reflect.Value) {
ret = f.Call(vs)[0]
}

// sanitizeValue converts nil interfaces of type T to those of type R,
// assuming that T is assignable to R.
// Otherwise, it returns the input value as is.
func sanitizeValue(v reflect.Value, t reflect.Type) reflect.Value {
// TODO(≥go1.10): Workaround for reflect bug (https://golang.org/issue/22143).
if !flags.AtLeastGo110 {
if v.Kind() == reflect.Interface && v.IsNil() && v.Type() != t {
return reflect.New(t).Elem()
}
}
return v
}

func (s *state) compareStruct(t reflect.Type, vx, vy reflect.Value) {
var addr bool
var vax, vay reflect.Value // Addressable versions of vx and vy
Expand Down
14 changes: 2 additions & 12 deletions cmp/compare_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1447,14 +1447,6 @@ func embeddedTests() []test {
return s
}

// TODO(≥go1.10): Workaround for reflect bug (https://golang.org/issue/21122).
wantPanicNotGo110 := func(s string) string {
if !flags.AtLeastGo110 {
return ""
}
return s
}

return []test{{
label: label + "/ParentStructA/PanicUnexported1",
x: ts.ParentStructA{},
Expand Down Expand Up @@ -1745,8 +1737,7 @@ func embeddedTests() []test {
label: label + "/ParentStructG/PanicUnexported1",
x: ts.ParentStructG{},
y: ts.ParentStructG{},
wantPanic: wantPanicNotGo110("cannot handle unexported field"),
wantEqual: !flags.AtLeastGo110,
wantPanic: "cannot handle unexported field",
reason: "ParentStructG has unexported fields",
}, {
label: label + "/ParentStructG/Ignored",
Expand Down Expand Up @@ -1836,8 +1827,7 @@ func embeddedTests() []test {
label: label + "/ParentStructI/PanicUnexported1",
x: ts.ParentStructI{},
y: ts.ParentStructI{},
wantPanic: wantPanicNotGo110("cannot handle unexported field"),
wantEqual: !flags.AtLeastGo110,
wantPanic: "cannot handle unexported field",
reason: "ParentStructI has unexported fields",
}, {
label: label + "/ParentStructI/Ignored1",
Expand Down
10 changes: 0 additions & 10 deletions cmp/internal/flags/toolchain_legacy.go

This file was deleted.

10 changes: 0 additions & 10 deletions cmp/internal/flags/toolchain_recent.go

This file was deleted.

0 comments on commit 3242228

Please sign in to comment.