False positive `paramOut.unusedType` when using `unset(...)` inside of if condition.
Bug report
Since PHPstan 2.1.34, it declares that one of @param-out union type is never assigned, so it can be removed, but it is a possible return type. If I remove the type that's apparently never assigned, I get the opposite error that the @param-out type is too narrow.
/** * * @param array{ * key1: int * } $item * * @param-out array{ * key1: int * }|array{ * key2: float * } $item * */ function example(array &$item): void { if (!empty($item["key1"])) { $item['key2'] = 1.00; unset($item["key1"]); } }
Error:
Function example() never assigns array{key1: int} to &$item so it can be removed from the @param-out type.
Code snippet that reproduces the problem
https://phpstan.org/r/12b15a19-d9c7-4dae-b7b7-029b2b8cc4cc
Expected output
If the if condition is false, then key1 key will still be set, and so the @param-out type is correct
Did PHPStan help you today? Did it make you happy in any way?
Great work as always!