Repository: VKCOM/noverify (go)

Issue:
Panic on concurrent map writes
<!-- 
This is comment and will be hidden :)
Thanks for helping us create a better tool, you're awesome!
-->

**PHP Version:** 7.4

**OS:** macOS

**Run command:**

```shell
./vendor/bin/noverify check app
```


**The minimal code in which the bug appears:**

I don't think it's related to the actual code, but is a race condition. On a second run there was no crash.

**Actual Behavior:**

`fatal error: concurrent map writes` followed by a panic

**Expected Behavior:**

To run without an internal error, and produce a list of findings.


**[Optional] Details:**

Output:

```
17:22:39 Started
17:22:39 Indexing [app]
fatal error: concurrent map writes
fatal error: concurrent map writes

goroutine 24 [running]:
runtime.throw(0x17a4c46, 0x15)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/panic.go:1117 +0x72 fp=0xc004b72008 sp=0xc004b71fd8 pc=0x10375f2
runtime.mapdelete_faststr(0x169f600, 0xc00001ebd0, 0xc0071b9c10, 0x10)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/map_faststr.go:382 +0x3a8 fp=0xc004b72070 sp=0xc004b72008 pc=0x1014848
github.com/VKCOM/noverify/src/types.Map.Erase(...)
        /Users/petrmakhnev/noverify/src/types/map.go:351
github.com/VKCOM/noverify/src/linter.(*andWalker).EnterNode(0xc009224600, 0x18570b8, 0xc0041c6de0, 0xc0112f05b0)
        /Users/petrmakhnev/noverify/src/linter/and_walker.go:136 +0xaae fp=0xc004b721c8 sp=0xc004b72070 pc=0x151560e
github.com/VKCOM/noverify/src/ir.(*InstanceOfExpr).Walk(0xc0041c6de0, 0x1857ce8, 0xc009224600)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1045 +0x4b fp=0xc004b721f8 sp=0xc004b721c8 pc=0x114588b
github.com/VKCOM/noverify/src/ir.(*BooleanNotExpr).Walk(0xc0080c55e0, 0x1857ce8, 0xc009224600)
        /Users/petrmakhnev/noverify/src/ir/walk.go:383 +0xb2 fp=0xc004b72228 sp=0xc004b721f8 pc=0x1141952
github.com/VKCOM/noverify/src/linter.(*andWalker).EnterNode(0xc009224600, 0x1856820, 0xc0041c6d80, 0xc009224600)
        /Users/petrmakhnev/noverify/src/linter/and_walker.go:77 +0x17c4 fp=0xc004b72380 sp=0xc004b72228 pc=0x1516324
github.com/VKCOM/noverify/src/ir.(*BooleanAndExpr).Walk(0xc0041c6d80, 0x1857ce8, 0xc009224600)
        /Users/petrmakhnev/noverify/src/ir/walk.go:366 +0x4b fp=0xc004b723b0 sp=0xc004b72380 pc=0x11417cb
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf.func3()
        /Users/petrmakhnev/noverify/src/linter/block.go:1564 +0xf0 fp=0xc004b72460 sp=0xc004b723b0 pc=0x1565a30
github.com/VKCOM/noverify/src/linter.(*blockWalker).withSpecificContext(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:668
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf(0xc007e69ce0, 0xc00f485b90, 0xc00f485b00)
        /Users/petrmakhnev/noverify/src/linter/block.go:1556 +0x231 fp=0xc004b72680 sp=0xc004b72460 pc=0x1520831
github.com/VKCOM/noverify/src/linter.(*blockWalker).EnterNode(0xc007e69ce0, 0x1857040, 0xc00f485b90, 0xc00eddc900)
        /Users/petrmakhnev/noverify/src/linter/block.go:362 +0x1227 fp=0xc004b72770 sp=0xc004b72680 pc=0x1518a07
github.com/VKCOM/noverify/src/ir.(*IfStmt).Walk(0xc00f485b90, 0x1857d10, 0xc007e69ce0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1009 +0x4b fp=0xc004b727b8 sp=0xc004b72770 pc=0x114554b
github.com/VKCOM/noverify/src/linter.(*rootWalker).handleFuncStmts(0xc0106d5980, 0xc0041c76e0, 0x1, 0x1, 0x0, 0x0, 0x0, 0xc0041c6d50, 0x3, 0x3, ...)
        /Users/petrmakhnev/noverify/src/linter/root.go:444 +0x498 fp=0xc004b728f8 sp=0xc004b727b8 pc=0x154bcb8
github.com/VKCOM/noverify/src/linter.(*rootWalker).enterClassMethod(0xc0106d5980, 0xc010afc690, 0xc010afc690)
        /Users/petrmakhnev/noverify/src/linter/root.go:1050 +0x85e fp=0xc004b72e98 sp=0xc004b728f8 pc=0x1550a3e
github.com/VKCOM/noverify/src/linter.(*rootWalker).EnterNode(0xc0106d5980, 0x18569b0, 0xc010afc690, 0xc004b73501)
        /Users/petrmakhnev/noverify/src/linter/root.go:236 +0x180d fp=0xc004b735b0 sp=0xc004b72e98 pc=0x154982d
github.com/VKCOM/noverify/src/ir.(*ClassMethodStmt).Walk(0xc010afc690, 0x1857d38, 0xc0106d5980)
        /Users/petrmakhnev/noverify/src/ir/walk.go:490 +0x4b fp=0xc004b73608 sp=0xc004b735b0 pc=0x11423cb
github.com/VKCOM/noverify/src/ir.(*ClassStmt).Walk(0xc007e69c30, 0x1857d38, 0xc0106d5980)
        /Users/petrmakhnev/noverify/src/ir/walk.go:534 +0x189 fp=0xc004b73660 sp=0xc004b73608 pc=0x1142789
github.com/VKCOM/noverify/src/ir.(*Root).Walk(0xc0041c6ba0, 0x1857d38, 0xc0106d5980)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1533 +0xac fp=0xc004b736a8 sp=0xc004b73660 pc=0x114856c
github.com/VKCOM/noverify/src/linter.(*Worker).analyzeFile(0xc007a7c500, 0xc0092244e0, 0xc0041c6ba0, 0x3d3, 0x3d3, 0xc0092244e0)
        /Users/petrmakhnev/noverify/src/linter/worker.go:302 +0x4e5 fp=0xc004b73828 sp=0xc004b736a8 pc=0x1563665
github.com/VKCOM/noverify/src/linter.(*Worker).ParseContents(0xc007a7c500, 0xc005f7d5c0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:143 +0x5ce fp=0xc004b739d0 sp=0xc004b73828 pc=0x1561a6e
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc007a7c500, 0xc00288eb00, 0xa3, 0xc005f7d5c0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:161 +0x93 fp=0xc004b73ab0 sp=0xc004b739d0 pc=0x15621b3
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc007a7c500, 0xc005f7d5c0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c fp=0xc004b73cc0 sp=0xc004b73ab0 pc=0x156292c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc007a7c500, 0xc005f7d5c0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525 fp=0xc004b73e70 sp=0xc004b73cc0 pc=0x15630a5
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x4)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e fp=0xc004b73fa8 sp=0xc004b73e70 pc=0x156791e
runtime.goexit()
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/asm_amd64.s:1371 +0x1 fp=0xc004b73fb0 sp=0xc004b73fa8 pc=0x1070921
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc003fc3728)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/sema.go:56 +0x45
sync.(*WaitGroup).Wait(0xc003fc3720)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/sync/waitgroup.go:130 +0x65
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles(0xc00000c6a8, 0xc002ee91c0, 0x0, 0x0, 0x0, 0x0)
        /Users/petrmakhnev/noverify/src/linter/linter.go:110 +0x289
github.com/VKCOM/noverify/src/linter.(*Linter).AnalyzeFiles(...)
        /Users/petrmakhnev/noverify/src/linter/linter.go:62
github.com/VKCOM/noverify/src/cmd.parseIndexOnlyFiles(0xc002867c98)
        /Users/petrmakhnev/noverify/src/cmd/git_main.go:32 +0xfa
github.com/VKCOM/noverify/src/cmd.mainNoExit(0xc00060f200, 0x0, 0x0, 0x0)
        /Users/petrmakhnev/noverify/src/cmd/main.go:214 +0x548
github.com/VKCOM/noverify/src/cmd.Check(0xc00060f200, 0xc00001e1d0, 0x1, 0x1)
        /Users/petrmakhnev/noverify/src/cmd/check.go:43 +0x26f
github.com/VKCOM/noverify/src/cmd.(*App).Run(0xc000257f80, 0xc000030de0, 0x1, 0xc00000ebd0, 0x1)
        /Users/petrmakhnev/noverify/src/cmd/cli.go:354 +0x57f
github.com/VKCOM/noverify/src/cmd.Run(0xc000030de0, 0xc000165f58, 0x10f6a12, 0xc000078050)
        /Users/petrmakhnev/noverify/src/cmd/main.go:128 +0x2bb
github.com/VKCOM/noverify/src/cmd.Main(0x0)
        /Users/petrmakhnev/noverify/src/cmd/main.go:133 +0x2f
main.main()
        /Users/petrmakhnev/noverify/main.go:14 +0x45

goroutine 16 [select]:
github.com/VKCOM/noverify/src/linter.MemoryLimiterThread(0x1400000)
        /Users/petrmakhnev/noverify/src/linter/limits.go:33 +0xf3
created by github.com/VKCOM/noverify/src/cmd.mainNoExit
        /Users/petrmakhnev/noverify/src/cmd/main.go:198 +0x313

goroutine 20 [runnable]:
syscall.syscall(0x10b97a0, 0x17, 0xc002c177d8, 0x0, 0x0, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/sys_darwin.go:19 +0x2e
syscall.Fstat(0x17, 0xc002c177d8, 0x106ba88, 0xc0001a3200)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/syscall/zsyscall_darwin_amd64.go:1969 +0x5c
os.newFile.func1(...)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_unix.go:147
os.ignoringEINTR(...)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_posix.go:245
os.newFile(0x17, 0xc008fda000, 0xa4, 0x1, 0x17)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_unix.go:146 +0x152
os.openFileNolog(0xc008fda000, 0xa4, 0x601, 0x1b6, 0x0, 0xc008fda000, 0x6e)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_unix.go:240 +0x1d7
os.OpenFile(0xc008fda000, 0xa4, 0x601, 0x1b6, 0x0, 0xc008fda000, 0xa4)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file.go:331 +0x65
github.com/VKCOM/noverify/src/linter.createMetaCacheFile(0xc013549e60, 0x53, 0xc0197d43c0, 0xa0, 0xc000602600, 0x0, 0x0)
        /Users/petrmakhnev/noverify/src/linter/cache.go:90 +0x111
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc00832c0a0, 0xc0197d43c0, 0xa0, 0xc013549e60, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:165 +0x165
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc00832c0a0, 0xc013549e60, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc00832c0a0, 0xc013549e60, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x0)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 19 [chan send]:
github.com/VKCOM/noverify/src/workspace.readFilenames.func1(0xc00c3ee360, 0x5e, 0x185e2b0, 0xc007b87540, 0x0, 0x0, 0xc002861668, 0x10d11f4)
        /Users/petrmakhnev/noverify/src/workspace/files.go:108 +0x7df
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0xc00c3ee360, 0x5e, 0x185e2b0, 0xc007b87540, 0xc002861ee8, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:66 +0x77
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0xc0133a9a80, 0x3d, 0x185e2b0, 0xc007b86c40, 0xc002861ee8, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:85 +0x2a5
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0xc0133a9940, 0x35, 0x185e2b0, 0xc003ac9800, 0xc002861ee8, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:85 +0x2a5
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0xc0160da780, 0x2f, 0x185e2b0, 0xc003ac9700, 0xc002861ee8, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:85 +0x2a5
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0xc0160da720, 0x27, 0x185e2b0, 0xc0022b6ec0, 0xc002861ee8, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:85 +0x2a5
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0xc0113f12a0, 0x1d, 0x185e2b0, 0xc0022b69c0, 0xc002861ee8, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:85 +0x2a5
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0xc0113f1220, 0x19, 0x185e2b0, 0xc0022b6700, 0xc002861ee8, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:85 +0x2a5
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0xc00c15dbf0, 0x9, 0x185e2b0, 0xc002c51d80, 0xc002861ee8, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:85 +0x2a5
io/fs.walkDir(0x1852ca0, 0xc002b943a0, 0x173db6e, 0x1, 0x185e1d0, 0xc002b943b0, 0xc002861ee8, 0x0, 0x100b27b)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:85 +0x2a5
io/fs.WalkDir(0x1852ca0, 0xc002b943a0, 0x173db6e, 0x1, 0xc00066eee8, 0x0, 0x16cab20)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/io/fs/walk.go:112 +0x1b9
github.com/VKCOM/noverify/src/workspace.readFilenames(0xc0066c7380, 0xc003f9ec60, 0x27, 0x0, 0xc00009d200, 0x4, 0x4)
        /Users/petrmakhnev/noverify/src/workspace/files.go:72 +0x265
github.com/VKCOM/noverify/src/workspace.ReadFilenames.func1(0xc0066c7380)
        /Users/petrmakhnev/noverify/src/workspace/files.go:17 +0xa8
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func2(0xc002ee91c0, 0xc0066c7380)
        /Users/petrmakhnev/noverify/src/linter/linter.go:85 +0x30
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:84 +0x17f

goroutine 21 [runnable]:
github.com/VKCOM/noverify/src/phpdoctypes.(*TypeConverter).mapType(0xc0079b6af0, 0x600000002, 0xc0093d20e1, 0x6, 0x1e26578, 0x0, 0x0, 0xc0093d3221, 0x6, 0x100000001e26578)
        /Users/petrmakhnev/noverify/src/phpdoctypes/converter.go:65 +0x1545
github.com/VKCOM/noverify/src/phpdoctypes.(*TypeConverter).mapType(0xc0079b6af0, 0xb0000000c, 0xc0093d20e1, 0xb, 0xc009351560, 0x2, 0x2, 0x55, 0x32d0000002f, 0x6f7c00000000)
        /Users/petrmakhnev/noverify/src/phpdoctypes/converter.go:132 +0xde9
github.com/VKCOM/noverify/src/phpdoctypes.ToRealType(0xc0098853e0, 0xc0093d20e1, 0xb, 0xb0000000c, 0xc0093d20e1, 0xb, 0xc009351560, 0x2, 0x2, 0x0)
        /Users/petrmakhnev/noverify/src/phpdoctypes/converter.go:31 +0xd3
github.com/VKCOM/noverify/src/linter.(*rootWalker).parsePHPDocVar(0xc00728e600, 0xc0093d20d8, 0x17, 0xc009884410, 0x1, 0x1, 0x0, 0x17ccf88, 0x0)
        /Users/petrmakhnev/noverify/src/linter/root.go:830 +0x12e
github.com/VKCOM/noverify/src/linter.(*rootWalker).enterPropertyList(0xc00728e600, 0xc0098a4bb0, 0xc0098a4bb0)
        /Users/petrmakhnev/noverify/src/linter/root.go:874 +0x3dc
github.com/VKCOM/noverify/src/linter.(*rootWalker).EnterNode(0xc00728e600, 0x1857658, 0xc0098a4bb0, 0xc0079b7501)
        /Users/petrmakhnev/noverify/src/linter/root.go:232 +0x10ca
github.com/VKCOM/noverify/src/ir.(*PropertyListStmt).Walk(0xc0098a4bb0, 0x1857d38, 0xc00728e600)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1477 +0x4b
github.com/VKCOM/noverify/src/ir.(*ClassStmt).Walk(0xc0098a51e0, 0x1857d38, 0xc00728e600)
        /Users/petrmakhnev/noverify/src/ir/walk.go:534 +0x189
github.com/VKCOM/noverify/src/ir.(*Root).Walk(0xc00fffc780, 0x1857d38, 0xc00728e600)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1533 +0xac
github.com/VKCOM/noverify/src/linter.(*Worker).analyzeFile(0xc0067beeb0, 0xc009ed08a0, 0xc00fffc780, 0x770a, 0x770a, 0xc009ed08a0)
        /Users/petrmakhnev/noverify/src/linter/worker.go:302 +0x4e5
github.com/VKCOM/noverify/src/linter.(*Worker).ParseContents(0xc0067beeb0, 0xc012622420, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:143 +0x5ce
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc0067beeb0, 0xc003b0cb00, 0xa2, 0xc012622420, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:161 +0x93
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc0067beeb0, 0xc012622420, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc0067beeb0, 0xc012622420, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x1)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 22 [runnable]:
github.com/VKCOM/php-parser/internal/php8.(*Lexer).setTokenPosition(0xc00b661ec0, 0xc00c12c6c0)
        /Users/petrmakhnev/go/pkg/mod/github.com/!v!k!c!o!m/php-parser@v0.8.0-rc.2.0.20210802093708-d85f5a481602/internal/php8/lexer.go:49 +0x185
github.com/VKCOM/php-parser/internal/php8.(*Lexer).Lex(0xc00b661ec0, 0xc00c12c680)
        /Users/petrmakhnev/go/pkg/mod/github.com/!v!k!c!o!m/php-parser@v0.8.0-rc.2.0.20210802093708-d85f5a481602/internal/php8/scanner.go:21714 +0x202d0
github.com/VKCOM/php-parser/internal/php8.(*Parser).Lex(0xc013e3efc0, 0xc007cfe000, 0xe038)
        /Users/petrmakhnev/go/pkg/mod/github.com/!v!k!c!o!m/php-parser@v0.8.0-rc.2.0.20210802093708-d85f5a481602/internal/php8/parser.go:31 +0x2e
github.com/VKCOM/php-parser/internal/php8.yylex1(0x18580d0, 0xc013e3efc0, 0xc007cfe000, 0xe038, 0x3a)
        /Users/petrmakhnev/go/pkg/mod/github.com/!v!k!c!o!m/php-parser@v0.8.0-rc.2.0.20210802093708-d85f5a481602/internal/php8/php8.go:2360 +0x56
github.com/VKCOM/php-parser/internal/php8.(*yyParserImpl).Parse(0xc007cfe000, 0x18580d0, 0xc013e3efc0, 0x0)
        /Users/petrmakhnev/go/pkg/mod/github.com/!v!k!c!o!m/php-parser@v0.8.0-rc.2.0.20210802093708-d85f5a481602/internal/php8/php8.go:2445 +0x2d0b5
github.com/VKCOM/php-parser/internal/php8.yyParse(...)
        /Users/petrmakhnev/go/pkg/mod/github.com/!v!k!c!o!m/php-parser@v0.8.0-rc.2.0.20210802093708-d85f5a481602/internal/php8/php8.go:2394
github.com/VKCOM/php-parser/internal/php8.(*Parser).Parse(0xc013e3efc0, 0xc002c206e0)
        /Users/petrmakhnev/go/pkg/mod/github.com/!v!k!c!o!m/php-parser@v0.8.0-rc.2.0.20210802093708-d85f5a481602/internal/php8/parser.go:51 +0x73
github.com/VKCOM/php-parser/pkg/parser.Parse(0xc00b350000, 0xa2f7, 0xa2f7, 0xc000026d70, 0xc002c206d0, 0x0, 0x0, 0x1041bfc, 0xc009b82c00)
        /Users/petrmakhnev/go/pkg/mod/github.com/!v!k!c!o!m/php-parser@v0.8.0-rc.2.0.20210802093708-d85f5a481602/pkg/parser/parser.go:59 +0xd8e
github.com/VKCOM/noverify/src/linter.(*Worker).ParseContents(0xc00458d2c0, 0xc0126223c0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:126 +0x4b5
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc00458d2c0, 0xc0029cb550, 0xa3, 0xc0126223c0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:161 +0x93
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc00458d2c0, 0xc0126223c0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc00458d2c0, 0xc0126223c0, 0x56, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x2)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 23 [runnable]:
syscall.syscall(0x10b9540, 0xc008f8a420, 0xc0197a06e0, 0x0, 0x0, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/sys_darwin.go:19 +0x2e
syscall.Rename(0xc0197a0500, 0xa0, 0xc01926af00, 0x9c, 0x1851dc0, 0xc003de18f0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/syscall/zsyscall_darwin_amd64.go:1308 +0x119
os.rename.func1(...)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_unix.go:42
os.ignoringEINTR(...)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_posix.go:245
os.rename(0xc0197a0500, 0xa0, 0xc01926af00, 0x9c, 0xc0158270e0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_unix.go:41 +0xa7
os.Rename(...)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file.go:348
github.com/VKCOM/noverify/src/linter.createMetaCacheFile(0xc009da3f40, 0x4f, 0xc01926af00, 0x9c, 0xc0088a0480, 0x0, 0x0)
        /Users/petrmakhnev/noverify/src/linter/cache.go:111 +0x27e
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc005bb3860, 0xc01926af00, 0x9c, 0xc009da3f40, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:165 +0x165
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc005bb3860, 0xc009da3f40, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc005bb3860, 0xc009da3f40, 0x4f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x3)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 25 [runnable]:
github.com/VKCOM/noverify/src/types.Map.Clone(0xc00ed47f00, 0xc00ba73a70, 0xc006de5660, 0xc)
        /Users/petrmakhnev/noverify/src/types/map.go:245 +0x127
github.com/VKCOM/noverify/src/meta.(*Scope).Clone(0xc0158284d0, 0xc00bede700)
        /Users/petrmakhnev/noverify/src/meta/scope.go:356 +0x148
github.com/VKCOM/noverify/src/linter.copyBlockContext(0xc015165480, 0xc00bede700)
        /Users/petrmakhnev/noverify/src/linter/block_context.go:76 +0x45
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf(0xc00d28fce0, 0xc00d987290, 0xc00d987200)
        /Users/petrmakhnev/noverify/src/linter/block.go:1555 +0x169
github.com/VKCOM/noverify/src/linter.(*blockWalker).EnterNode(0xc00d28fce0, 0x1857040, 0xc00d987290, 0xc00d28fce0)
        /Users/petrmakhnev/noverify/src/linter/block.go:362 +0x1227
github.com/VKCOM/noverify/src/ir.(*IfStmt).Walk(0xc00d987290, 0x1857d10, 0xc00d28fce0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1009 +0x4b
github.com/VKCOM/noverify/src/ir.(*StmtList).Walk(0xc011a41e90, 0x1857d10, 0xc00d28fce0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1677 +0xac
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf.func4(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:1576
github.com/VKCOM/noverify/src/linter.(*blockWalker).withSpecificContext(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:668
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf(0xc00d28fce0, 0xc00d986510, 0xc00d986500)
        /Users/petrmakhnev/noverify/src/linter/block.go:1575 +0x33f
github.com/VKCOM/noverify/src/linter.(*blockWalker).EnterNode(0xc00d28fce0, 0x1857040, 0xc00d986510, 0xc015804876)
        /Users/petrmakhnev/noverify/src/linter/block.go:362 +0x1227
github.com/VKCOM/noverify/src/ir.(*IfStmt).Walk(0xc00d986510, 0x1857d10, 0xc00d28fce0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1009 +0x4b
github.com/VKCOM/noverify/src/linter.(*rootWalker).handleFuncStmts(0xc00c017b00, 0xc00c45ebd0, 0x1, 0x1, 0x0, 0x0, 0x0, 0xc01593ae00, 0x38, 0x38, ...)
        /Users/petrmakhnev/noverify/src/linter/root.go:444 +0x498
github.com/VKCOM/noverify/src/linter.(*rootWalker).enterClassMethod(0xc00c017b00, 0xc00be673b0, 0xc00be673b0)
        /Users/petrmakhnev/noverify/src/linter/root.go:1050 +0x85e
github.com/VKCOM/noverify/src/linter.(*rootWalker).EnterNode(0xc00c017b00, 0x18569b0, 0xc00be673b0, 0xc0079b7500)
        /Users/petrmakhnev/noverify/src/linter/root.go:236 +0x180d
github.com/VKCOM/noverify/src/ir.(*ClassMethodStmt).Walk(0xc00be673b0, 0x1857d38, 0xc00c017b00)
        /Users/petrmakhnev/noverify/src/ir/walk.go:490 +0x4b
github.com/VKCOM/noverify/src/ir.(*ClassStmt).Walk(0xc00b5113f0, 0x1857d38, 0xc00c017b00)
        /Users/petrmakhnev/noverify/src/ir/walk.go:534 +0x189
github.com/VKCOM/noverify/src/ir.(*Root).Walk(0xc012252450, 0x1857d38, 0xc00c017b00)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1533 +0xac
github.com/VKCOM/noverify/src/linter.(*Worker).analyzeFile(0xc00458dbd0, 0xc00d1d5440, 0xc012252450, 0xd38b, 0xd38b, 0xc00d1d5440)
        /Users/petrmakhnev/noverify/src/linter/worker.go:302 +0x4e5
github.com/VKCOM/noverify/src/linter.(*Worker).ParseContents(0xc00458dbd0, 0xc011efd620, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:143 +0x5ce
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc00458dbd0, 0xc00bd48aa0, 0x9e, 0xc011efd620, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:161 +0x93
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc00458dbd0, 0xc011efd620, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc00458dbd0, 0xc011efd620, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x5)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 26 [runnable]:
encoding/gob.encBool(0xc00242c480, 0xc0094f4800, 0x167a860, 0xc00db41e48, 0x81)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:174 +0xee
encoding/gob.(*Encoder).encodeStruct(0xc00e6e1720, 0xc00e6e1758, 0xc002410660, 0x16cb200, 0xc00db41e48, 0x99)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:328 +0x256
encoding/gob.encOpFor.func4(0xc00244a480, 0xc0094f47c0, 0x16cb200, 0xc00db41e48, 0x99)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:581 +0xac
encoding/gob.(*Encoder).encodeStruct(0xc00e6e1720, 0xc00e6e1758, 0xc002410630, 0x1718d40, 0xc00db41dd0, 0x99)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:328 +0x256
encoding/gob.encOpFor.func4(0x0, 0xc0094f4780, 0x1718d40, 0xc00db41dd0, 0x99)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:581 +0xac
encoding/gob.encodeReflectValue(0xc0094f4780, 0x1718d40, 0xc00db41dd0, 0x99, 0xc002960760, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:363 +0xd6
encoding/gob.(*Encoder).encodeMap(0xc00e6e1720, 0xc00e6e1758, 0x169d7a0, 0xc00e6e1ab0, 0x95, 0x17cc078, 0xc002960760, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:375 +0x23b
encoding/gob.encOpFor.func3(0xc002460720, 0xc0094f4740, 0x169d7a0, 0xc00e6e1ab0, 0x95)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:571 +0xaa
encoding/gob.(*Encoder).encodeStruct(0xc00e6e1720, 0xc00e6e1758, 0xc002410618, 0x16ecc20, 0xc00e6e1ab0, 0x99)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:328 +0x256
encoding/gob.encOpFor.func4(0xc00244a750, 0xc0094f45c0, 0x16ecc20, 0xc00e6e1ab0, 0x99)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:581 +0xac
encoding/gob.(*Encoder).encodeStruct(0xc00e6e1720, 0xc00e6e1758, 0xc0024105d0, 0x171f360, 0xc00e6e1a40, 0x99)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:328 +0x256
encoding/gob.encOpFor.func4(0x0, 0xc0094f4580, 0x171f360, 0xc00e6e1a40, 0x99)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:581 +0xac
encoding/gob.encodeReflectValue(0xc0094f4580, 0x171f360, 0xc00e6e1a40, 0x99, 0xc0029607c0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:363 +0xd6
encoding/gob.(*Encoder).encodeMap(0xc00e6e1720, 0xc00e6e1758, 0x169d740, 0xc0007026f0, 0x195, 0x17cc078, 0xc0029607c0, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:375 +0x23b
encoding/gob.encOpFor.func3(0xc002460840, 0xc0094f4540, 0x169d740, 0xc0007026f0, 0x195)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:571 +0xaa
encoding/gob.(*Encoder).encodeStruct(0xc00e6e1720, 0xc00e6e1758, 0xc0024105b8, 0x16ecb60, 0xc0007026f0, 0x199)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:328 +0x256
encoding/gob.encOpFor.func4(0xc000508c30, 0xc0094f4500, 0x16ecb60, 0xc0007026f0, 0x199)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:581 +0xac
encoding/gob.(*Encoder).encodeStruct(0xc00e6e1720, 0xc00e6e1758, 0xc0024105a0, 0x17061e0, 0xc0007026e8, 0x199)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:328 +0x256
encoding/gob.(*Encoder).encode(0xc00e6e1720, 0xc00e6e1758, 0x166b440, 0xc0007026e8, 0x16, 0xc000190400)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encode.go:701 +0x205
encoding/gob.(*Encoder).EncodeValue(0xc00e6e1720, 0x166b440, 0xc0007026e8, 0x16, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encoder.go:251 +0x399
encoding/gob.(*Encoder).Encode(0xc00e6e1720, 0x166b440, 0xc0007026e8, 0x0, 0xc0094f4440)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/encoding/gob/encoder.go:176 +0xa9
github.com/VKCOM/noverify/src/linter.writeMetaCache(0xc0094f4440, 0xc000702600, 0x1000, 0xc009d1c000)
        /Users/petrmakhnev/noverify/src/linter/cache.go:74 +0x96
github.com/VKCOM/noverify/src/linter.createMetaCacheFile(0xc005f7d500, 0x59, 0xc003a95600, 0xa6, 0xc000702600, 0x0, 0x0)
        /Users/petrmakhnev/noverify/src/linter/cache.go:98 +0x212
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc00458ddb0, 0xc003a95600, 0xa6, 0xc005f7d500, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:165 +0x165
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc00458ddb0, 0xc005f7d500, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc00458ddb0, 0xc005f7d500, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x6)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 27 [runnable]:
syscall.syscall(0x10b9540, 0xc008f74160, 0xc008f742c0, 0x0, 0x0, 0x0, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/sys_darwin.go:19 +0x2e
syscall.Rename(0xc013bb1d90, 0xaa, 0xc00288e420, 0xa6, 0x1851dc0, 0xc010809200)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/syscall/zsyscall_darwin_amd64.go:1308 +0x119
os.rename.func1(...)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_unix.go:42
os.ignoringEINTR(...)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_posix.go:245
os.rename(0xc013bb1d90, 0xaa, 0xc00288e420, 0xa6, 0xc0145c3a58, 0x0)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file_unix.go:41 +0xa7
os.Rename(...)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/os/file.go:348
github.com/VKCOM/noverify/src/linter.createMetaCacheFile(0xc019a92e40, 0x59, 0xc00288e420, 0xa6, 0xc000581c80, 0x0, 0x0)
        /Users/petrmakhnev/noverify/src/linter/cache.go:111 +0x27e
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc00458db80, 0xc00288e420, 0xa6, 0xc019a92e40, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:165 +0x165
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc00458db80, 0xc019a92e40, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc00458db80, 0xc019a92e40, 0x59, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x7)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 28 [runnable]:
github.com/VKCOM/noverify/src/linter.(*blockWalker).addStatement(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:148
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleSwitch.func1()
        /Users/petrmakhnev/noverify/src/linter/block.go:1765 +0x34b
github.com/VKCOM/noverify/src/linter.(*blockWalker).withNewContext(0xc008b1f8c0, 0xc01492bc98, 0xc00969e940)
        /Users/petrmakhnev/noverify/src/linter/block.go:657 +0x5c
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleSwitch(0xc008b1f8c0, 0xc00c500400, 0xc00c500400)
        /Users/petrmakhnev/noverify/src/linter/block.go:1761 +0x2cf
github.com/VKCOM/noverify/src/linter.(*blockWalker).EnterNode(0xc008b1f8c0, 0x1857928, 0xc00c500400, 0x1e26578)
        /Users/petrmakhnev/noverify/src/linter/block.go:364 +0x1327
github.com/VKCOM/noverify/src/ir.(*SwitchStmt).Walk(0xc00c500400, 0x1857d10, 0xc008b1f8c0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1690 +0x4b
github.com/VKCOM/noverify/src/ir.(*StmtList).Walk(0xc00d2f4d50, 0x1857d10, 0xc008b1f8c0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1677 +0xac
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf.func4(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:1576
github.com/VKCOM/noverify/src/linter.(*blockWalker).withSpecificContext(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:668
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf(0xc008b1f8c0, 0xc011a27b00, 0xc011a27b00)
        /Users/petrmakhnev/noverify/src/linter/block.go:1575 +0x33f
github.com/VKCOM/noverify/src/linter.(*blockWalker).EnterNode(0xc008b1f8c0, 0x1857040, 0xc011a27b00, 0xc008b1f8c0)
        /Users/petrmakhnev/noverify/src/linter/block.go:362 +0x1227
github.com/VKCOM/noverify/src/ir.(*IfStmt).Walk(0xc011a27b00, 0x1857d10, 0xc008b1f8c0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1009 +0x4b
github.com/VKCOM/noverify/src/ir.(*StmtList).Walk(0xc00d2f4b10, 0x1857d10, 0xc008b1f8c0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1677 +0xac
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf.func4(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:1576
github.com/VKCOM/noverify/src/linter.(*blockWalker).withSpecificContext(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:668
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf(0xc008b1f8c0, 0xc011a27a70, 0xc011a27a00)
        /Users/petrmakhnev/noverify/src/linter/block.go:1575 +0x33f
github.com/VKCOM/noverify/src/linter.(*blockWalker).EnterNode(0xc008b1f8c0, 0x1857040, 0xc011a27a70, 0xc00f461ef4)
        /Users/petrmakhnev/noverify/src/linter/block.go:362 +0x1227
github.com/VKCOM/noverify/src/ir.(*IfStmt).Walk(0xc011a27a70, 0x1857d10, 0xc008b1f8c0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1009 +0x4b
github.com/VKCOM/noverify/src/linter.(*rootWalker).handleFuncStmts(0xc002eedb00, 0xc015503860, 0x2, 0x2, 0x0, 0x0, 0x0, 0xc00d2f4930, 0x3, 0x3, ...)
        /Users/petrmakhnev/noverify/src/linter/root.go:444 +0x498
github.com/VKCOM/noverify/src/linter.(*rootWalker).enterClassMethod(0xc002eedb00, 0xc005f90d20, 0xc005f90d20)
        /Users/petrmakhnev/noverify/src/linter/root.go:1050 +0x85e
github.com/VKCOM/noverify/src/linter.(*rootWalker).EnterNode(0xc002eedb00, 0x18569b0, 0xc005f90d20, 0xc01492d500)
        /Users/petrmakhnev/noverify/src/linter/root.go:236 +0x180d
github.com/VKCOM/noverify/src/ir.(*ClassMethodStmt).Walk(0xc005f90d20, 0x1857d38, 0xc002eedb00)
        /Users/petrmakhnev/noverify/src/ir/walk.go:490 +0x4b
github.com/VKCOM/noverify/src/ir.(*ClassStmt).Walk(0xc008b1f340, 0x1857d38, 0xc002eedb00)
        /Users/petrmakhnev/noverify/src/ir/walk.go:534 +0x189
github.com/VKCOM/noverify/src/ir.(*Root).Walk(0xc011f18660, 0x1857d38, 0xc002eedb00)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1533 +0xac
github.com/VKCOM/noverify/src/linter.(*Worker).analyzeFile(0xc00832c140, 0xc0096a4de0, 0xc011f18660, 0x4d80, 0x4d80, 0xc0096a4de0)
        /Users/petrmakhnev/noverify/src/linter/worker.go:302 +0x4e5
github.com/VKCOM/noverify/src/linter.(*Worker).ParseContents(0xc00832c140, 0xc00ab607d0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:143 +0x5ce
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc00832c140, 0xc019492a00, 0x9d, 0xc00ab607d0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:161 +0x93
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc00832c140, 0xc00ab607d0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc00832c140, 0xc00ab607d0, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x8)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 29 [runnable]:
github.com/VKCOM/noverify/src/linter.(*parseWaiter).Finish(0xc0145718a8)
        /Users/petrmakhnev/noverify/src/linter/limits.go:62 +0x39
github.com/VKCOM/noverify/src/linter.(*Worker).ParseContents(0xc00832c0f0, 0xc015ccf680, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc011168cc0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:157 +0x77a
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc00832c0f0, 0xc0197c8320, 0x99, 0xc015ccf680, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:161 +0x93
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc00832c0f0, 0xc015ccf680, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc00832c0f0, 0xc015ccf680, 0x4c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0x9)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 30 [runnable]:
github.com/VKCOM/noverify/src/linter.(*parseWaiter).Finish(0xc00275f8a8)
        /Users/petrmakhnev/noverify/src/linter/limits.go:62 +0x39
github.com/VKCOM/noverify/src/linter.(*Worker).ParseContents(0xc0067bef00, 0xc013549f20, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc00cd3b290, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:157 +0x77a
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc0067bef00, 0xc008f9fce0, 0xa4, 0xc013549f20, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:161 +0x93
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc0067bef00, 0xc013549f20, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc0067bef00, 0xc013549f20, 0x57, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0xa)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 31 [running]:
        goroutine running on other thread; stack unavailable
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f

goroutine 31 [running]:
runtime.throw(0x17a4c46, 0x15)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/panic.go:1117 +0x72 fp=0xc00a747e50 sp=0xc00a747e20 pc=0x10375f2
runtime.mapdelete_faststr(0x169f600, 0xc00001ebd0, 0xc0086d5810, 0xd)
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/map_faststr.go:382 +0x3a8 fp=0xc00a747eb8 sp=0xc00a747e50 pc=0x1014848
github.com/VKCOM/noverify/src/types.Map.Erase(...)
        /Users/petrmakhnev/noverify/src/types/map.go:351
github.com/VKCOM/noverify/src/linter.(*andWalker).EnterNode(0xc0095eecc0, 0x18570b8, 0xc008efacc0, 0xc00a748058)
        /Users/petrmakhnev/noverify/src/linter/and_walker.go:136 +0xaae fp=0xc00a748010 sp=0xc00a747eb8 pc=0x151560e
github.com/VKCOM/noverify/src/ir.(*InstanceOfExpr).Walk(0xc008efacc0, 0x1857ce8, 0xc0095eecc0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1045 +0x4b fp=0xc00a748040 sp=0xc00a748010 pc=0x114588b
github.com/VKCOM/noverify/src/ir.(*BooleanNotExpr).Walk(0xc009c049a0, 0x1857ce8, 0xc0095eecc0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:383 +0xb2 fp=0xc00a748070 sp=0xc00a748040 pc=0x1141952
github.com/VKCOM/noverify/src/linter.(*andWalker).EnterNode(0xc0095eecc0, 0x1856820, 0xc008efac90, 0xc0159f0680)
        /Users/petrmakhnev/noverify/src/linter/and_walker.go:77 +0x17c4 fp=0xc00a7481c8 sp=0xc00a748070 pc=0x1516324
github.com/VKCOM/noverify/src/ir.(*BooleanAndExpr).Walk(0xc008efac90, 0x1857ce8, 0xc0095eecc0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:366 +0x4b fp=0xc00a7481f8 sp=0xc00a7481c8 pc=0x11417cb
github.com/VKCOM/noverify/src/ir.(*ParenExpr).Walk(0xc008efac30, 0x1857ce8, 0xc0095eecc0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1382 +0xb2 fp=0xc00a748228 sp=0xc00a7481f8 pc=0x11477f2
github.com/VKCOM/noverify/src/linter.(*andWalker).EnterNode(0xc0095eecc0, 0x1856820, 0xc008efab70, 0xc0095eecc0)
        /Users/petrmakhnev/noverify/src/linter/and_walker.go:77 +0x17c4 fp=0xc00a748380 sp=0xc00a748228 pc=0x1516324
github.com/VKCOM/noverify/src/ir.(*BooleanAndExpr).Walk(0xc008efab70, 0x1857ce8, 0xc0095eecc0)
        /Users/petrmakhnev/noverify/src/ir/walk.go:366 +0x4b fp=0xc00a7483b0 sp=0xc00a748380 pc=0x11417cb
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf.func3()
        /Users/petrmakhnev/noverify/src/linter/block.go:1564 +0xf0 fp=0xc00a748460 sp=0xc00a7483b0 pc=0x1565a30
github.com/VKCOM/noverify/src/linter.(*blockWalker).withSpecificContext(...)
        /Users/petrmakhnev/noverify/src/linter/block.go:668
github.com/VKCOM/noverify/src/linter.(*blockWalker).handleIf(0xc009c32370, 0xc00dbb25a0, 0xc00dbb2500)
        /Users/petrmakhnev/noverify/src/linter/block.go:1556 +0x231 fp=0xc00a748680 sp=0xc00a748460 pc=0x1520831
github.com/VKCOM/noverify/src/linter.(*blockWalker).EnterNode(0xc009c32370, 0x1857040, 0xc00dbb25a0, 0xc00dbb2ea0)
        /Users/petrmakhnev/noverify/src/linter/block.go:362 +0x1227 fp=0xc00a748770 sp=0xc00a748680 pc=0x1518a07
github.com/VKCOM/noverify/src/ir.(*IfStmt).Walk(0xc00dbb25a0, 0x1857d10, 0xc009c32370)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1009 +0x4b fp=0xc00a7487b8 sp=0xc00a748770 pc=0x114554b
github.com/VKCOM/noverify/src/linter.(*rootWalker).handleFuncStmts(0xc005064300, 0xc008efb8c0, 0x1, 0x1, 0x0, 0x0, 0x0, 0xc008efab40, 0x3, 0x3, ...)
        /Users/petrmakhnev/noverify/src/linter/root.go:444 +0x498 fp=0xc00a7488f8 sp=0xc00a7487b8 pc=0x154bcb8
github.com/VKCOM/noverify/src/linter.(*rootWalker).enterClassMethod(0xc005064300, 0xc0072ebc20, 0xc0072ebc20)
        /Users/petrmakhnev/noverify/src/linter/root.go:1050 +0x85e fp=0xc00a748e98 sp=0xc00a7488f8 pc=0x1550a3e
github.com/VKCOM/noverify/src/linter.(*rootWalker).EnterNode(0xc005064300, 0x18569b0, 0xc0072ebc20, 0xc00a749501)
        /Users/petrmakhnev/noverify/src/linter/root.go:236 +0x180d fp=0xc00a7495b0 sp=0xc00a748e98 pc=0x154982d
github.com/VKCOM/noverify/src/ir.(*ClassMethodStmt).Walk(0xc0072ebc20, 0x1857d38, 0xc005064300)
        /Users/petrmakhnev/noverify/src/ir/walk.go:490 +0x4b fp=0xc00a749608 sp=0xc00a7495b0 pc=0x11423cb
github.com/VKCOM/noverify/src/ir.(*ClassStmt).Walk(0xc009c322c0, 0x1857d38, 0xc005064300)
        /Users/petrmakhnev/noverify/src/ir/walk.go:534 +0x189 fp=0xc00a749660 sp=0xc00a749608 pc=0x1142789
github.com/VKCOM/noverify/src/ir.(*Root).Walk(0xc008efa8d0, 0x1857d38, 0xc005064300)
        /Users/petrmakhnev/noverify/src/ir/walk.go:1533 +0xac fp=0xc00a7496a8 sp=0xc00a749660 pc=0x114856c
github.com/VKCOM/noverify/src/linter.(*Worker).analyzeFile(0xc00703bcc0, 0xc0095eeba0, 0xc008efa8d0, 0x48c, 0x48c, 0xc0095eeba0)
        /Users/petrmakhnev/noverify/src/linter/worker.go:302 +0x4e5 fp=0xc00a749828 sp=0xc00a7496a8 pc=0x1563665
github.com/VKCOM/noverify/src/linter.(*Worker).ParseContents(0xc00703bcc0, 0xc013549ec0, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:143 +0x5ce fp=0xc00a7499d0 sp=0xc00a749828 pc=0x1561a6e
github.com/VKCOM/noverify/src/linter.(*Worker).parseWithCache(0xc00703bcc0, 0xc019237f40, 0xa0, 0xc013549ec0, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:161 +0x93 fp=0xc00a749ab0 sp=0xc00a7499d0 pc=0x15621b3
github.com/VKCOM/noverify/src/linter.(*Worker).IndexFile(0xc00703bcc0, 0xc013549ec0, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:216 +0x66c fp=0xc00a749cc0 sp=0xc00a749ab0 pc=0x156292c
github.com/VKCOM/noverify/src/linter.(*Worker).doParseFile(0xc00703bcc0, 0xc013549ec0, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/petrmakhnev/noverify/src/linter/worker.go:251 +0x525 fp=0xc00a749e70 sp=0xc00a749cc0 pc=0x15630a5
github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles.func3(0xc0066c7300, 0xc00000c6a8, 0x0, 0xc0066c7380, 0xc0066c73e0, 0xc003fc3720, 0xb)
        /Users/petrmakhnev/noverify/src/linter/linter.go:104 +0x21e fp=0xc00a749fa8 sp=0xc00a749e70 pc=0x156791e
runtime.goexit()
        /opt/homebrew/Cellar/go/1.16.6/libexec/src/runtime/asm_amd64.s:1371 +0x1 fp=0xc00a749fb0 sp=0xc00a749fa8 pc=0x1070921
created by github.com/VKCOM/noverify/src/linter.(*Linter).analyzeFiles
        /Users/petrmakhnev/noverify/src/linter/linter.go:94 +0x25f
```


