Skip to content

Commit d01c12d

Browse files
authored
checkers: fix unlambda panic on variadic func literals (#992)
Fixes #991 Signed-off-by: Iskander Sharipov <[email protected]>
1 parent d2bb441 commit d01c12d

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

checkers/testdata/unlambda/positive_tests.go

+30
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,36 @@ func functionLiterals() {
2222
_ = func(x int, y int) int { return add(x, y) }
2323
}
2424

25+
func variadicInt(xs ...int) int { return 0 }
26+
27+
func variadicTest() {
28+
_ = func(x int) int { return variadicInt(x) }
29+
_ = func(x int) int { return variadicInt(x, 1) }
30+
_ = func(x, y int) int { return variadicInt(x, y) }
31+
_ = func(x, y int) int { return variadicInt(x) }
32+
33+
/*! replace `func(xs ...int) int { return variadicInt(xs...) }` with `variadicInt` */
34+
_ = func(xs ...int) int { return variadicInt(xs...) }
35+
36+
_ = func(x int, ys ...int) int { return variadicInt(1, 2) }
37+
_ = func(x int, y int, _ ...int) int { return variadicInt(x, y) }
38+
}
39+
40+
func variadicInterfaces(x int, y interface{}, ys ...interface{}) int { return 0 }
41+
42+
func TestSomething() {
43+
// See #991
44+
_ = func(x int, y interface{}, _ ...interface{}) int {
45+
return variadicInterfaces(x, y)
46+
}
47+
_ = func(x int, y interface{}, _ ...interface{}) int {
48+
return variadicInterfaces(x, y, 5, "?")
49+
}
50+
51+
/*! replace `func(x int, y interface{}, zs ...interface{}) int { return variadicInterfaces(x, y, zs...) }` with `variadicInterfaces` */
52+
_ = func(x int, y interface{}, zs ...interface{}) int { return variadicInterfaces(x, y, zs...) }
53+
}
54+
2555
type object struct{}
2656

2757
func (object) returnInt(x int) int { return x }

checkers/unlambda_checker.go

+9
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package checkers
22

33
import (
44
"go/ast"
5+
"go/token"
56
"go/types"
67

78
"github.com/go-critic/go-critic/checkers/internal/astwalk"
@@ -61,6 +62,14 @@ func (c *unlambdaChecker) VisitExpr(x ast.Expr) {
6162
// Now check that all arguments match the parameters.
6263
n := 0
6364
for _, params := range fn.Type.Params.List {
65+
if _, ok := params.Type.(*ast.Ellipsis); ok {
66+
if result.Ellipsis == token.NoPos {
67+
return
68+
}
69+
n++
70+
continue
71+
}
72+
6473
for _, id := range params.Names {
6574
if !astequal.Expr(id, result.Args[n]) {
6675
return

0 commit comments

Comments
 (0)