From a7af0276457ad2115a3fa49da08cb6c53b262115 Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Wed, 12 Oct 2022 11:40:29 +0200 Subject: [PATCH] Fix #8562 --- .../Statements/Expression/AssertionFinder.php | 4 ++ tests/BinaryOperationTest.php | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php b/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php index d49901cc710..0e5eb2b7435 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/AssertionFinder.php @@ -36,6 +36,8 @@ use Psalm\Issue\TypeDoesNotContainType; use Psalm\Issue\UnevaluatedCode; use Psalm\IssueBuffer; +use Psalm\Node\Expr\BinaryOp\VirtualIdentical; +use Psalm\Node\Expr\BinaryOp\VirtualNotIdentical; use Psalm\Storage\Assertion; use Psalm\Storage\Assertion\ArrayKeyExists; use Psalm\Storage\Assertion\DoesNotHaveAtLeastCount; @@ -2195,6 +2197,7 @@ private static function getFalseInequalityAssertions( && $var_type->isSingle() && $var_type->hasBool() && !$var_type->from_docblock + && !$conditional instanceof VirtualNotIdentical ) { IssueBuffer::maybeAdd( new RedundantIdentityWithTrue( @@ -2897,6 +2900,7 @@ private static function getTrueEqualityAssertions( && $var_type->isSingle() && $var_type->hasBool() && !$var_type->from_docblock + && !$conditional instanceof VirtualIdentical ) { IssueBuffer::maybeAdd( new RedundantIdentityWithTrue( diff --git a/tests/BinaryOperationTest.php b/tests/BinaryOperationTest.php index ace9da490e9..7ca6d31505e 100644 --- a/tests/BinaryOperationTest.php +++ b/tests/BinaryOperationTest.php @@ -145,6 +145,51 @@ public function testDecimalOperations(): void $this->assertSame($assertions, $actual_vars); } + public function testMatchOnBoolean(): void + { + $config = Config::getInstance(); + $config->strict_binary_operands = true; + + $this->addFile( + 'somefile.php', + ' 123, + $obj instanceof b => 321, + }; + $result2 = match (false) { + $obj instanceof a => 123, + $obj instanceof b => 321, + }; + ' + ); + + $assertions = [ + '$obj' => 'a|b', + '$result1' => '123|321', + '$result2' => '123|321', + ]; + + $context = new Context(); + + $this->project_analyzer->setPhpVersion('8.0', 'tests'); + $this->analyzeFile('somefile.php', $context); + + $actual_vars = []; + foreach ($assertions as $var => $_) { + if (isset($context->vars_in_scope[$var])) { + $actual_vars[$var] = $context->vars_in_scope[$var]->getId(true); + } + } + + $this->assertSame($assertions, $actual_vars); + } + public function testStrictTrueEquivalence(): void { $config = Config::getInstance();