Pull request:
linter, ir: fixed panic on `catch` without variable and `types.Map.Erase` method
Fixes #1141 

Patch:
diff --git a/src/ir/irconv/irconv.go b/src/ir/irconv/irconv.go
index eddd51b..c7de850 100644
--- a/src/ir/irconv/irconv.go
+++ b/src/ir/irconv/irconv.go
@@ -1426,7 +1426,9 @@ func (c *Converter) convNode(n ast.Vertex) ir.Node {
 		out.CloseCurlyBracketTkn = n.CloseCurlyBracketTkn
 
 		out.Types = c.convNodeSlice(n.Types)
-		out.Variable = c.convNode(n.Var).(*ir.SimpleVar)
+		if n.Var != nil {
+			out.Variable = c.convNode(n.Var).(*ir.SimpleVar)
+		}
 		out.Stmts = c.convNodeSlice(n.Stmts)
 		return out
 
diff --git a/src/ir/node_types.go b/src/ir/node_types.go
index 9e31c15..690929a 100644
--- a/src/ir/node_types.go
+++ b/src/ir/node_types.go
@@ -933,7 +933,7 @@ type CatchStmt struct {
 	OpenParenthesisTkn   *token.Token
 	Types                []Node
 	SeparatorTkns        []*token.Token
-	Variable             *SimpleVar
+	Variable             Node
 	CloseParenthesisTkn  *token.Token
 	OpenCurlyBracketTkn  *token.Token
 	Stmts                []Node
diff --git a/src/phpgrep/matcher.go b/src/phpgrep/matcher.go
index d0bc492..f6244b4 100644
--- a/src/phpgrep/matcher.go
+++ b/src/phpgrep/matcher.go
@@ -357,7 +357,7 @@ func (m *matcher) eqNode(state *matcherState, x, y ir.Node) bool {
 		return ok && m.eqNode(state, x.Expr, y.Expr)
 	case *ir.CatchStmt:
 		y, ok := y.(*ir.CatchStmt)
-		return ok && m.eqSimpleVar(state, x.Variable, y.Variable) &&
+		return ok && m.eqNode(state, x.Variable, y.Variable) &&
 			m.eqNodeSlice(state, x.Types, y.Types) &&
 			m.eqNodeSlice(state, x.Stmts, y.Stmts)
 	case *ir.TryStmt:
diff --git a/src/types/map.go b/src/types/map.go
index 63b6d1b..efe2ee1 100644
--- a/src/types/map.go
+++ b/src/types/map.go
@@ -348,8 +348,16 @@ func (m Map) Erase(typ string) Map {
 	if m.Len() == 0 {
 		return m
 	}
-	delete(m.m, typ)
-	return m
+
+	mm := make(map[string]struct{}, m.Len())
+	for k, v := range m.m {
+		if k == typ {
+			continue
+		}
+		mm[k] = v
+	}
+
+	return Map{m: mm}
 }
 
 // Find applies a predicate function to every contained type.


Test patch:
diff --git a/src/tests/checkers/catch_test.go b/src/tests/checkers/catch_test.go
index 22b9142..2a9217f 100644
--- a/src/tests/checkers/catch_test.go
+++ b/src/tests/checkers/catch_test.go
@@ -226,3 +226,13 @@ function f() {
 	}
 	test.RunAndMatch()
 }
+
+func TestCatchWithoutVariable(t *testing.T) {
+	test := linttest.NewSuite(t)
+	test.AddFile(`<?php
+try {}
+catch (Exception) {}
+`)
+	test.Expect = []string{}
+	test.RunAndMatch()
+}
diff --git a/src/tests/exprtype/exprtype_test.go b/src/tests/exprtype/exprtype_test.go
index a884f42..b1c3006 100644
--- a/src/tests/exprtype/exprtype_test.go
+++ b/src/tests/exprtype/exprtype_test.go
@@ -3271,13 +3271,13 @@ function f2($a) {
   if ((($a = new Foo) || ($a = new Boo)) && $a instanceof Foo) {
     exprtype($a, "\Foo");
   } else {
-    exprtype($a, "precise \Boo");
+    exprtype($a, "\Boo");
   }
 
   if ((($a = new Foo) || ($a = 10)) && $a instanceof Foo) {
     exprtype($a, "\Foo");
   } else {
-    exprtype($a, "precise int");
+    exprtype($a, "int");
   }
 
   exprtype($add_res, "int");