diff --git a/pkg/compiler/codegen.go b/pkg/compiler/codegen.go index b5cdc0480..e028b48d4 100644 --- a/pkg/compiler/codegen.go +++ b/pkg/compiler/codegen.go @@ -644,12 +644,12 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { return nil case *ast.SliceExpr: - if isCompoundSlice(c.typeOf(n.X.(*ast.Ident)).Underlying()) { + if isCompoundSlice(c.typeOf(n.X).Underlying()) { c.prog.Err = errors.New("subslices are supported only for []byte") return nil } - name := n.X.(*ast.Ident).Name - c.emitLoadVar("", name) + + ast.Walk(c, n.X) if n.Low != nil { ast.Walk(c, n.Low) diff --git a/pkg/compiler/slice_test.go b/pkg/compiler/slice_test.go index 82cb9c72c..4ce08291d 100644 --- a/pkg/compiler/slice_test.go +++ b/pkg/compiler/slice_test.go @@ -432,6 +432,16 @@ func TestSubsliceCompound(t *testing.T) { require.Error(t, err) } +func TestSubsliceFromStructField(t *testing.T) { + src := `package foo + type pair struct { key, value []byte } + func Main() []byte { + p := pair{ []byte{1}, []byte{4, 8, 15, 16, 23, 42} } + return p.value[2:4] + }` + eval(t, src, []byte{15, 16}) +} + func TestRemove(t *testing.T) { t.Run("Valid", func(t *testing.T) { src := `package foo