From 0dafae13605409231f410d329c86269b19814caa Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Thu, 21 Nov 2024 13:56:57 -0500 Subject: [PATCH] reflect: add test of maps with keys larger than key size This finds the bug fixed in CL 630279. reflect mutates the SwissMapType of a map[unsafe.Pointer]unsafe.Pointer, which happened to already have the correct GroupSize for all of the maps used in the reflect tests. For #54766. Change-Id: If4428e1e799598e7512edceb3cefb2ad00cfa712 Reviewed-on: https://go-review.googlesource.com/c/go/+/630676 LUCI-TryBot-Result: Go LUCI Reviewed-by: Keith Randall Reviewed-by: Keith Randall Auto-Submit: Michael Pratt --- src/reflect/all_test.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index 687bbfc1075..b2f70c13697 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -6309,6 +6309,32 @@ func TestMapOfGCKeys(t *testing.T) { } } +// Test assignment and access to a map with keys larger than word size. +func TestMapOfGCBigKey(t *testing.T) { + type KV struct { + i int64 + j int64 + } + + kvTyp := TypeFor[KV]() + mt := MapOf(kvTyp, kvTyp) + + const n = 100 + m := MakeMap(mt) + for i := 0; i < n; i++ { + kv := KV{int64(i), int64(i+1)} + m.SetMapIndex(ValueOf(kv), ValueOf(kv)) + } + + for i := 0; i < n; i++ { + kv := KV{int64(i), int64(i+1)} + elem := m.MapIndex(ValueOf(kv)).Interface().(KV) + if elem != kv { + t.Errorf("lost m[%v] = %v, want %v", kv, elem, kv) + } + } +} + func TestMapOfGCValues(t *testing.T) { type T *uintptr tt := TypeOf(T(nil))