Skip to content

Staticcheck panics "unreachable" when calling a function in a slice wrapped in parens #1400

@dakota-doordash

Description

@dakota-doordash

Staticcheck version:
staticcheck 2023.1.3 (v0.4.3)

Staticcheck debug version:

staticcheck 2023.1.3 (v0.4.3)

Compiled with Go version: go1.20
Main module:
       honnef.co/go/tools@v0.4.3 (sum: h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw=)
Dependencies:
       github.com/BurntSushi/toml@v1.2.1 (sum: h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=)
       golang.org/x/exp/typeparams@v0.0.0-20221208152030-732eee02a75a (sum: h1:Jw5wfR+h9mnIYH+OtGT2im5wV1YGGDora5vTv/aa5bE=)
       golang.org/x/mod@v0.7.0 (sum: h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=)
       golang.org/x/sys@v0.3.0 (sum: h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=)
       golang.org/x/tools@v0.4.1-0.20221208213631-3f74d914ae6d (sum: h1:9ZNWAi4CYhNv60mXGgAncgq7SGc5qa7C8VZV8Tg7Ggs=)

Go version:
go version go1.20 darwin/arm64

Command:
staticcheck ./...

Output:

panic: unreachable

goroutine 780 [running]:
honnef.co/go/tools/pattern.Symbol.Match({{0x104817358?, 0x104aeb0f8?}}, 0x1400226ac00, {0x1047a2600, 0x140000fb710})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/pattern/match.go:577 +0x698
honnef.co/go/tools/pattern.match(0x1400226ac00, {0x1047c3ae0?, 0x1400006fea0?}, {0x1047a2600?, 0x140000fb710?})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/pattern/match.go:194 +0xccc
honnef.co/go/tools/pattern.Binding.Match({{0x10468bee7, 0x3}, {0x104817ad8, 0x1400006fea0}, 0x0}, 0x1400226ac00, {0x1047a2600, 0x140000fb710})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/pattern/match.go:453 +0x108
honnef.co/go/tools/pattern.match(0x1400226ac00, {0x1047e4340?, 0x140000953b0?}, {0x1047a2600?, 0x140000fb710?})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/pattern/match.go:194 +0xccc
honnef.co/go/tools/pattern.matchNodeAST(0x14001b15998?, {0x104817498?, 0x1400008f9a0}, {0x1047a1b80?, 0x14000d90a80?})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/pattern/match.go:369 +0x6a0
honnef.co/go/tools/pattern.match(0x1400226ac00, {0x1047c8b00?, 0x1400008f9a0?}, {0x1047a1b80?, 0x14000d90a80?})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/pattern/match.go:199 +0xca8
honnef.co/go/tools/pattern.(*Matcher).Match(0x1400226ac00, {{0x104817498, 0x1400008f9a0}, 0x140000953e0, {0x14000092f10, 0x1, 0x1}}, {0x104816458?, 0x14000d90a80})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/pattern/match.go:129 +0x12c
honnef.co/go/tools/analysis/code.Match(...)
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/analysis/code/visit.go:33
honnef.co/go/tools/staticcheck.CheckNilContext.func1({0x104816458?, 0x14000d90a80?})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/staticcheck/lint.go:2341 +0xd0
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder(0x140029160f0, {0x140000dc5e8?, 0x1?, 0x1042ec040?}, 0x14000e2fdf8)
        <redacted>/go/pkg/mod/golang.org/x/tools@v0.4.1-0.20221208213631-3f74d914ae6d/go/ast/inspector/inspector.go:77 +0x9c
honnef.co/go/tools/analysis/code.Preorder(...)
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/analysis/code/visit.go:16
honnef.co/go/tools/staticcheck.CheckNilContext(0x1400244e1e0)
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/staticcheck/lint.go:2367 +0x354
honnef.co/go/tools/lintcmd/runner.(*analyzerRunner).do(0x140018aa0f0, {0x1048195f0?, 0x140000bd9a0})
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/lintcmd/runner/runner.go:992 +0x660
honnef.co/go/tools/lintcmd/runner.genericHandle({0x1048195f0?, 0x140000bd9a0}, {0x1048195f0?, 0x1400147a460?}, 0x0?, 0x140004239f0, 0x14002912390)
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/lintcmd/runner/runner.go:817 +0x11c
created by honnef.co/go/tools/lintcmd/runner.(*subrunner).runAnalyzers
        <redacted>/go/pkg/mod/honnef.co/go/tools@v0.4.3/lintcmd/runner/runner.go:1061 +0x5bc

Sample code:

func main() {
	foo := []func(){
		func() {},
	}
	(foo)[0]()
}

AST:

     0  *ast.IndexExpr {
     1  .  X: *ast.ParenExpr {
     2  .  .  Lparen: 41566427
     3  .  .  X: *ast.Ident {
     4  .  .  .  NamePos: 41566428
     5  .  .  .  Name: "foo"
     6  .  .  .  Obj: nil
     7  .  .  }
     8  .  .  Rparen: 41566431
     9  .  }
    10  .  Lbrack: 41566432
    11  .  Index: *ast.BasicLit {
    12  .  .  ValuePos: 41566433
    13  .  .  Kind: INT
    14  .  .  Value: "0"
    15  .  }
    16  .  Rbrack: 41566434
    17  }

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions