From 9c0bf8bd2ce78caf6bcba335651f498046c1ee0e Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Sat, 11 Mar 2023 14:11:32 -0800 Subject: [PATCH] reflect: Value.Set: fix direction of assignment check --- src/reflect/value.go | 2 +- src/reflect/value_test.go | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/reflect/value.go b/src/reflect/value.go index 67580dc2..2d39028d 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -907,7 +907,7 @@ func (it *MapIter) Next() bool { func (v Value) Set(x Value) { v.checkAddressable() - if !v.typecode.AssignableTo(x.typecode) { + if !x.typecode.AssignableTo(v.typecode) { panic("reflect: cannot set") } diff --git a/src/reflect/value_test.go b/src/reflect/value_test.go index 18bb9afe..cfcb0515 100644 --- a/src/reflect/value_test.go +++ b/src/reflect/value_test.go @@ -504,6 +504,15 @@ func TestTinyNumMethods(t *testing.T) { } } +func TestAssignableTo(t *testing.T) { + var a any + refa := ValueOf(&a).Elem() + refa.Set(ValueOf(4)) + if got, want := refa.Interface().(int), 4; got != want { + t.Errorf("AssignableTo / Set failed, got %v, want %v", got, want) + } +} + func equal[T comparable](a, b []T) bool { if len(a) != len(b) { return false