From b29edadf48c203db103c278864a135b00c6768d8 Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Thu, 2 Apr 2026 13:49:26 -0700 Subject: [PATCH] reflect: fix reflect.TyepAssert for structs --- src/internal/reflectlite/value.go | 2 +- src/reflect/value_test.go | 46 +++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/internal/reflectlite/value.go b/src/internal/reflectlite/value.go index b8ec96d55..3c2af94f7 100644 --- a/src/internal/reflectlite/value.go +++ b/src/internal/reflectlite/value.go @@ -138,7 +138,7 @@ func TypeAssert[T any](v Value) (T, bool) { var zero T return zero, false } - if !v.isIndirect() { + if !v.isIndirect() && v.typecode.Size() <= unsafe.Sizeof(uintptr(0)) { return *(*T)(unsafe.Pointer(&v.value)), true } return *(*T)(v.value), true diff --git a/src/reflect/value_test.go b/src/reflect/value_test.go index 4b818100b..999c115cb 100644 --- a/src/reflect/value_test.go +++ b/src/reflect/value_test.go @@ -924,6 +924,52 @@ func testTypeAssert[T comparable, V any](t *testing.T, val V, wantVal T, wantOk } } +func TestTypeAssertStruct(t *testing.T) { + type taStruct struct { + i int + b bool + } + + var a any + + // struct + a = taStruct{3, true} + if s, ok := a.(taStruct); ok { + if s.i != 3 || s.b != true { + t.Errorf("a.(S) failed: got s.i=%v, s.b=%v\n", s.i, s.b) + } + } else { + t.Errorf("a.(S) failed: got ok=false") + } + + if s, ok := TypeAssert[taStruct](ValueOf(a)); ok { + if s.i != 3 || s.b != true { + t.Errorf("TypeAssert[S] failed: got s.i=%v, s.b=%v\n", s.i, s.b) + } + } else { + t.Errorf("TypeAssert[S] failed: got ok=false") + } + + // struct ptr + a = &taStruct{3, true} + if s, ok := a.(*taStruct); ok { + if s.i != 3 || s.b != true { + t.Errorf("a.(*S) failed: got s.i=%v, s.b=%v\n", s.i, s.b) + } + } else { + t.Errorf("a.(*S) failed: got ok=false") + } + + if s, ok := TypeAssert[*taStruct](ValueOf(a)); ok { + if s.i != 3 || s.b != true { + t.Errorf("TypeAssert[*S] failed: got s.i=%v, s.b=%v\n", s.i, s.b) + } + } else { + t.Errorf("TypeAssert[*S] failed: got ok=false") + } + +} + type testTypeWithMethod struct{ val string } func (v testTypeWithMethod) String() string { return v.val }