diff --git a/src/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRule.php b/src/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRule.php index e7d9c46156..a117c228fd 100644 --- a/src/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRule.php +++ b/src/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRule.php @@ -11,6 +11,7 @@ use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\NeverType; use PHPStan\Type\Type; +use function count; use function in_array; use function sprintf; @@ -65,6 +66,10 @@ public function processNode(Node $node, Scope $scope): array } $function = $this->reflectionProvider->getFunction($funcCall->name, $scope); + if (count($function->getAsserts()->getAsserts()) > 0) { + return []; + } + $functionName = $function->getName(); $functionHasSideEffects = !$function->hasSideEffects()->no(); diff --git a/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php b/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php index 9b6adbdd14..e0a99028c2 100644 --- a/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php +++ b/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php @@ -13,6 +13,7 @@ use PHPStan\Type\ErrorType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; +use function count; use function sprintf; /** @@ -69,6 +70,9 @@ public function processNode(Node $node, Scope $scope): array } $method = $calledOnType->getMethod($methodName, $scope); + if (count($method->getAsserts()->getAsserts()) > 0) { + return []; + } return [ RuleErrorBuilder::message(sprintf( diff --git a/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php b/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php index 31dc4dd096..2c80a25856 100644 --- a/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php +++ b/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php @@ -15,6 +15,7 @@ use PHPStan\Type\NeverType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; +use function count; use function sprintf; use function strtolower; @@ -87,6 +88,10 @@ public function processNode(Node $node, Scope $scope): array return []; } + if (count($method->getAsserts()->getAsserts()) > 0) { + return []; + } + $methodResult = $scope->getType($staticCall); if ($methodResult instanceof NeverType && $methodResult->isExplicit()) { return []; diff --git a/tests/PHPStan/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRuleTest.php b/tests/PHPStan/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRuleTest.php index 28257e5a80..6d2fe2bbba 100644 --- a/tests/PHPStan/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRuleTest.php +++ b/tests/PHPStan/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRuleTest.php @@ -85,6 +85,11 @@ public function testPhpDoc(): void ]); } + public function testBug12224(): void + { + $this->analyse([__DIR__ . '/data/bug-12224.php'], []); + } + public function testBug4455(): void { require_once __DIR__ . '/data/bug-4455.php'; diff --git a/tests/PHPStan/Rules/Functions/data/bug-12224.php b/tests/PHPStan/Rules/Functions/data/bug-12224.php new file mode 100644 index 0000000000..9970576bca --- /dev/null +++ b/tests/PHPStan/Rules/Functions/data/bug-12224.php @@ -0,0 +1,19 @@ +analyse([__DIR__ . '/data/bug-11503.php'], $errors); } + public function testBug12224(): void + { + $this->analyse([__DIR__ . '/data/bug-12224.php'], []); + } + public function testFirstClassCallables(): void { $this->analyse([__DIR__ . '/data/first-class-callable-method-without-side-effect.php'], [ diff --git a/tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRuleTest.php b/tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRuleTest.php index bec56ff7d6..96dda15501 100644 --- a/tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRuleTest.php +++ b/tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRuleTest.php @@ -70,6 +70,11 @@ public function testBug4455(): void $this->analyse([__DIR__ . '/data/bug-4455-static.php'], []); } + public function testBug12224(): void + { + $this->analyse([__DIR__ . '/data/bug-12224.php'], []); + } + public function testFirstClassCallables(): void { $this->analyse([__DIR__ . '/data/first-class-callable-static-method-without-side-effect.php'], [ diff --git a/tests/PHPStan/Rules/Methods/data/bug-12224.php b/tests/PHPStan/Rules/Methods/data/bug-12224.php new file mode 100644 index 0000000000..70664fee05 --- /dev/null +++ b/tests/PHPStan/Rules/Methods/data/bug-12224.php @@ -0,0 +1,35 @@ +string($a);