Skip to content

Commit

Permalink
Fix loose comparison between '1' and '+1'
Browse files Browse the repository at this point in the history
  • Loading branch information
thg2k authored Aug 8, 2024
1 parent ce28abd commit 6ee5c22
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 3 deletions.
3 changes: 0 additions & 3 deletions src/Reflection/InitializerExprTypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -1370,9 +1370,6 @@ public function resolveEqualType(Type $leftType, Type $rightType): BooleanType
if (
($leftType->isEnum()->yes() && $rightType->isTrue()->no())
|| ($rightType->isEnum()->yes() && $leftType->isTrue()->no())
|| ($leftType->isString()->yes() && $rightType->isString()->yes())
|| ($leftType->isInteger()->yes() && $rightType->isInteger()->yes())
|| ($leftType->isFloat()->yes() && $rightType->isFloat()->yes())
) {
return $this->resolveIdenticalType($leftType, $rightType);
}
Expand Down
82 changes: 82 additions & 0 deletions tests/PHPStan/Analyser/nsrt/loose-comparisons.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class HelloWorld
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -31,6 +32,7 @@ public function sayTrue(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -45,6 +47,7 @@ public function sayTrue(
assertType('true', $true == $oneStr);
assertType('false', $true == $zeroStr);
assertType('true', $true == $minusOneStr);
assertType('true', $true == $plusOneStr);
assertType('false', $true == $null);
assertType('false', $true == $emptyArr);
assertType('true', $true == $phpStr);
Expand All @@ -60,6 +63,7 @@ public function sayTrue(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -74,6 +78,7 @@ public function sayFalse(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -88,6 +93,7 @@ public function sayFalse(
assertType('false', $false == $oneStr);
assertType('true', $false == $zeroStr);
assertType('false', $false == $minusOneStr);
assertType('false', $false == $plusOneStr);
assertType('true', $false == $null);
assertType('true', $false == $emptyArr);
assertType('false', $false == $phpStr);
Expand All @@ -103,6 +109,7 @@ public function sayFalse(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -117,6 +124,7 @@ public function sayOne(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -131,6 +139,7 @@ public function sayOne(
assertType('true', $one == $oneStr);
assertType('false', $one == $zeroStr);
assertType('false', $one == $minusOneStr);
assertType('true', $one == $plusOneStr);
assertType('false', $one == $null);
assertType('false', $one == $emptyArr);
assertType('false', $one == $phpStr);
Expand All @@ -146,6 +155,7 @@ public function sayOne(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -160,6 +170,7 @@ public function sayZero(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -174,6 +185,7 @@ public function sayZero(
assertType('false', $zero == $oneStr);
assertType('true', $zero == $zeroStr);
assertType('false', $zero == $minusOneStr);
assertType('false', $zero == $plusOneStr);
assertType('true', $zero == $null);
assertType('false', $zero == $emptyArr);
}
Expand All @@ -187,6 +199,7 @@ public function sayZero(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -201,6 +214,7 @@ public function sayMinusOne(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -215,6 +229,7 @@ public function sayMinusOne(
assertType('false', $minusOne == $oneStr);
assertType('false', $minusOne == $zeroStr);
assertType('true', $minusOne == $minusOneStr);
assertType('false', $minusOne == $plusOneStr);
assertType('false', $minusOne == $null);
assertType('false', $minusOne == $emptyArr);
assertType('false', $minusOne == $phpStr);
Expand All @@ -230,6 +245,7 @@ public function sayMinusOne(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -244,6 +260,7 @@ public function sayOneStr(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -258,6 +275,7 @@ public function sayOneStr(
assertType('true', $oneStr == $oneStr);
assertType('false', $oneStr == $zeroStr);
assertType('false', $oneStr == $minusOneStr);
assertType('true', $oneStr == $plusOneStr);
assertType('false', $oneStr == $null);
assertType('false', $oneStr == $emptyArr);
assertType('false', $oneStr == $phpStr);
Expand All @@ -273,6 +291,7 @@ public function sayOneStr(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -287,6 +306,7 @@ public function sayZeroStr(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -301,6 +321,7 @@ public function sayZeroStr(
assertType('false', $zeroStr == $oneStr);
assertType('true', $zeroStr == $zeroStr);
assertType('false', $zeroStr == $minusOneStr);
assertType('false', $zeroStr == $plusOneStr);
assertType('false', $zeroStr == $null);
assertType('false', $zeroStr == $emptyArr);
assertType('false', $zeroStr == $phpStr);
Expand All @@ -316,6 +337,7 @@ public function sayZeroStr(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -330,6 +352,7 @@ public function sayMinusOneStr(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -344,6 +367,7 @@ public function sayMinusOneStr(
assertType('false', $minusOneStr == $oneStr);
assertType('false', $minusOneStr == $zeroStr);
assertType('true', $minusOneStr == $minusOneStr);
assertType('false', $minusOneStr == $plusOneStr);
assertType('false', $minusOneStr == $null);
assertType('false', $minusOneStr == $emptyArr);
assertType('false', $minusOneStr == $phpStr);
Expand All @@ -359,6 +383,53 @@ public function sayMinusOneStr(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
* @param '' $emptyStr
*/
public function sayPlusOneStr(
$true,
$false,
$one,
$zero,
$minusOne,
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
$emptyStr
): void
{
assertType('true', $plusOneStr == $true);
assertType('false', $plusOneStr == $false);
assertType('true', $plusOneStr == $one);
assertType('false', $plusOneStr == $zero);
assertType('false', $plusOneStr == $minusOne);
assertType('true', $plusOneStr == $oneStr);
assertType('false', $plusOneStr == $zeroStr);
assertType('false', $plusOneStr == $minusOneStr);
assertType('true', $plusOneStr == $plusOneStr);
assertType('false', $plusOneStr == $null);
assertType('false', $plusOneStr == $emptyArr);
assertType('false', $plusOneStr == $phpStr);
assertType('false', $plusOneStr == $emptyStr);
}

/**
* @param true $true
* @param false $false
* @param 1 $one
* @param 0 $zero
* @param -1 $minusOne
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -373,6 +444,7 @@ public function sayNull(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -387,6 +459,7 @@ public function sayNull(
assertType('false', $null == $oneStr);
assertType('false', $null == $zeroStr);
assertType('false', $null == $minusOneStr);
assertType('false', $null == $plusOneStr);
assertType('true', $null == $null);
assertType('true', $null == $emptyArr);
assertType('false', $null == $phpStr);
Expand All @@ -402,6 +475,7 @@ public function sayNull(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -416,6 +490,7 @@ public function sayEmptyArray(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -430,6 +505,7 @@ public function sayEmptyArray(
assertType('false', $emptyArr == $oneStr);
assertType('false', $emptyArr == $zeroStr);
assertType('false', $emptyArr == $minusOneStr);
assertType('false', $emptyArr == $plusOneStr);
assertType('true', $emptyArr == $null);
assertType('true', $emptyArr == $emptyArr);
assertType('false', $emptyArr == $phpStr);
Expand All @@ -445,6 +521,7 @@ public function sayEmptyArray(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -459,6 +536,7 @@ public function sayNonFalsyStr(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -472,6 +550,7 @@ public function sayNonFalsyStr(
assertType('false', $phpStr == $oneStr);
assertType('false', $phpStr == $zeroStr);
assertType('false', $phpStr == $minusOneStr);
assertType('false', $phpStr == $plusOneStr);
assertType('false', $phpStr == $null);
assertType('false', $phpStr == $emptyArr);
assertType('true', $phpStr == $phpStr);
Expand All @@ -487,6 +566,7 @@ public function sayNonFalsyStr(
* @param '1' $oneStr
* @param '0' $zeroStr
* @param '-1' $minusOneStr
* @param '+1' $plusOneStr
* @param null $null
* @param array{} $emptyArr
* @param 'php' $phpStr
Expand All @@ -501,6 +581,7 @@ public function sayEmptyStr(
$oneStr,
$zeroStr,
$minusOneStr,
$plusOneStr,
$null,
$emptyArr,
$phpStr,
Expand All @@ -514,6 +595,7 @@ public function sayEmptyStr(
assertType('false', $emptyStr == $oneStr);
assertType('false', $emptyStr == $zeroStr);
assertType('false', $emptyStr == $minusOneStr);
assertType('false', $emptyStr == $plusOneStr);
assertType('true', $emptyStr == $null);
assertType('false', $emptyStr == $emptyArr);
assertType('false', $emptyStr == $phpStr);
Expand Down

0 comments on commit 6ee5c22

Please sign in to comment.