Commit 1865530
Fix ObjectType::equals() treating generic and non-generic types as equal
- ObjectType::equals(GenericObjectType) incorrectly returned true when both had the same class name, because it didn't check whether generic type arguments differed
- This caused MutatingScope::mergeWith() native type optimization to replace native types (e.g. ArrayObject) with PHPDoc-enriched types (e.g. ArrayObject<string, string>), contaminating native type tracking after any branch merge
- With treatPhpDocTypesAsCertain: false, this led to false "will always evaluate to true" errors for is_string/is_int checks on foreach values from generic objects
- Added get_class equality check in ObjectType::equals() which also subsumes the old instanceof EnumCaseObjectType check
- Removed now-unneeded baseline entry for the EnumCaseObjectType instanceof check
- New regression test in tests/PHPStan/Rules/Comparison/data/bug-14429.php1 parent 3a4c0e2 commit 1865530
File tree
4 files changed
+52
-7
lines changed- src/Type
- tests/PHPStan/Rules/Comparison
- data
4 files changed
+52
-7
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1473 | 1473 | | |
1474 | 1474 | | |
1475 | 1475 | | |
1476 | | - | |
1477 | | - | |
1478 | | - | |
1479 | | - | |
1480 | | - | |
1481 | | - | |
1482 | 1476 | | |
1483 | 1477 | | |
1484 | 1478 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
| 59 | + | |
59 | 60 | | |
60 | 61 | | |
61 | 62 | | |
| |||
628 | 629 | | |
629 | 630 | | |
630 | 631 | | |
631 | | - | |
| 632 | + | |
632 | 633 | | |
633 | 634 | | |
634 | 635 | | |
| |||
Lines changed: 7 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1207 | 1207 | | |
1208 | 1208 | | |
1209 | 1209 | | |
| 1210 | + | |
| 1211 | + | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
1210 | 1217 | | |
| 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 | + | |
0 commit comments