diff --git a/pkg/compiler/codegen.go b/pkg/compiler/codegen.go index b9faf3c5d..fb5c75ef6 100644 --- a/pkg/compiler/codegen.go +++ b/pkg/compiler/codegen.go @@ -1313,7 +1313,11 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { } else { emit.Opcodes(c.prog.BinWriter, opcode.DUP) } - c.emitStoreVar("", n.Key.(*ast.Ident).Name) + keyIdent := n.Key.(*ast.Ident) + if n.Tok == token.DEFINE { + c.scope.newLocal(keyIdent.Name) + } + c.emitStoreVar("", keyIdent.Name) } if needValue { if !isMap || !keyLoaded { @@ -1327,7 +1331,11 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { opcode.SWAP, // key should be on top opcode.PICKITEM) } - c.emitStoreVar("", n.Value.(*ast.Ident).Name) + valIdent := n.Value.(*ast.Ident) + if n.Tok == token.DEFINE { + c.scope.newLocal(valIdent.Name) + } + c.emitStoreVar("", valIdent.Name) } ast.Walk(c, n.Body) diff --git a/pkg/compiler/for_test.go b/pkg/compiler/for_test.go index a07cad913..c7bd36cc1 100644 --- a/pkg/compiler/for_test.go +++ b/pkg/compiler/for_test.go @@ -714,6 +714,32 @@ var forLoopTestCases = []testCase{ `, big.NewInt(6), }, + { + "shadow range key", + `func F%d() int { + i := 10 + ints := []int{1, 2, 3, 4, 5} + for i := range ints { + _ = i + } + return i + } + `, + big.NewInt(10), + }, + { + "shadow range value", + `func F%d() int { + i := 10 + ints := []int{1, 2, 3, 4, 5} + for _, i := range ints { + _ = i + } + return i + } + `, + big.NewInt(10), + }, } func TestForLoop(t *testing.T) {