From b5f52b37d50a83e89cad820bda82537e2ec67388 Mon Sep 17 00:00:00 2001 From: Omar Sy Date: Mon, 6 May 2024 19:36:30 +0200 Subject: [PATCH 1/2] fix(#2041):cannot use struct as key of a map --- gnovm/pkg/gnolang/values.go | 4 ++-- gnovm/tests/files/struct58.gno | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 gnovm/tests/files/struct58.gno diff --git a/gnovm/pkg/gnolang/values.go b/gnovm/pkg/gnolang/values.go index bc9af8e1a32..640698cf896 100644 --- a/gnovm/pkg/gnolang/values.go +++ b/gnovm/pkg/gnolang/values.go @@ -1541,10 +1541,10 @@ func (tv *TypedValue) ComputeMapKey(store Store, omitType bool) MapKey { sv := tv.V.(*StructValue) sl := len(sv.Fields) bz = append(bz, '{') + bzl := FieldTypeList(bt.Fields).Types() for i := 0; i < sl; i++ { fv := fillValueTV(store, &sv.Fields[i]) - ft := bt.Fields[i] - omitTypes := ft.Elem().Kind() != InterfaceKind + omitTypes := bzl[i].Kind() != InterfaceKind bz = append(bz, fv.ComputeMapKey(store, omitTypes)...) if i != sl-1 { bz = append(bz, ',') diff --git a/gnovm/tests/files/struct58.gno b/gnovm/tests/files/struct58.gno new file mode 100644 index 00000000000..d1d650f47af --- /dev/null +++ b/gnovm/tests/files/struct58.gno @@ -0,0 +1,23 @@ +package main + +type I interface { + dummy() +} +type IS struct{} + +func (iss IS) dummy() { +} + +type S struct { + x int + I +} + +func main() { + m := make(map[S]string) + m[S{0, IS{}}] = "test" + println(m) +} + +// Output: +// map{(struct{(0 int),(struct{} main.IS)} main.S):("test" string)} From 03239705cbbc67535fde8ef47677982c2b674a3d Mon Sep 17 00:00:00 2001 From: Omar Sy Date: Tue, 7 May 2024 18:41:15 +0200 Subject: [PATCH 2/2] fix: not use FieldTypeList use Type instead --- gnovm/pkg/gnolang/values.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gnovm/pkg/gnolang/values.go b/gnovm/pkg/gnolang/values.go index 640698cf896..948730c4697 100644 --- a/gnovm/pkg/gnolang/values.go +++ b/gnovm/pkg/gnolang/values.go @@ -1541,10 +1541,9 @@ func (tv *TypedValue) ComputeMapKey(store Store, omitType bool) MapKey { sv := tv.V.(*StructValue) sl := len(sv.Fields) bz = append(bz, '{') - bzl := FieldTypeList(bt.Fields).Types() for i := 0; i < sl; i++ { fv := fillValueTV(store, &sv.Fields[i]) - omitTypes := bzl[i].Kind() != InterfaceKind + omitTypes := bt.Fields[i].Type.Kind() != InterfaceKind bz = append(bz, fv.ComputeMapKey(store, omitTypes)...) if i != sl-1 { bz = append(bz, ',')