compiler: allow to use multiple underscores in func arguments

It should still be present in the argument array in VM so just don't
save them in the map.

Signed-off-by: Evgeniy Stratonikov <evgeniy@nspcc.ru>
This commit is contained in:
Evgeniy Stratonikov 2021-09-30 10:18:31 +03:00
parent fb31a81fd2
commit 8d562cef99
2 changed files with 18 additions and 0 deletions

View file

@ -313,3 +313,14 @@ func TestJumpOptimize(t *testing.T) {
require.Equal(t, b[mi.Range.End], byte(opcode.RET)) require.Equal(t, b[mi.Range.End], byte(opcode.RET))
} }
} }
func TestFunctionUnusedParameters(t *testing.T) {
src := `package foo
func add13(a int, _ int, _1 int, _ int) int {
return a + _1
}
func Main() int {
return add13(1, 10, 100, 1000)
}`
eval(t, src, big.NewInt(101))
}

View file

@ -2,6 +2,7 @@ package compiler
import ( import (
"go/ast" "go/ast"
"strconv"
) )
type varScope struct { type varScope struct {
@ -70,6 +71,12 @@ func (c *varScope) newVariable(t varType, name string) int {
case varLocal: case varLocal:
return c.newLocal(name) return c.newLocal(name)
case varArgument: case varArgument:
if name == "_" {
// See #2204. This name won't actually be referenced.
// This approach simplifies argument allocation and
// makes debugging easier.
name = "%_" + strconv.FormatUint(uint64(len(c.arguments)), 10)
}
_, ok := c.arguments[name] _, ok := c.arguments[name]
if ok { if ok {
panic("argument is already allocated") panic("argument is already allocated")