From b4a07edd8928ef35d084c6b93cccaf31aeeebd35 Mon Sep 17 00:00:00 2001
From: piux2 <90544084+piux2@users.noreply.github.com>
Date: Fri, 31 May 2024 09:22:37 -0700
Subject: [PATCH] feat: named and unnamed type assignment 2 of 3 (#1246)
This is part 2 of 3 of the solution for issue #1141. The part 1 of 3 of
the solution can be found in issue #1143.
In this part of the solution, we have made several improvements:
- Support both named and unnamed type assignments in assignment
statements and function return values.
- Resolved the issue related to incorrect method selectors that is
caused by mixing named and unnamed assignments.
- Added 62 file tests to ensure the correctness of the code.
- Included 2 realm tests to further validate the cross realm assignment
and method selector.
- Enhanced the support for GNO file tests in nested directories. This
allows us to organize tests in intuitively named folders.
To achieve the above improvements in the preprocessing phase, we made
the following changes:
- Introduced an isNamed() function on the Type Interface and marked
named types with isNamed() returning true. This helps distinguish
between named and unnamed types.
- Followed the specifications to convert the right-hand side type into a
constant function type.
- As for determining the package associated with a test file, we've
maintained the original convention. We keeps relying on the comment
directive "//PKGPATH: gno.land/r/xyz" in the test file itself to
identify the package it belongs to. We do not using the local folder
structure to derive the package for file tests. Therefore the tests in
tests/files folder can be stored in any intuitively named sub
directories.
**NOTE:** The named and unnamed type conversions that involve the
decomposition of function calls returning multiple values in the
preprocess have not yet been included in this pull request. This
functionality will be addressed in part 3 of 3 of the entire solution.
Contributors' checklist...
- [x] Added new tests, or not needed, or not feasible
- [ ] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [ ] Updated the official documentation or not needed
- [ ] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
- [ ] Provided any useful hints for running manual tests
- [ ] Added new benchmarks to [generated
graphs](https://gnoland.github.io/benchmarks), if any. More info
[here](https://github.com/gnolang/gno/blob/master/.benchmarks/README.md).
---------
Co-authored-by: deelawn
Co-authored-by: Morgan Bazalgette
---
.../r/demo/tests/realm_compositelit.gno | 22 +
.../gno.land/r/demo/tests/realm_method38d.gno | 19 +
gnovm/pkg/gnolang/preprocess.go | 74 +++-
gnovm/pkg/gnolang/types.go | 81 +++-
gnovm/pkg/gnolang/uverse_test.go | 4 +-
gnovm/pkg/gnolang/values_string.go | 2 +-
gnovm/tests/file_test.go | 115 +++--
.../append/named_unnamed_type2_filetest.gno | 16 +
.../append/named_unnamed_type3_filetest.gno | 15 +
.../append/named_unnamed_type_filetest.gno | 35 ++
.../copy/name_unnamed_type_filetest.gno | 25 ++
.../method/declaredType0_filetest.gno | 19 +
.../method/declaredType0b_filetest.gno | 22 +
.../method/declaredType1_filetest.gno | 27 ++
.../method/declaredType1b_filetest.gno | 27 ++
.../method/declaredType2_filetest.gno | 27 ++
.../method/declaredType2b_filetest.gno | 26 ++
.../method/declaredType3_filetest.gno | 22 +
.../method/declaredType3b_filetest.gno | 22 +
.../method/declaredType3c_filetest.gno | 26 ++
.../method/declaredType3d_filetest.gno | 22 +
.../method/declaredType4_filetest.gno | 23 +
.../method/declaredType5_filetest.gno | 24 +
.../method/declaredType6_filetest.gno | 20 +
.../method/declaredType6b_filetest.gno | 20 +
.../more/assgin_interface2_filetest.gno | 14 +
.../more/assgin_interface_filetest.gno | 39 ++
.../more/assgin_two_filetest.gno | 18 +
.../more/assignment_filetest.gno | 26 ++
.../more/convert_types1b_filetest.gno | 24 +
.../more/convert_types_filetest.gno | 21 +
.../cross_realm_compositelit_filetest.gno | 13 +
.../more/declaredtype2_filetest.gno | 33 ++
.../more/default_value_filetest.gno | 31 ++
.../more/errors2_filetest.gno | 17 +
.../more/method38d_filetest.gno | 21 +
.../more/method38e_filetest.gno | 22 +
.../more/method38e_filetest0.gno | 22 +
.../more/method38g_filetest.gno | 34 ++
.../more/realm_compositelit_filetest.gno | 228 ++++++++++
.../more/recover6_filetest.gno | 30 ++
.../more/return2_filetest.gno | 16 +
.../more/return_interface1_filetest.gno | 15 +
.../more/return_interface_filetest.gno | 19 +
.../more/return_select_filetest.gno | 25 ++
.../files/assign_unnamed_type/type40.gno | 20 +
.../unnamedtype0_filetest.gno | 17 +
.../unnamedtype0b_filetest.gno | 17 +
.../unnamedtype1_filetest.gno | 24 +
.../unnamedtype1a_filetest.gno | 23 +
.../unnamedtype1b_filetest.gno | 27 ++
.../unnamedtype1c_filetest.gno | 25 ++
.../unnamedtype2_filetest.gno | 23 +
.../unnamedtype2a_filetest.gno | 23 +
.../unnamedtype2b_filetest.gno | 27 ++
.../unnamedtype2c_filetest.gno | 25 ++
.../unnamedtype3_filetest.gno | 25 ++
.../unnamedtype3a_filetest.gno | 25 ++
.../unnamedtype3b_filetest.gno | 29 ++
.../unnamedtype3c_filetest.gno | 27 ++
.../unnamedtype4_filetest.gno | 27 ++
.../unnamedtype4a_filetest.gno | 27 ++
.../unnamedtype4b_filetest.gno | 27 ++
.../unnamedtype4c_filetest.gno | 25 ++
.../unnamedtype5_filetest.gno | 41 ++
.../unnamedtype5a_filetest.gno | 32 ++
.../unnamedtype5b_filetest.gno | 30 ++
.../unnamedtype5c_filetest.gno | 25 ++
.../unnamedtype6_filetest.gno | 24 +
.../unnamedtype6a_filetest.gno | 24 +
.../unnamedtype6b_filetest.gno | 27 ++
.../unnamedtype6c_filetest.gno | 25 ++
.../unnamedtype7_filetest.gno | 15 +
gnovm/tests/files/print1.gno | 2 +-
gnovm/tests/files/zrealm_tests0.gno | 412 ++++++++++++++++--
75 files changed, 2434 insertions(+), 89 deletions(-)
create mode 100644 examples/gno.land/r/demo/tests/realm_compositelit.gno
create mode 100644 examples/gno.land/r/demo/tests/realm_method38d.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type2_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type3_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/copy/name_unnamed_type_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType0_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType0b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType1_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType1b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType2_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType2b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType3_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType3b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType3c_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType3d_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType4_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType5_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType6_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/method/declaredType6b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/assgin_interface2_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/assgin_interface_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/assgin_two_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/assignment_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/convert_types1b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/convert_types_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/cross_realm_compositelit_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/declaredtype2_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/default_value_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/errors2_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/method38d_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/method38e_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/method38e_filetest0.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/method38g_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/realm_compositelit_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/recover6_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/return2_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/return_interface1_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/return_interface_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/more/return_select_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/type40.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype0_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype0b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype1_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype1a_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype1b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype1c_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype2_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype2a_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype2b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype2c_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype3_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype3a_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype3b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype3c_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype4_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype4a_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype4b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype4c_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype5_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype5a_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype5b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype5c_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype6_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype6a_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype6b_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype6c_filetest.gno
create mode 100644 gnovm/tests/files/assign_unnamed_type/unnamedtype7_filetest.gno
diff --git a/examples/gno.land/r/demo/tests/realm_compositelit.gno b/examples/gno.land/r/demo/tests/realm_compositelit.gno
new file mode 100644
index 00000000000..57c42280c41
--- /dev/null
+++ b/examples/gno.land/r/demo/tests/realm_compositelit.gno
@@ -0,0 +1,22 @@
+package tests
+
+type (
+ Word uint
+ nat []Word
+)
+
+var zero = &Int{
+ neg: true,
+ abs: []Word{0},
+}
+
+// structLit
+type Int struct {
+ neg bool
+ abs nat
+}
+
+func GetZeroType() nat {
+ a := zero.abs
+ return a
+}
diff --git a/examples/gno.land/r/demo/tests/realm_method38d.gno b/examples/gno.land/r/demo/tests/realm_method38d.gno
new file mode 100644
index 00000000000..b1dbab67e1f
--- /dev/null
+++ b/examples/gno.land/r/demo/tests/realm_method38d.gno
@@ -0,0 +1,19 @@
+package tests
+
+var abs nat
+
+func (n nat) Add() nat {
+ return []Word{0}
+}
+
+func GetAbs() nat {
+ abs = []Word{0}
+
+ return abs
+}
+
+func AbsAdd() nat {
+ rt := GetAbs().Add()
+
+ return rt
+}
diff --git a/gnovm/pkg/gnolang/preprocess.go b/gnovm/pkg/gnolang/preprocess.go
index 60406099e1c..459910505b9 100644
--- a/gnovm/pkg/gnolang/preprocess.go
+++ b/gnovm/pkg/gnolang/preprocess.go
@@ -1621,8 +1621,12 @@ func Preprocess(store Store, ctx BlockNode, n Node) Node {
lhs0 := n.Lhs[0].(*NameExpr).Name
lhs1 := n.Lhs[1].(*NameExpr).Name
+ var mt *MapType
dt := evalStaticTypeOf(store, last, cx.X)
- mt := baseOf(dt).(*MapType)
+ mt, ok := baseOf(dt).(*MapType)
+ if !ok {
+ panic(fmt.Sprintf("invalid index expression on %T", dt))
+ }
// re-definitions
last.Define(lhs0, anyValue(mt.Value))
last.Define(lhs1, anyValue(BoolType))
@@ -2263,12 +2267,12 @@ func getResultTypedValues(cx *CallExpr) []TypedValue {
func evalConst(store Store, last BlockNode, x Expr) *ConstExpr {
// TODO: some check or verification for ensuring x
// is constant? From the machine?
- cv := NewMachine(".dontcare", store)
- tv := cv.EvalStatic(last, x)
- cv.Release()
+ m := NewMachine(".dontcare", store)
+ cv := m.EvalStatic(last, x)
+ m.Release()
cx := &ConstExpr{
Source: x,
- TypedValue: tv,
+ TypedValue: cv,
}
cx.SetAttribute(ATTR_PREPROCESSED, true)
setConstAttrs(cx)
@@ -2465,11 +2469,13 @@ func checkOrConvertType(store Store, last BlockNode, x *Expr, t Type, autoNative
// "push" expected type into shift binary's left operand.
checkOrConvertType(store, last, &bx.Left, t, autoNative)
} else if *x != nil { // XXX if x != nil && t != nil {
+ // check type
xt := evalStaticTypeOf(store, last, *x)
if t != nil {
checkType(xt, t, autoNative)
}
- if isUntyped(xt) {
+ // convert type
+ if isUntyped(xt) { // convert if x is untyped literal
if t == nil {
t = defaultTypeOf(xt)
}
@@ -2490,11 +2496,61 @@ func checkOrConvertType(store Store, last BlockNode, x *Expr, t Type, autoNative
// default:
}
}
- cx := Expr(Call(constType(nil, t), *x))
- cx = Preprocess(store, last, cx).(Expr)
- *x = cx
+ // convert x to destination type t
+ convertType(store, last, x, t)
+ } else {
+ // if one side is declared name type and the other side is unnamed type
+ if isNamedConversion(xt, t) {
+ // covert right (xt) to the type of the left (t)
+ convertType(store, last, x, t)
+ }
+ }
+ }
+}
+
+// convert x to destination type t
+func convertType(store Store, last BlockNode, x *Expr, t Type) {
+ cx := Expr(Call(constType(nil, t), *x))
+ cx = Preprocess(store, last, cx).(Expr)
+ *x = cx
+}
+
+// isNamedConversion returns true if assigning a value of type
+// xt (rhs) into a value of type t (lhs) entails an implicit type conversion.
+// xt is the result of an expression type.
+//
+// In a few special cases, we should not perform the conversion:
+//
+// case 1: the LHS is an interface, which is unnamed, so we should not
+// convert to that even if right is a named type.
+// case 2: isNamedConversion is called within evaluating make() or new()
+// (uverse functions). It returns TypType (generic) which does have IsNamed appropriate
+func isNamedConversion(xt, t Type) bool {
+ if t == nil {
+ t = xt
+ }
+
+ // no conversion case 1: the LHS is an interface
+
+ _, c1 := t.(*InterfaceType)
+
+ // no conversion case2: isNamedConversion is called within evaluating make() or new()
+ // (uverse functions)
+
+ _, oktt := t.(*TypeType)
+ _, oktt2 := xt.(*TypeType)
+ c2 := oktt || oktt2
+
+ //
+ if !c1 && !c2 { // carve out above two cases
+ // covert right to the type of left if one side is unnamed type and the other side is not
+
+ if t.IsNamed() && !xt.IsNamed() ||
+ !t.IsNamed() && xt.IsNamed() {
+ return true
}
}
+ return false
}
// like checkOrConvertType(last, x, nil)
diff --git a/gnovm/pkg/gnolang/types.go b/gnovm/pkg/gnolang/types.go
index e1814e8f243..fcfcd7d9d37 100644
--- a/gnovm/pkg/gnolang/types.go
+++ b/gnovm/pkg/gnolang/types.go
@@ -24,6 +24,7 @@ type Type interface {
String() string // for dev/debugging
Elem() Type // for TODO... types
GetPkgPath() string
+ IsNamed() bool // named vs unname type. property as a method
}
type TypeID string
@@ -323,6 +324,10 @@ func (pt PrimitiveType) GetPkgPath() string {
return ""
}
+func (pt PrimitiveType) IsNamed() bool {
+ return true
+}
+
// ----------------------------------------
// Field type (partial)
@@ -369,6 +374,10 @@ func (ft FieldType) GetPkgPath() string {
panic("FieldType is a pseudotype with no package path")
}
+func (ft FieldType) IsNamed() bool {
+ panic("FieldType is a pseudotype with no property called named")
+}
+
// ----------------------------------------
// FieldTypeList
@@ -528,6 +537,10 @@ func (at *ArrayType) GetPkgPath() string {
return ""
}
+func (at *ArrayType) IsNamed() bool {
+ return false
+}
+
// ----------------------------------------
// Slice type
@@ -574,6 +587,10 @@ func (st *SliceType) GetPkgPath() string {
return ""
}
+func (st *SliceType) IsNamed() bool {
+ return false
+}
+
// ----------------------------------------
// Pointer type
@@ -612,6 +629,10 @@ func (pt *PointerType) GetPkgPath() string {
return pt.Elt.GetPkgPath()
}
+func (pt *PointerType) IsNamed() bool {
+ return false
+}
+
func (pt *PointerType) FindEmbeddedFieldType(callerPath string, n Name, m map[Type]struct{}) (
trail []ValuePath, hasPtr bool, rcvr Type, field Type, accessError bool,
) {
@@ -747,6 +768,10 @@ func (st *StructType) GetPkgPath() string {
return st.PkgPath
}
+func (st *StructType) IsNamed() bool {
+ return false
+}
+
// NOTE only works for exposed non-embedded fields.
func (st *StructType) GetPathForName(n Name) ValuePath {
for i := 0; i < len(st.Fields); i++ {
@@ -867,6 +892,10 @@ func (pt *PackageType) GetPkgPath() string {
panic("package types has no package path (unlike package values)")
}
+func (pt *PackageType) IsNamed() bool {
+ panic("package types have no property called named")
+}
+
// ----------------------------------------
// Interface type
@@ -926,6 +955,10 @@ func (it *InterfaceType) GetPkgPath() string {
return it.PkgPath
}
+func (it *InterfaceType) IsNamed() bool {
+ return false
+}
+
func (it *InterfaceType) FindEmbeddedFieldType(callerPath string, n Name, m map[Type]struct{}) (
trail []ValuePath, hasPtr bool, rcvr Type, ft Type, accessError bool,
) {
@@ -1073,6 +1106,10 @@ func (ct *ChanType) GetPkgPath() string {
return ""
}
+func (ct *ChanType) IsNamed() bool {
+ return false
+}
+
// ----------------------------------------
// Function type
@@ -1280,6 +1317,10 @@ func (ft *FuncType) GetPkgPath() string {
panic("function types have no package path")
}
+func (ft *FuncType) IsNamed() bool {
+ return false
+}
+
func (ft *FuncType) HasVarg() bool {
if numParams := len(ft.Params); numParams == 0 {
return false
@@ -1338,6 +1379,10 @@ func (mt *MapType) GetPkgPath() string {
return ""
}
+func (mt *MapType) IsNamed() bool {
+ return false
+}
+
// ----------------------------------------
// Type (typeval) type
@@ -1366,6 +1411,10 @@ func (tt *TypeType) GetPkgPath() string {
panic("typeval types have no package path")
}
+func (tt *TypeType) IsNamed() bool {
+ panic("typeval types have no property called 'named'")
+}
+
// ----------------------------------------
// Declared type
// Declared types have a name, base (underlying) type,
@@ -1450,6 +1499,10 @@ func (dt *DeclaredType) GetPkgPath() string {
return dt.PkgPath
}
+func (dt *DeclaredType) IsNamed() bool {
+ return true
+}
+
func (dt *DeclaredType) DefineMethod(fv *FuncValue) {
if !dt.TryDefineMethod(fv) {
panic(fmt.Sprintf("redeclaration of method %s.%s",
@@ -1767,6 +1820,14 @@ func (nt *NativeType) GetPkgPath() string {
return "go:" + nt.Type.PkgPath()
}
+func (nt *NativeType) IsNamed() bool {
+ if nt.Type.Name() != "" {
+ return true
+ } else {
+ return false
+ }
+}
+
func (nt *NativeType) GnoType(store Store) Type {
if nt.gnoType == nil {
nt.gnoType = store.Go2GnoType(nt.Type)
@@ -1895,6 +1956,10 @@ func (bt blockType) GetPkgPath() string {
panic("blockType has no package path")
}
+func (bt blockType) IsNamed() bool {
+ panic("blockType has no property called named")
+}
+
// ----------------------------------------
// tupleType
@@ -1945,6 +2010,10 @@ func (tt *tupleType) GetPkgPath() string {
panic("typleType has no package path")
}
+func (tt *tupleType) IsNamed() bool {
+ panic("typleType has no property called named")
+}
+
// ----------------------------------------
// RefType
@@ -1965,11 +2034,15 @@ func (rt RefType) String() string {
}
func (rt RefType) Elem() Type {
- panic("should not happen")
+ panic("RefType has no elem type")
}
func (rt RefType) GetPkgPath() string {
- panic("should not happen")
+ panic("RefType has no package path")
+}
+
+func (rt RefType) IsNamed() bool {
+ panic("RefType has no property called named")
}
// ----------------------------------------
@@ -2002,6 +2075,10 @@ func (mn MaybeNativeType) GetPkgPath() string {
return mn.Type.GetPkgPath()
}
+func (mn MaybeNativeType) IsNamed() bool {
+ return mn.Type.IsNamed()
+}
+
// ----------------------------------------
// Kind
diff --git a/gnovm/pkg/gnolang/uverse_test.go b/gnovm/pkg/gnolang/uverse_test.go
index 7280d131ec5..7a6c0567e45 100644
--- a/gnovm/pkg/gnolang/uverse_test.go
+++ b/gnovm/pkg/gnolang/uverse_test.go
@@ -39,7 +39,7 @@ func TestIssue1337PrintNilSliceAsUndefined(t *testing.T) {
var a []string
println(a)
}`,
- expected: "nil []string\n",
+ expected: "(nil []string)\n",
},
{
name: "print non-empty slice",
@@ -57,7 +57,7 @@ func TestIssue1337PrintNilSliceAsUndefined(t *testing.T) {
var a map[string]string
println(a)
}`,
- expected: "nil map[string]string\n",
+ expected: "(nil map[string]string)\n",
},
{
name: "print non-empty map",
diff --git a/gnovm/pkg/gnolang/values_string.go b/gnovm/pkg/gnolang/values_string.go
index ad6e7bfc854..4ae05c8a97d 100644
--- a/gnovm/pkg/gnolang/values_string.go
+++ b/gnovm/pkg/gnolang/values_string.go
@@ -376,7 +376,7 @@ func (tv *TypedValue) ProtectedSprint(seen *seenValues, considerDeclaredType boo
default:
// The remaining types may have a nil value.
if tv.V == nil {
- return nilStr + " " + tv.T.String()
+ return "(" + nilStr + " " + tv.T.String() + ")"
}
// *ArrayType, *SliceType, *StructType, *MapType
diff --git a/gnovm/tests/file_test.go b/gnovm/tests/file_test.go
index 5622892efa1..4313fd88645 100644
--- a/gnovm/tests/file_test.go
+++ b/gnovm/tests/file_test.go
@@ -33,35 +33,14 @@ func TestFiles(t *testing.T) {
}
func TestChallenges(t *testing.T) {
+ t.Skip("Challenge tests, skipping.")
baseDir := filepath.Join(".", "challenges")
runFileTests(t, baseDir, nil)
}
-func filterFileTests(t *testing.T, files []fs.DirEntry, ignore []string) []fs.DirEntry {
- t.Helper()
-
- for i := 0; i < len(files); i++ {
- file := files[i]
- skip := func() { files = append(files[:i], files[i+1:]...); i-- }
- if filepath.Ext(file.Name()) != ".gno" {
- skip()
- continue
- }
- for _, is := range ignore {
- if match, err := path.Match(is, file.Name()); match {
- skip()
- continue
- } else if err != nil {
- t.Fatalf("error parsing glob pattern %q: %v", is, err)
- }
- }
- if testing.Short() && strings.Contains(file.Name(), "_long") {
- t.Logf("skipping test %s in short mode.", file.Name())
- skip()
- continue
- }
- }
- return files
+type testFile struct {
+ path string
+ fs.DirEntry
}
// ignore are glob patterns to ignore
@@ -70,34 +49,84 @@ func runFileTests(t *testing.T, baseDir string, ignore []string, opts ...RunFile
opts = append([]RunFileTestOption{WithSyncWanted(*withSync)}, opts...)
- files, err := os.ReadDir(baseDir)
+ files, err := readFiles(t, baseDir)
if err != nil {
t.Fatal(err)
}
files = filterFileTests(t, files, ignore)
-
+ var path string
+ var name string
for _, file := range files {
- file := file
- t.Run(file.Name(), func(t *testing.T) {
- if file.Name() == "composite0b.gno" {
- t.Skip("challenge failing")
- }
- if file.Name() == "composite1b.gno" {
- t.Skip("challenge failing")
- }
- if file.Name() == "not_a_type.gno" {
- t.Skip("challenge failing")
- }
- if file.Name() == "unused0.gno" {
- t.Skip("challenge failing")
- }
-
- runFileTest(t, filepath.Join(baseDir, file.Name()), opts...)
+ path = file.path
+ name = strings.TrimPrefix(file.path, baseDir+string(os.PathSeparator))
+ t.Run(name, func(t *testing.T) {
+ runFileTest(t, path, opts...)
})
}
}
+// it reads all files recursively in the directory
+func readFiles(t *testing.T, dir string) ([]testFile, error) {
+ t.Helper()
+ var files []testFile
+
+ err := filepath.WalkDir(dir, func(path string, de fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if de.IsDir() && de.Name() == "extern" {
+ return filepath.SkipDir
+ }
+ f := testFile{path: path, DirEntry: de}
+
+ files = append(files, f)
+ return nil
+ })
+ return files, err
+}
+
+func filterFileTests(t *testing.T, files []testFile, ignore []string) []testFile {
+ t.Helper()
+ filtered := make([]testFile, 0, 1000)
+ var name string
+
+ for _, f := range files {
+ // skip none .gno files
+ name = f.DirEntry.Name()
+ if filepath.Ext(name) != ".gno" {
+ continue
+ }
+ // skip ignored files
+ if isIgnored(t, name, ignore) {
+ continue
+ }
+ // skip _long file if we only want to test regular file.
+ if testing.Short() && strings.Contains(name, "_long") {
+ t.Logf("skipping test %s in short mode.", name)
+ continue
+ }
+ filtered = append(filtered, f)
+ }
+ return filtered
+}
+
+func isIgnored(t *testing.T, name string, ignore []string) bool {
+ t.Helper()
+ isIgnore := false
+ for _, is := range ignore {
+ match, err := path.Match(is, name)
+ if err != nil {
+ t.Fatalf("error parsing glob pattern %q: %v", is, err)
+ }
+ if match {
+ isIgnore = true
+ break
+ }
+ }
+ return isIgnore
+}
+
func runFileTest(t *testing.T, path string, opts ...RunFileTestOption) {
t.Helper()
diff --git a/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type2_filetest.gno b/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type2_filetest.gno
new file mode 100644
index 00000000000..38ec5ab7851
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type2_filetest.gno
@@ -0,0 +1,16 @@
+package main
+
+type (
+ nat []int
+ nat64 []int64
+)
+
+func main() {
+ var nlist = nat{0}
+ var n64list = nat64{1}
+ a := append(n64list, nlist...)
+ println(a)
+}
+
+// Error:
+// main/files/assign_unnamed_type/append/named_unnamed_type2_filetest.gno:11: cannot use int as int64
diff --git a/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type3_filetest.gno b/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type3_filetest.gno
new file mode 100644
index 00000000000..912aedb468d
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type3_filetest.gno
@@ -0,0 +1,15 @@
+package main
+
+type nat []int
+
+func main() {
+ var nlist = nat{0}
+ var ulist = []int{1}
+
+ a := append(nlist, nlist[0], ulist[0])
+ println(a)
+
+}
+
+// Output:
+// (slice[(0 int),(0 int),(1 int)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type_filetest.gno b/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type_filetest.gno
new file mode 100644
index 00000000000..7c37919f514
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/append/named_unnamed_type_filetest.gno
@@ -0,0 +1,35 @@
+package main
+
+type nat []int
+
+func main() {
+ var nlist = nat{0}
+ var ulist = []int{1}
+ var n int = 3
+
+ a := append(nlist, n)
+ b := append(ulist, n)
+
+ println(a)
+ println(b)
+
+ a = append(ulist, n)
+ b = append(nlist, n)
+
+ c := append(nlist, ulist...)
+ d := append(ulist, nlist...)
+
+ println(a)
+ println(b)
+ println(c)
+ println(d)
+
+}
+
+// Output:
+// (slice[(0 int),(3 int)] main.nat)
+// slice[(1 int),(3 int)]
+// (slice[(1 int),(3 int)] main.nat)
+// slice[(0 int),(3 int)]
+// (slice[(0 int),(1 int)] main.nat)
+// slice[(1 int),(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/copy/name_unnamed_type_filetest.gno b/gnovm/tests/files/assign_unnamed_type/copy/name_unnamed_type_filetest.gno
new file mode 100644
index 00000000000..0351f4f62db
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/copy/name_unnamed_type_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat []int
+
+func main() {
+ var nlist = nat{0}
+ var ulist = []int{1}
+
+ copy(nlist, ulist)
+
+ println(nlist)
+ println(ulist)
+
+ nlist = nat{0}
+ ulist = []int{1}
+ copy(ulist, nlist)
+ println(nlist)
+ println(ulist)
+}
+
+// Output:
+// (slice[(1 int)] main.nat)
+// slice[(1 int)]
+// (slice[(0 int)] main.nat)
+// slice[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType0_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType0_filetest.gno
new file mode 100644
index 00000000000..4c6ff69524d
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType0_filetest.gno
@@ -0,0 +1,19 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+func main() {
+ var abs nat
+ abs = []word{0}
+ println(abs.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType0b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType0b_filetest.gno
new file mode 100644
index 00000000000..65057890011
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType0b_filetest.gno
@@ -0,0 +1,22 @@
+package main
+
+type (
+ word int
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+func main() {
+ var abs nat
+ var b []word
+ b = []word{0}
+ abs = b
+
+ println(abs)
+}
+
+// Output:
+// (slice[(0 main.word)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType1_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType1_filetest.gno
new file mode 100644
index 00000000000..e56b4e08096
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType1_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+// structLit
+type Int struct {
+ neg bool
+ abs nat
+}
+
+func (n nat) add() bool {
+ return true
+}
+
+func main() {
+ z := &Int{
+ neg: true,
+ abs: []word{0},
+ }
+ println(z.abs.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType1b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType1b_filetest.gno
new file mode 100644
index 00000000000..364070cdc0d
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType1b_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+type Int struct {
+ neg bool
+ abs nat
+}
+
+func (n nat) add() bool {
+ return true
+}
+
+func main() {
+ z := &Int{
+ neg: true,
+ }
+
+ z.abs = []word{0}
+ println(z.abs.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType2_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType2_filetest.gno
new file mode 100644
index 00000000000..71d3601ebef
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType2_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+// map
+func main() {
+ items := map[string]nat{}
+
+ n := []word{0}
+
+ // this is assignment
+ items["test"] = n
+
+ r := items["test"]
+
+ println(r.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType2b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType2b_filetest.gno
new file mode 100644
index 00000000000..111d3311f98
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType2b_filetest.gno
@@ -0,0 +1,26 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+// mapLit
+func main() {
+ n := []word{0}
+
+ items := map[string]nat{
+ "test": n,
+ }
+
+ r := items["test"]
+
+ println(r.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType3_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType3_filetest.gno
new file mode 100644
index 00000000000..d7ab3701b1a
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType3_filetest.gno
@@ -0,0 +1,22 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+// sliceLit
+func main() {
+ items := []nat{[]word{0}, []word{1}}
+
+ r := items[0]
+
+ println(r.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType3b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType3b_filetest.gno
new file mode 100644
index 00000000000..5dedb25b796
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType3b_filetest.gno
@@ -0,0 +1,22 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+// sliceLit2
+func main() {
+ items := []nat{1: []word{0}, 2: []word{1}}
+
+ r := items[1]
+
+ println(r.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType3c_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType3c_filetest.gno
new file mode 100644
index 00000000000..f4eae2d2107
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType3c_filetest.gno
@@ -0,0 +1,26 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+// slice append
+func main() {
+ var items []nat
+
+ n := []word{0}
+
+ items = append(items, n)
+
+ r := items[0]
+
+ println(r.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType3d_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType3d_filetest.gno
new file mode 100644
index 00000000000..c77e6c99669
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType3d_filetest.gno
@@ -0,0 +1,22 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+// ArrayLit
+func main() {
+ items := [3]nat{[]word{0}, []word{1}}
+
+ r := items[0]
+
+ println(r.add())
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType4_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType4_filetest.gno
new file mode 100644
index 00000000000..2bba41fa617
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType4_filetest.gno
@@ -0,0 +1,23 @@
+package main
+
+type (
+ word uint
+ nat []word
+)
+
+func (n nat) add(x, y nat) bool {
+ return true
+}
+
+// parameter
+func main() {
+ var abs nat
+ abs = []word{0}
+ x := []word{1}
+ y := []word{2}
+
+ println(abs.add(x, y))
+}
+
+// Output:
+// true
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType5_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType5_filetest.gno
new file mode 100644
index 00000000000..dd76ef1b1b8
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType5_filetest.gno
@@ -0,0 +1,24 @@
+package main
+
+type (
+ BasicFunc func(int, int) int
+ MyFunc BasicFunc
+)
+
+func (f MyFunc) Apply(a, b int) int {
+ return f(a, b)
+}
+
+func main() {
+ basicAdd := func(a, b int) int {
+ return a + b
+ }
+ var myAdd MyFunc
+ myAdd = basicAdd
+
+ result := myAdd.Apply(2, 3)
+ println(result)
+}
+
+// Output:
+// 5
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType6_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType6_filetest.gno
new file mode 100644
index 00000000000..5d994352f35
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType6_filetest.gno
@@ -0,0 +1,20 @@
+package main
+
+type (
+ c uint
+ word c
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+func main() {
+ var abs nat
+ abs = []c{0}
+ println(abs.add())
+}
+
+// Error:
+// main/files/assign_unnamed_type/method/declaredType6_filetest.gno:15: cannot use main.c as main.word without explicit conversion
diff --git a/gnovm/tests/files/assign_unnamed_type/method/declaredType6b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/method/declaredType6b_filetest.gno
new file mode 100644
index 00000000000..88b3203a805
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/method/declaredType6b_filetest.gno
@@ -0,0 +1,20 @@
+package main
+
+type (
+ c uint
+ word c
+ nat []word
+)
+
+func (n nat) add() bool {
+ return true
+}
+
+func main() {
+ var abs nat
+ abs = []uint{0}
+ println(abs.add())
+}
+
+// Error:
+// main/files/assign_unnamed_type/method/declaredType6b_filetest.gno:15: cannot use uint as main.word without explicit conversion
diff --git a/gnovm/tests/files/assign_unnamed_type/more/assgin_interface2_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/assgin_interface2_filetest.gno
new file mode 100644
index 00000000000..129eb8d749a
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/assgin_interface2_filetest.gno
@@ -0,0 +1,14 @@
+package main
+
+type nat []int
+
+func main() {
+ var a nat
+ b := interface{}(nat{1})
+ a = b.(nat)
+
+ println(b)
+}
+
+// Output:
+// (slice[(1 int)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/more/assgin_interface_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/assgin_interface_filetest.gno
new file mode 100644
index 00000000000..92e3a1e3075
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/assgin_interface_filetest.gno
@@ -0,0 +1,39 @@
+package main
+
+type Foo interface {
+ Len() int
+}
+
+type myIntSlice []int
+
+func (s myIntSlice) Len() int {
+ return len(s)
+}
+
+func main() {
+ var a Foo
+ var b interface{ Len() int }
+
+ var i myIntSlice
+
+ println(a)
+
+ i = myIntSlice{1}
+ a = i
+
+ println(a)
+
+ b = interface{ Len() int }(a)
+
+ a = b
+
+ println(a)
+
+ println(b)
+}
+
+// Output:
+// (undefined)
+// (slice[(1 int)] main.myIntSlice)
+// (slice[(1 int)] main.myIntSlice)
+// (slice[(1 int)] main.myIntSlice)
diff --git a/gnovm/tests/files/assign_unnamed_type/more/assgin_two_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/assgin_two_filetest.gno
new file mode 100644
index 00000000000..0ee4acd58fc
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/assgin_two_filetest.gno
@@ -0,0 +1,18 @@
+package main
+
+type (
+ nat []int
+ nat2 []int
+)
+
+func main() {
+ a := nat{0}
+ b := nat2{1}
+ a = b
+
+ println(a)
+ println(b)
+}
+
+// Error:
+// main/files/assign_unnamed_type/more/assgin_two_filetest.gno:11: cannot use main.nat2 as main.nat without explicit conversion
diff --git a/gnovm/tests/files/assign_unnamed_type/more/assignment_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/assignment_filetest.gno
new file mode 100644
index 00000000000..2972c1895fd
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/assignment_filetest.gno
@@ -0,0 +1,26 @@
+package main
+
+type nat []int
+
+func main() {
+ var a nat
+ var b []int
+
+ a = []int{0}
+ b = nat{1}
+
+ println(a)
+ println(b)
+
+ a = b
+ b = a
+
+ println(a)
+ println(b)
+}
+
+// Output:
+// (slice[(0 int)] main.nat)
+// slice[(1 int)]
+// (slice[(1 int)] main.nat)
+// slice[(1 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/more/convert_types1b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/convert_types1b_filetest.gno
new file mode 100644
index 00000000000..aeaabfedd1d
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/convert_types1b_filetest.gno
@@ -0,0 +1,24 @@
+package main
+
+type nat []int
+
+func main() {
+ var a nat
+ var b []int
+
+ a = (nat)([]int{0})
+ b = ([]int)(nat{1})
+ println(a)
+ println(b)
+
+ a = (nat)(b)
+ b = ([]int)(a)
+ println(a)
+ println(b)
+}
+
+// Output:
+// (slice[(0 int)] main.nat)
+// slice[(1 int)]
+// (slice[(1 int)] main.nat)
+// slice[(1 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/more/convert_types_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/convert_types_filetest.gno
new file mode 100644
index 00000000000..0ff0a61c295
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/convert_types_filetest.gno
@@ -0,0 +1,21 @@
+package main
+
+type nat []int
+
+func main() {
+ var b []int
+ b = nat{1}
+ println(b)
+
+ var a nat
+ a = []int{0}
+ println(a)
+
+ b = a
+ println(b)
+}
+
+// Output:
+// slice[(1 int)]
+// (slice[(0 int)] main.nat)
+// slice[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/more/cross_realm_compositelit_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/cross_realm_compositelit_filetest.gno
new file mode 100644
index 00000000000..1bc5add0440
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/cross_realm_compositelit_filetest.gno
@@ -0,0 +1,13 @@
+// PKGPATH: gno.land/r/declaredtype_test
+package declaredtype_test
+
+import (
+ "gno.land/r/demo/tests"
+)
+
+func main() {
+ println(tests.GetZeroType())
+}
+
+// Output:
+// (slice[(0 gno.land/r/demo/tests.Word)] gno.land/r/demo/tests.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/more/declaredtype2_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/declaredtype2_filetest.gno
new file mode 100644
index 00000000000..c697abc0584
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/declaredtype2_filetest.gno
@@ -0,0 +1,33 @@
+package main
+
+type (
+ nat []Word
+ Word uint
+)
+
+func main() {
+ var abs []Word
+ abs = nat{0} // abs is a not named array
+ println(abs)
+ println()
+ a := []Word{0}
+ b := nat{0}
+ c := a
+ d := b
+ e := abs
+
+ println(a)
+ println(b)
+ println(c)
+ println(d)
+ println(e)
+}
+
+// Output:
+// slice[(0 main.Word)]
+//
+// slice[(0 main.Word)]
+// (slice[(0 main.Word)] main.nat)
+// slice[(0 main.Word)]
+// (slice[(0 main.Word)] main.nat)
+// slice[(0 main.Word)]
diff --git a/gnovm/tests/files/assign_unnamed_type/more/default_value_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/default_value_filetest.gno
new file mode 100644
index 00000000000..bb590f60dae
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/default_value_filetest.gno
@@ -0,0 +1,31 @@
+package main
+
+type (
+ nat []int
+ nmap map[int]int
+ nfunc func()
+)
+
+func main() {
+ var u1 []int
+ var n2 nat
+ var m map[int]int
+ var m2 nmap
+ var f func()
+ var f2 nfunc
+
+ println(u1)
+ println(n2)
+ println(m)
+ println(m2)
+ println(f)
+ println(f2)
+}
+
+// Output:
+// (nil []int)
+// (nil main.nat)
+// (nil map[int]int)
+// (nil main.nmap)
+// nil func()()
+// (nil main.nfunc)
diff --git a/gnovm/tests/files/assign_unnamed_type/more/errors2_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/errors2_filetest.gno
new file mode 100644
index 00000000000..2588b904a77
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/errors2_filetest.gno
@@ -0,0 +1,17 @@
+package main
+
+import "errors"
+
+func makeError() error {
+ return errors.New("some error")
+}
+
+func main() {
+ var a error
+ a = makeError()
+ b := a.Error()
+ println(a)
+}
+
+// Output:
+// some error
diff --git a/gnovm/tests/files/assign_unnamed_type/more/method38d_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/method38d_filetest.gno
new file mode 100644
index 00000000000..09588bd5c10
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/method38d_filetest.gno
@@ -0,0 +1,21 @@
+package main
+
+type (
+ nat []Word
+ Word uint
+)
+
+func (n nat) add() nat {
+ return []Word{0}
+}
+
+func main() {
+ var abs nat
+ abs = []Word{0}
+ println(abs)
+ println(abs.add().add())
+}
+
+// Output:
+// (slice[(0 main.Word)] main.nat)
+// (slice[(0 main.Word)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/more/method38e_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/method38e_filetest.gno
new file mode 100644
index 00000000000..f140d4b7291
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/method38e_filetest.gno
@@ -0,0 +1,22 @@
+package main
+
+type (
+ nat []Word
+ Word uint
+)
+
+func (n nat) add() []Word {
+ return nat{0}
+}
+
+func main() {
+ var abs nat
+ abs = []Word{0}
+ println(abs)
+ println(abs.add())
+ // println(abs.add().add()) // it should build failed.
+}
+
+// Output:
+// (slice[(0 main.Word)] main.nat)
+// slice[(0 main.Word)]
diff --git a/gnovm/tests/files/assign_unnamed_type/more/method38e_filetest0.gno b/gnovm/tests/files/assign_unnamed_type/more/method38e_filetest0.gno
new file mode 100644
index 00000000000..f140d4b7291
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/method38e_filetest0.gno
@@ -0,0 +1,22 @@
+package main
+
+type (
+ nat []Word
+ Word uint
+)
+
+func (n nat) add() []Word {
+ return nat{0}
+}
+
+func main() {
+ var abs nat
+ abs = []Word{0}
+ println(abs)
+ println(abs.add())
+ // println(abs.add().add()) // it should build failed.
+}
+
+// Output:
+// (slice[(0 main.Word)] main.nat)
+// slice[(0 main.Word)]
diff --git a/gnovm/tests/files/assign_unnamed_type/more/method38g_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/method38g_filetest.gno
new file mode 100644
index 00000000000..2c41bbb0a97
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/method38g_filetest.gno
@@ -0,0 +1,34 @@
+package main
+
+type (
+ nat []Word
+ Word uint
+)
+
+func (n nat) add(ws []Word) interface{} {
+ println(ws)
+
+ return ws
+}
+
+func (n nat) add2(ws nat) interface{} {
+ println(ws)
+
+ return ws
+}
+
+func main() {
+ var abs nat
+ abs = []Word{0}
+
+ println(abs.add(abs))
+ println()
+ println(abs.add2(abs))
+}
+
+// Output:
+// slice[(0 main.Word)]
+// slice[(0 main.Word)]
+//
+// (slice[(0 main.Word)] main.nat)
+// (slice[(0 main.Word)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/more/realm_compositelit_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/realm_compositelit_filetest.gno
new file mode 100644
index 00000000000..6549d1824ed
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/realm_compositelit_filetest.gno
@@ -0,0 +1,228 @@
+// PKGPATH: gno.land/r/test
+package test
+
+import (
+ "fmt"
+)
+
+type (
+ word uint
+ nat []word
+)
+
+var zero *Int
+
+// structLit
+type Int struct {
+ abs nat
+}
+
+func main() {
+ zero = &Int{
+ abs: []word{0},
+ }
+ a := zero.abs
+ println(a)
+}
+
+// Output:
+// (slice[(0 gno.land/r/test.word)] gno.land/r/test.nat)
+
+// Realm:
+// switchrealm["gno.land/r/test"]
+// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:5]={
+// "Data": null,
+// "List": [
+// {
+// "T": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/test.word"
+// }
+// }
+// ],
+// "ObjectInfo": {
+// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:5",
+// "ModTime": "0",
+// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:4",
+// "RefCount": "1"
+// }
+// }
+// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:4]={
+// "Fields": [
+// {
+// "T": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/test.nat"
+// },
+// "V": {
+// "@type": "/gno.SliceValue",
+// "Base": {
+// "@type": "/gno.RefValue",
+// "Hash": "9263ebf7e55e2d929e9c190bc4490ee58db148ec",
+// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:5"
+// },
+// "Length": "1",
+// "Maxcap": "1",
+// "Offset": "0"
+// }
+// }
+// ],
+// "ObjectInfo": {
+// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:4",
+// "ModTime": "0",
+// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:2",
+// "RefCount": "1"
+// }
+// }
+// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:2]={
+// "Blank": {},
+// "ObjectInfo": {
+// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:2",
+// "IsEscaped": true,
+// "ModTime": "3",
+// "RefCount": "2"
+// },
+// "Parent": null,
+// "Source": {
+// "@type": "/gno.RefNode",
+// "BlockNode": null,
+// "Location": {
+// "File": "",
+// "Line": "0",
+// "Nonce": "0",
+// "PkgPath": "gno.land/r/test"
+// }
+// },
+// "Values": [
+// {
+// "T": {
+// "@type": "/gno.TypeType"
+// },
+// "V": {
+// "@type": "/gno.TypeValue",
+// "Type": {
+// "@type": "/gno.DeclaredType",
+// "Base": {
+// "@type": "/gno.PrimitiveType",
+// "value": "2048"
+// },
+// "Methods": [],
+// "Name": "word",
+// "PkgPath": "gno.land/r/test"
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.TypeType"
+// },
+// "V": {
+// "@type": "/gno.TypeValue",
+// "Type": {
+// "@type": "/gno.DeclaredType",
+// "Base": {
+// "@type": "/gno.SliceType",
+// "Elt": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/test.word"
+// },
+// "Vrd": false
+// },
+// "Methods": [],
+// "Name": "nat",
+// "PkgPath": "gno.land/r/test"
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.TypeType"
+// },
+// "V": {
+// "@type": "/gno.TypeValue",
+// "Type": {
+// "@type": "/gno.DeclaredType",
+// "Base": {
+// "@type": "/gno.StructType",
+// "Fields": [
+// {
+// "Embedded": false,
+// "Name": "abs",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/test.nat"
+// }
+// }
+// ],
+// "PkgPath": "gno.land/r/test"
+// },
+// "Methods": [],
+// "Name": "Int",
+// "PkgPath": "gno.land/r/test"
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.FuncType",
+// "Params": [],
+// "Results": []
+// },
+// "V": {
+// "@type": "/gno.FuncValue",
+// "Closure": {
+// "@type": "/gno.RefValue",
+// "Escaped": true,
+// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:3"
+// },
+// "FileName": "main.gno",
+// "IsMethod": false,
+// "Name": "main",
+// "NativeName": "",
+// "NativePkg": "",
+// "PkgPath": "gno.land/r/test",
+// "Source": {
+// "@type": "/gno.RefNode",
+// "BlockNode": null,
+// "Location": {
+// "File": "main.gno",
+// "Line": "20",
+// "Nonce": "0",
+// "PkgPath": "gno.land/r/test"
+// }
+// },
+// "Type": {
+// "@type": "/gno.FuncType",
+// "Params": [],
+// "Results": []
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.PointerType",
+// "Elt": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/test.Int"
+// }
+// },
+// "V": {
+// "@type": "/gno.PointerValue",
+// "Base": null,
+// "Index": "0",
+// "TV": {
+// "T": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/test.Int"
+// },
+// "V": {
+// "@type": "/gno.RefValue",
+// "Hash": "91ebdb8ff6b68e0b93179fae022213185a450649",
+// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:4"
+// }
+// }
+// }
+// }
+// ]
+// }
diff --git a/gnovm/tests/files/assign_unnamed_type/more/recover6_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/recover6_filetest.gno
new file mode 100644
index 00000000000..0b304369764
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/recover6_filetest.gno
@@ -0,0 +1,30 @@
+package main
+
+import (
+ "errors"
+)
+
+func main() {
+ println(f(false))
+ println(f(true))
+}
+
+func f(dopanic bool) (err error) {
+ defer func() {
+ if x := recover(); x != nil {
+ err = x.(error)
+ }
+ }()
+ q(dopanic)
+ return
+}
+
+func q(dopanic bool) {
+ if dopanic {
+ panic(errors.New("wtf"))
+ }
+}
+
+// Output:
+// undefined
+// wtf
diff --git a/gnovm/tests/files/assign_unnamed_type/more/return2_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/return2_filetest.gno
new file mode 100644
index 00000000000..2bdfdb474fe
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/return2_filetest.gno
@@ -0,0 +1,16 @@
+package main
+
+func x() (int, int) {
+ return 1, 2
+}
+
+func main() {
+ var a, b int
+ a, b = x()
+ println(a)
+ println(b)
+}
+
+// Output:
+// 1
+// 2
diff --git a/gnovm/tests/files/assign_unnamed_type/more/return_interface1_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/return_interface1_filetest.gno
new file mode 100644
index 00000000000..9395426cfc8
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/return_interface1_filetest.gno
@@ -0,0 +1,15 @@
+package main
+
+func x1() interface{} {
+ a := "1"
+ return a
+}
+
+func main() {
+ var a uint
+ a = x1() // should fail
+ println("1")
+}
+
+// Error:
+// main/files/assign_unnamed_type/more/return_interface1_filetest.gno:10: cannot use interface{} as uint
diff --git a/gnovm/tests/files/assign_unnamed_type/more/return_interface_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/return_interface_filetest.gno
new file mode 100644
index 00000000000..8b5fdd7c728
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/return_interface_filetest.gno
@@ -0,0 +1,19 @@
+package main
+
+type nat []int
+
+func x() interface{} {
+ a := nat{0}
+ return a
+}
+
+func main() {
+ var a nat
+
+ a = x()
+
+ println(a)
+}
+
+// Error:
+// main/files/assign_unnamed_type/more/return_interface_filetest.gno:13: cannot use interface{} as []int
diff --git a/gnovm/tests/files/assign_unnamed_type/more/return_select_filetest.gno b/gnovm/tests/files/assign_unnamed_type/more/return_select_filetest.gno
new file mode 100644
index 00000000000..cf5be970423
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/more/return_select_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat []int
+
+func x() interface{} {
+ a := nat{0}
+ return a
+}
+
+func (n nat) double() nat {
+ m := append(n, n...)
+ return m
+}
+
+func main() {
+ a := x()
+
+ b := a.(nat).double().double()
+ println(a)
+ println(b)
+}
+
+// Output:
+// (slice[(0 int)] main.nat)
+// (slice[(0 int),(0 int),(0 int),(0 int)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/type40.gno b/gnovm/tests/files/assign_unnamed_type/type40.gno
new file mode 100644
index 00000000000..324b33290f5
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/type40.gno
@@ -0,0 +1,20 @@
+package main
+
+type Set map[string]struct{}
+
+func NewSet(items ...string) Set {
+ return map[string]struct{}{}
+}
+
+func (s Set) Has(key string) bool {
+ _, ok := s[key]
+ return ok
+}
+
+func main() {
+ s := NewSet()
+ println(s.Has("a"))
+}
+
+// Output:
+// false
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype0_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype0_filetest.gno
new file mode 100644
index 00000000000..5876111b324
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype0_filetest.gno
@@ -0,0 +1,17 @@
+package main
+
+type (
+ nat []word
+ word int
+)
+
+func main() {
+ var a nat
+ b := []word{0}
+ a = b
+
+ println(a)
+}
+
+// Output:
+// (slice[(0 main.word)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype0b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype0b_filetest.gno
new file mode 100644
index 00000000000..cc1d54cfa2a
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype0b_filetest.gno
@@ -0,0 +1,17 @@
+package main
+
+type (
+ nat []int
+ word int
+)
+
+func main() {
+ var a nat
+ b := []word{0}
+ a = b
+
+ println(a)
+}
+
+// Error:
+// main/files/assign_unnamed_type/unnamedtype0b_filetest.gno:11: cannot use main.word as int without explicit conversion
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype1_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype1_filetest.gno
new file mode 100644
index 00000000000..d8cb730f90f
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype1_filetest.gno
@@ -0,0 +1,24 @@
+package main
+
+type nat []int
+
+func main() {
+ var a nat
+ a = []int{0}
+ b := []int{1}
+
+ println(a)
+ println(b)
+
+ a = nat{0}
+ b = a
+
+ println(a)
+ println(b)
+}
+
+// Output:
+// (slice[(0 int)] main.nat)
+// slice[(1 int)]
+// (slice[(0 int)] main.nat)
+// slice[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype1a_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype1a_filetest.gno
new file mode 100644
index 00000000000..63cc382039e
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype1a_filetest.gno
@@ -0,0 +1,23 @@
+package main
+
+type nat []int
+
+func (n nat) zero(num []int) {
+ println(num)
+}
+
+func (n nat) one(num nat) {
+ println(num)
+}
+
+func main() {
+ var a nat
+ a = []int{}
+
+ a.zero(nat{0})
+ a.one([]int{1})
+}
+
+// Output:
+// slice[(0 int)]
+// (slice[(1 int)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype1b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype1b_filetest.gno
new file mode 100644
index 00000000000..c440cf974cd
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype1b_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type nat []int
+
+func (n nat) zero() nat {
+ return []int{0}
+}
+
+func (n nat) one() []int {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = []int{}
+
+ println(a.zero())
+ println(a.zero().zero())
+ println(a.zero().one())
+ println(a.one())
+}
+
+// Output:
+// (slice[(0 int)] main.nat)
+// (slice[(0 int)] main.nat)
+// slice[(1 int)]
+// slice[(1 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype1c_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype1c_filetest.gno
new file mode 100644
index 00000000000..aa5533bd0e8
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype1c_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat []int
+
+func (n nat) zero() interface{} {
+ return []int{0}
+}
+
+func (n nat) one() interface{} {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = []int{}
+
+ println(a.zero())
+ println(a.one())
+ println(a.one().(nat).zero())
+}
+
+// Output:
+// slice[(0 int)]
+// (slice[(1 int)] main.nat)
+// slice[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype2_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype2_filetest.gno
new file mode 100644
index 00000000000..132242f83ea
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype2_filetest.gno
@@ -0,0 +1,23 @@
+package main
+
+type nat [1]int
+
+func main() {
+ var a nat
+ a = [1]int{0}
+ b := [1]int{1}
+
+ println(a)
+ println(b)
+ a = nat{0}
+ b = a
+
+ println(a)
+ println(b)
+}
+
+// Output:
+// (array[(0 int)] main.nat)
+// array[(1 int)]
+// (array[(0 int)] main.nat)
+// array[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype2a_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype2a_filetest.gno
new file mode 100644
index 00000000000..5f25b9333ea
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype2a_filetest.gno
@@ -0,0 +1,23 @@
+package main
+
+type nat [1]int
+
+func (n nat) zero(num [1]int) {
+ println(num)
+}
+
+func (n nat) one(num nat) {
+ println(num)
+}
+
+func main() {
+ var a nat
+ a = [1]int{}
+
+ a.zero(nat{0})
+ a.one([1]int{1})
+}
+
+// Output:
+// array[(0 int)]
+// (array[(1 int)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype2b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype2b_filetest.gno
new file mode 100644
index 00000000000..0e7c4992fa5
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype2b_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type nat [1]int
+
+func (n nat) zero() nat {
+ return [1]int{0}
+}
+
+func (n nat) one() [1]int {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = [1]int{}
+
+ println(a.zero())
+ println(a.zero().zero())
+ println(a.zero().one())
+ println(a.one())
+}
+
+// Output:
+// (array[(0 int)] main.nat)
+// (array[(0 int)] main.nat)
+// array[(1 int)]
+// array[(1 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype2c_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype2c_filetest.gno
new file mode 100644
index 00000000000..9fc0e0f06a4
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype2c_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat [1]int
+
+func (n nat) zero() interface{} {
+ return [1]int{0}
+}
+
+func (n nat) one() interface{} {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = [1]int{}
+
+ println(a.zero())
+ println(a.one())
+ println(a.one().(nat).zero())
+}
+
+// Output:
+// array[(0 int)]
+// (array[(1 int)] main.nat)
+// array[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype3_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype3_filetest.gno
new file mode 100644
index 00000000000..ccc5cc2bb75
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype3_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat struct {
+ num int
+}
+
+func main() {
+ var a nat
+ a = struct{ num int }{0}
+ b := struct{ num int }{1}
+
+ println(a)
+ println(b)
+ a = nat{0}
+ b = a
+
+ println(a)
+ println(b)
+}
+
+// Output:
+// (struct{(0 int)} main.nat)
+// struct{(1 int)}
+// (struct{(0 int)} main.nat)
+// struct{(0 int)}
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype3a_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype3a_filetest.gno
new file mode 100644
index 00000000000..06c2e3f5a4d
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype3a_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat struct {
+ num int
+}
+
+func (n nat) zero(num struct{ num int }) {
+ println(num)
+}
+
+func (n nat) one(num nat) {
+ println(num)
+}
+
+func main() {
+ var a nat
+ a = struct{ num int }{0}
+
+ a.zero(nat{0})
+ a.one(struct{ num int }{1})
+}
+
+// Output:
+// struct{(0 int)}
+// (struct{(1 int)} main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype3b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype3b_filetest.gno
new file mode 100644
index 00000000000..e9c9b80418e
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype3b_filetest.gno
@@ -0,0 +1,29 @@
+package main
+
+type nat struct {
+ num int
+}
+
+func (n nat) zero() nat {
+ return struct{ num int }{0}
+}
+
+func (n nat) one() struct{ num int } {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = struct{ num int }{}
+
+ println(a.zero())
+ println(a.zero().zero())
+ println(a.zero().one())
+ println(a.one())
+}
+
+// Output:
+// (struct{(0 int)} main.nat)
+// (struct{(0 int)} main.nat)
+// struct{(1 int)}
+// struct{(1 int)}
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype3c_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype3c_filetest.gno
new file mode 100644
index 00000000000..5d506ab9566
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype3c_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type nat struct {
+ num int
+}
+
+func (n nat) zero() interface{} {
+ return struct{ num int }{0}
+}
+
+func (n nat) one() interface{} {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = struct{ num int }{}
+
+ println(a.zero())
+ println(a.one())
+ println(a.one().(nat).zero())
+}
+
+// Output:
+// struct{(0 int)}
+// (struct{(1 int)} main.nat)
+// struct{(0 int)}
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype4_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype4_filetest.gno
new file mode 100644
index 00000000000..f384f71975f
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype4_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type nat map[string]int
+
+func main() {
+ var a nat
+
+ a = map[string]int{
+ "zero": 0,
+ }
+ b := map[string]int{
+ "one": 1,
+ }
+ println(a)
+ println(b)
+
+ a = nat{"zeor": 0}
+ b = a
+ println(a)
+ println(b)
+}
+
+// Output:
+// (map{("zero" string):(0 int)} main.nat)
+// map{("one" string):(1 int)}
+// (map{("zeor" string):(0 int)} main.nat)
+// map{("zeor" string):(0 int)}
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype4a_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype4a_filetest.gno
new file mode 100644
index 00000000000..6c3b0856df9
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype4a_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type nat map[string]int
+
+func (n nat) zero(num map[string]int) {
+ println(num)
+}
+
+func (n nat) one(num nat) {
+ println(num)
+}
+
+func main() {
+ var a nat
+ a = map[string]int{
+ "zero": 0,
+ }
+
+ a.zero(nat{"zero": 0})
+ a.one(map[string]int{
+ "zero": 1,
+ })
+}
+
+// Output:
+// map{("zero" string):(0 int)}
+// (map{("zero" string):(1 int)} main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype4b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype4b_filetest.gno
new file mode 100644
index 00000000000..15975fc588e
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype4b_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type nat map[string]int
+
+func (n nat) zero() nat {
+ return map[string]int{"zero": 0}
+}
+
+func (n nat) one() map[string]int {
+ return nat{"one": 1}
+}
+
+func main() {
+ var a nat
+ a = map[string]int{"zero": 0}
+
+ println(a.zero())
+ println(a.zero().zero())
+ println(a.zero().one())
+ println(a.one())
+}
+
+// Output:
+// (map{("zero" string):(0 int)} main.nat)
+// (map{("zero" string):(0 int)} main.nat)
+// map{("one" string):(1 int)}
+// map{("one" string):(1 int)}
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype4c_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype4c_filetest.gno
new file mode 100644
index 00000000000..d6efcaded75
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype4c_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat map[string]int
+
+func (n nat) zero() interface{} {
+ return map[string]int{"zero": 0}
+}
+
+func (n nat) one() interface{} {
+ return nat{"one": 1}
+}
+
+func main() {
+ var a nat
+ a = map[string]int{"zero": 0}
+
+ println(a.zero())
+ println(a.one())
+ println(a.one().(nat).zero())
+}
+
+// Output:
+// map{("zero" string):(0 int)}
+// (map{("one" string):(1 int)} main.nat)
+// map{("zero" string):(0 int)}
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype5_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype5_filetest.gno
new file mode 100644
index 00000000000..583e2f12bd8
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype5_filetest.gno
@@ -0,0 +1,41 @@
+package main
+
+type op func(int) int
+
+func inc(n int) int {
+ n = n + 1
+ return n
+}
+
+func dec(n int) int {
+ n = n - 1
+ return n
+}
+
+func main() {
+ var a op
+ a = inc
+
+ b := func(n int) int {
+ return n
+ }
+ c := dec
+
+ println(a(0), a)
+ println(b(0), b)
+ println(c(0), c)
+
+ a, b, c = b, c, a
+
+ println(a(0), a)
+ println(b(0), b)
+ println(c(0), c)
+}
+
+// Output:
+// 1 (inc main.op)
+// 0
+// -1 dec
+// 0 ( main.op)
+// -1 dec
+// 1 inc
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype5a_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype5a_filetest.gno
new file mode 100644
index 00000000000..e14e64e4dfd
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype5a_filetest.gno
@@ -0,0 +1,32 @@
+package main
+
+type op func(int) int
+
+func exec1(opFn func(int) int) {
+ println(opFn)
+ println(opFn(0))
+}
+
+func exec2(opFn op) {
+ println(opFn)
+ println(opFn(0))
+}
+
+func main() {
+ var inc op
+ inc = func(n int) int {
+ n = n + 1
+ return n
+ }
+ dec := func(n int) int {
+ n = n - 1
+ return n
+ }
+ exec1(inc)
+ exec2(dec)
+}
+
+// Output:
+// 1
+// ( main.op)
+// -1
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype5b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype5b_filetest.gno
new file mode 100644
index 00000000000..80f8c224e6c
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype5b_filetest.gno
@@ -0,0 +1,30 @@
+package main
+
+type op func(int) int
+
+func popFn1() op {
+ return func(n int) int {
+ n = n + 1
+ return n
+ }
+}
+
+func popFn2() func(int) int {
+ var dec op
+
+ dec = func(n int) int {
+ n = n - 1
+ return n
+ }
+
+ return dec
+}
+
+func main() {
+ println(popFn1()(0))
+ println(popFn2()(0))
+}
+
+// Output:
+// 1
+// -1
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype5c_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype5c_filetest.gno
new file mode 100644
index 00000000000..aa5533bd0e8
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype5c_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat []int
+
+func (n nat) zero() interface{} {
+ return []int{0}
+}
+
+func (n nat) one() interface{} {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = []int{}
+
+ println(a.zero())
+ println(a.one())
+ println(a.one().(nat).zero())
+}
+
+// Output:
+// slice[(0 int)]
+// (slice[(1 int)] main.nat)
+// slice[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype6_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype6_filetest.gno
new file mode 100644
index 00000000000..41c72c390a1
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype6_filetest.gno
@@ -0,0 +1,24 @@
+package main
+
+type nat []interface{}
+
+func main() {
+ var a nat
+ a = []interface{}{0}
+ b := []interface{}{1}
+
+ println(a)
+ println(b)
+
+ a = nat{0}
+ b = a
+
+ println(a)
+ println(b)
+}
+
+// Output:
+// (slice[(0 int)] main.nat)
+// slice[(1 int)]
+// (slice[(0 int)] main.nat)
+// slice[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype6a_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype6a_filetest.gno
new file mode 100644
index 00000000000..37e3951df55
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype6a_filetest.gno
@@ -0,0 +1,24 @@
+package main
+
+type nat []interface{}
+
+func (n nat) zero(num []interface{}) {
+ println(num)
+}
+
+func (n nat) one(num nat) {
+ println(num)
+}
+
+func main() {
+ var a nat
+ a = []interface{}{}
+ println(a)
+ a.zero(nat{0})
+ a.one([]interface{}{1})
+}
+
+// Output:
+// (slice[] main.nat)
+// slice[(0 int)]
+// (slice[(1 int)] main.nat)
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype6b_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype6b_filetest.gno
new file mode 100644
index 00000000000..e57821f8b7d
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype6b_filetest.gno
@@ -0,0 +1,27 @@
+package main
+
+type nat []interface{}
+
+func (n nat) zero() nat {
+ return []interface{}{0}
+}
+
+func (n nat) one() []interface{} {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = []interface{}{}
+
+ println(a.zero())
+ println(a.zero().zero())
+ println(a.zero().one())
+ println(a.one())
+}
+
+// Output:
+// (slice[(0 int)] main.nat)
+// (slice[(0 int)] main.nat)
+// slice[(1 int)]
+// slice[(1 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype6c_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype6c_filetest.gno
new file mode 100644
index 00000000000..1c17c204fe8
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype6c_filetest.gno
@@ -0,0 +1,25 @@
+package main
+
+type nat []interface{}
+
+func (n nat) zero() interface{} {
+ return []interface{}{0}
+}
+
+func (n nat) one() interface{} {
+ return nat{1}
+}
+
+func main() {
+ var a nat
+ a = []interface{}{}
+
+ println(a.zero())
+ println(a.one())
+ println(a.one().(nat).zero())
+}
+
+// Output:
+// slice[(0 int)]
+// (slice[(1 int)] main.nat)
+// slice[(0 int)]
diff --git a/gnovm/tests/files/assign_unnamed_type/unnamedtype7_filetest.gno b/gnovm/tests/files/assign_unnamed_type/unnamedtype7_filetest.gno
new file mode 100644
index 00000000000..939428bd192
--- /dev/null
+++ b/gnovm/tests/files/assign_unnamed_type/unnamedtype7_filetest.gno
@@ -0,0 +1,15 @@
+package main
+
+type mychan chan int
+
+// chan int is unmamed
+func main() {
+ var n mychan = nil
+ var u chan int = nil
+ n = u
+
+ println(n)
+}
+
+// Output:
+// (nil main.mychan)
diff --git a/gnovm/tests/files/print1.gno b/gnovm/tests/files/print1.gno
index 606759a5c05..15c9e7bb278 100644
--- a/gnovm/tests/files/print1.gno
+++ b/gnovm/tests/files/print1.gno
@@ -6,4 +6,4 @@ func main() {
}
// Output:
-// nil []string
+// (nil []string)
diff --git a/gnovm/tests/files/zrealm_tests0.gno b/gnovm/tests/files/zrealm_tests0.gno
index 9542b5e8d1a..d68c1f652f7 100644
--- a/gnovm/tests/files/zrealm_tests0.gno
+++ b/gnovm/tests/files/zrealm_tests0.gno
@@ -23,7 +23,7 @@ func main() {
// Realm:
// switchrealm["gno.land/r/demo/tests"]
-// c[0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:10]={
+// c[0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:14]={
// "Fields": [
// {
// "T": {
@@ -37,13 +37,13 @@ func main() {
// }
// ],
// "ObjectInfo": {
-// "ID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:10",
+// "ID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:14",
// "ModTime": "0",
-// "OwnerID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:9",
+// "OwnerID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:13",
// "RefCount": "1"
// }
// }
-// c[0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:9]={
+// c[0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:13]={
// "Data": null,
// "List": [
// {
@@ -65,8 +65,8 @@ func main() {
// },
// "V": {
// "@type": "/gno.RefValue",
-// "Hash": "94c14b2efc4bb2f3c24ee42292f161fd1ebd72a3",
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
+// "Hash": "63ef2b51ca911a9b1727588bacb958ec3cb2a392",
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:10"
// }
// }
// }
@@ -90,8 +90,8 @@ func main() {
// },
// "V": {
// "@type": "/gno.RefValue",
-// "Hash": "1e36da78d1dc72e5cbac56c27590332574c89678",
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:8"
+// "Hash": "54c554e1d1f61e19feb13bb229f43540338c0f8f",
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:12"
// }
// }
// }
@@ -115,15 +115,15 @@ func main() {
// },
// "V": {
// "@type": "/gno.RefValue",
-// "Hash": "43b13870b750f78cda919fa13a5d955d297242bd",
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:10"
+// "Hash": "4e50e2cdaeb022a6fcbdb96d9fbd7f3af8df1379",
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:14"
// }
// }
// }
// }
// ],
// "ObjectInfo": {
-// "ID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:9",
+// "ID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:13",
// "ModTime": "0",
// "OwnerID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:2",
// "RefCount": "1"
@@ -134,8 +134,8 @@ func main() {
// "ObjectInfo": {
// "ID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:2",
// "IsEscaped": true,
-// "ModTime": "8",
-// "RefCount": "3"
+// "ModTime": "12",
+// "RefCount": "5"
// },
// "Parent": null,
// "Source": {
@@ -199,6 +199,157 @@ func main() {
// "Type": {
// "@type": "/gno.DeclaredType",
// "Base": {
+// "@type": "/gno.PrimitiveType",
+// "value": "2048"
+// },
+// "Methods": [],
+// "Name": "Word",
+// "PkgPath": "gno.land/r/demo/tests"
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.TypeType"
+// },
+// "V": {
+// "@type": "/gno.TypeValue",
+// "Type": {
+// "@type": "/gno.DeclaredType",
+// "Base": {
+// "@type": "/gno.SliceType",
+// "Elt": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.Word"
+// },
+// "Vrd": false
+// },
+// "Methods": [
+// {
+// "T": {
+// "@type": "/gno.FuncType",
+// "Params": [
+// {
+// "Embedded": false,
+// "Name": "n",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ],
+// "Results": [
+// {
+// "Embedded": false,
+// "Name": "",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ]
+// },
+// "V": {
+// "@type": "/gno.FuncValue",
+// "Closure": null,
+// "FileName": "realm_method38d.gno",
+// "IsMethod": true,
+// "Name": "Add",
+// "NativeName": "",
+// "NativePkg": "",
+// "PkgPath": "gno.land/r/demo/tests",
+// "Source": {
+// "@type": "/gno.RefNode",
+// "BlockNode": null,
+// "Location": {
+// "File": "realm_method38d.gno",
+// "Line": "5",
+// "Nonce": "0",
+// "PkgPath": "gno.land/r/demo/tests"
+// }
+// },
+// "Type": {
+// "@type": "/gno.FuncType",
+// "Params": [
+// {
+// "Embedded": false,
+// "Name": "n",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ],
+// "Results": [
+// {
+// "Embedded": false,
+// "Name": "",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ]
+// }
+// }
+// }
+// ],
+// "Name": "nat",
+// "PkgPath": "gno.land/r/demo/tests"
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.TypeType"
+// },
+// "V": {
+// "@type": "/gno.TypeValue",
+// "Type": {
+// "@type": "/gno.DeclaredType",
+// "Base": {
+// "@type": "/gno.StructType",
+// "Fields": [
+// {
+// "Embedded": false,
+// "Name": "neg",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.PrimitiveType",
+// "value": "4"
+// }
+// },
+// {
+// "Embedded": false,
+// "Name": "abs",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ],
+// "PkgPath": "gno.land/r/demo/tests"
+// },
+// "Methods": [],
+// "Name": "Int",
+// "PkgPath": "gno.land/r/demo/tests"
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.TypeType"
+// },
+// "V": {
+// "@type": "/gno.TypeValue",
+// "Type": {
+// "@type": "/gno.DeclaredType",
+// "Base": {
// "@type": "/gno.StructType",
// "Fields": [
// {
@@ -455,7 +606,17 @@ func main() {
// "T": {
// "@type": "/gno.FuncType",
// "Params": [],
-// "Results": []
+// "Results": [
+// {
+// "Embedded": false,
+// "Name": "",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ]
// },
// "V": {
// "@type": "/gno.FuncValue",
@@ -464,6 +625,164 @@ func main() {
// "Escaped": true,
// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
// },
+// "FileName": "realm_compositelit.gno",
+// "IsMethod": false,
+// "Name": "GetZeroType",
+// "NativeName": "",
+// "NativePkg": "",
+// "PkgPath": "gno.land/r/demo/tests",
+// "Source": {
+// "@type": "/gno.RefNode",
+// "BlockNode": null,
+// "Location": {
+// "File": "realm_compositelit.gno",
+// "Line": "19",
+// "Nonce": "0",
+// "PkgPath": "gno.land/r/demo/tests"
+// }
+// },
+// "Type": {
+// "@type": "/gno.FuncType",
+// "Params": [],
+// "Results": [
+// {
+// "Embedded": false,
+// "Name": "",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ]
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.FuncType",
+// "Params": [],
+// "Results": [
+// {
+// "Embedded": false,
+// "Name": "",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ]
+// },
+// "V": {
+// "@type": "/gno.FuncValue",
+// "Closure": {
+// "@type": "/gno.RefValue",
+// "Escaped": true,
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:5"
+// },
+// "FileName": "realm_method38d.gno",
+// "IsMethod": false,
+// "Name": "GetAbs",
+// "NativeName": "",
+// "NativePkg": "",
+// "PkgPath": "gno.land/r/demo/tests",
+// "Source": {
+// "@type": "/gno.RefNode",
+// "BlockNode": null,
+// "Location": {
+// "File": "realm_method38d.gno",
+// "Line": "9",
+// "Nonce": "0",
+// "PkgPath": "gno.land/r/demo/tests"
+// }
+// },
+// "Type": {
+// "@type": "/gno.FuncType",
+// "Params": [],
+// "Results": [
+// {
+// "Embedded": false,
+// "Name": "",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ]
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.FuncType",
+// "Params": [],
+// "Results": [
+// {
+// "Embedded": false,
+// "Name": "",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ]
+// },
+// "V": {
+// "@type": "/gno.FuncValue",
+// "Closure": {
+// "@type": "/gno.RefValue",
+// "Escaped": true,
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:5"
+// },
+// "FileName": "realm_method38d.gno",
+// "IsMethod": false,
+// "Name": "AbsAdd",
+// "NativeName": "",
+// "NativePkg": "",
+// "PkgPath": "gno.land/r/demo/tests",
+// "Source": {
+// "@type": "/gno.RefNode",
+// "BlockNode": null,
+// "Location": {
+// "File": "realm_method38d.gno",
+// "Line": "15",
+// "Nonce": "0",
+// "PkgPath": "gno.land/r/demo/tests"
+// }
+// },
+// "Type": {
+// "@type": "/gno.FuncType",
+// "Params": [],
+// "Results": [
+// {
+// "Embedded": false,
+// "Name": "",
+// "Tag": "",
+// "Type": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// }
+// ]
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.FuncType",
+// "Params": [],
+// "Results": []
+// },
+// "V": {
+// "@type": "/gno.FuncValue",
+// "Closure": {
+// "@type": "/gno.RefValue",
+// "Escaped": true,
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
+// },
// "FileName": "tests.gno",
// "IsMethod": false,
// "Name": "IncCounter",
@@ -508,7 +827,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -564,7 +883,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -620,7 +939,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -666,7 +985,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -712,7 +1031,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -758,7 +1077,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -804,7 +1123,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -863,7 +1182,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -912,7 +1231,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -948,7 +1267,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -984,7 +1303,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -1030,7 +1349,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -1086,7 +1405,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -1143,7 +1462,7 @@ func main() {
// "Closure": {
// "@type": "/gno.RefValue",
// "Escaped": true,
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:4"
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:6"
// },
// "FileName": "tests.gno",
// "IsMethod": false,
@@ -1192,8 +1511,8 @@ func main() {
// "@type": "/gno.SliceValue",
// "Base": {
// "@type": "/gno.RefValue",
-// "Hash": "5e5535af7afef6f523a897c051944639ef56c057",
-// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:9"
+// "Hash": "5f12a61dd16d828be8584debc0e395e8d2136acb",
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:13"
// },
// "Length": "3",
// "Maxcap": "3",
@@ -1202,6 +1521,37 @@ func main() {
// },
// {
// "T": {
+// "@type": "/gno.PointerType",
+// "Elt": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.Int"
+// }
+// },
+// "V": {
+// "@type": "/gno.PointerValue",
+// "Base": null,
+// "Index": "0",
+// "TV": {
+// "T": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.Int"
+// },
+// "V": {
+// "@type": "/gno.RefValue",
+// "Hash": "90b77781ec2b1e153ac020b1102354174bde972e",
+// "ObjectID": "0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:7"
+// }
+// }
+// }
+// },
+// {
+// "T": {
+// "@type": "/gno.RefType",
+// "ID": "gno.land/r/demo/tests.nat"
+// }
+// },
+// {
+// "T": {
// "@type": "/gno.PrimitiveType",
// "value": "32"
// }
@@ -1245,7 +1595,7 @@ func main() {
// }
// ]
// }
-// d[0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:7]
+// d[0ffe7732b4d549b4cf9ec18bd68641cd2c75ad0a:11]
// switchrealm["gno.land/r/demo/tests_foo"]
// switchrealm["gno.land/r/demo/tests_foo"]
// switchrealm["gno.land/r/demo/tests_foo"]