Repository navigation
Commit 1105b2d
committed
Keep the terminated iterations' scope after an unrolled constant-array
- ForeachHandler::tryProcessUnrolledConstantArrayForeach() collects the
end scope of every non-optional iteration whose body never reaches the
next iteration. When no chain scope and no break scope remain (the code
after the loop is unreachable), these scopes become the end scope.
Previously the end scope stayed null, and the caller fell back to the
generic loop pass. That pass sees the loop variable as the union of all
values, so the subject lost its narrowing to `never`. This was a
regression from 003d601.
- Ported the same change to the turbo-ext mirror (ForeachHandler.cpp).
- Analogous constructs: while/for/do-while loops are not unrolled, and
the generic foreach path already falls back to the body result scope
(`$finalScope ??= $finalScopeResult->getScope()`), so only the unrolled
path was affected.foreach when no iteration leaves the loop1 parent acd0511 commit 1105b2d
3 files changed
Lines changed: 86 additions & 0 deletions
File tree
- src/Analyser/StmtHandler
- tests/PHPStan/Analyser/nsrt
- turbo-ext/src
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
724 | 724 | | |
725 | 725 | | |
726 | 726 | | |
| 727 | + | |
727 | 728 | | |
728 | 729 | | |
729 | 730 | | |
| |||
807 | 808 | | |
808 | 809 | | |
809 | 810 | | |
| 811 | + | |
810 | 812 | | |
811 | 813 | | |
812 | 814 | | |
| |||
853 | 855 | | |
854 | 856 | | |
855 | 857 | | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
856 | 866 | | |
857 | 867 | | |
858 | 868 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1503 | 1503 | | |
1504 | 1504 | | |
1505 | 1505 | | |
| 1506 | + | |
1506 | 1507 | | |
1507 | 1508 | | |
1508 | 1509 | | |
| |||
1635 | 1636 | | |
1636 | 1637 | | |
1637 | 1638 | | |
| 1639 | + | |
| 1640 | + | |
| 1641 | + | |
| 1642 | + | |
| 1643 | + | |
| 1644 | + | |
1638 | 1645 | | |
1639 | 1646 | | |
1640 | 1647 | | |
| |||
1692 | 1699 | | |
1693 | 1700 | | |
1694 | 1701 | | |
| 1702 | + | |
| 1703 | + | |
| 1704 | + | |
| 1705 | + | |
| 1706 | + | |
| 1707 | + | |
| 1708 | + | |
| 1709 | + | |
1695 | 1710 | | |
1696 | 1711 | | |
1697 | 1712 | | |
| |||
0 commit comments