diff --git a/src/reflect/value.go b/src/reflect/value.go index f27db349..24cbf288 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -223,7 +223,7 @@ func (v Value) Addr() Value { return Value{ typecode: pointerTo(v.typecode), - value: unsafe.Pointer(&v.value), + value: v.value, flags: v.flags ^ valueFlagIndirect, } } diff --git a/src/reflect/value_test.go b/src/reflect/value_test.go index b3d222e0..7f26aa8a 100644 --- a/src/reflect/value_test.go +++ b/src/reflect/value_test.go @@ -266,6 +266,31 @@ func TestNamedTypes(t *testing.T) { } } +func addrDecode(body interface{}) { + vbody := ValueOf(body) + ptr := vbody.Elem() + pptr := ptr.Addr() + addrSetInt(pptr.Interface()) +} + +func addrSetInt(intf interface{}) { + ptr := intf.(*uint64) + *ptr = 112358 +} + +func TestAddr(t *testing.T) { + var n uint64 + addrDecode(&n) + if n != 112358 { + t.Errorf("Failed to set t=112358, got %v", n) + } + + v := ValueOf(&n) + if got, want := v.Elem().Addr().CanAddr(), false; got != want { + t.Errorf("Elem.Addr.CanAddr=%v, want %v", got, want) + } +} + func equal[T comparable](a, b []T) bool { if len(a) != len(b) { return false