diff --git a/src/Analyser/TypeSpecifier.php b/src/Analyser/TypeSpecifier.php index 79eb168577..3b2b1e0f11 100644 --- a/src/Analyser/TypeSpecifier.php +++ b/src/Analyser/TypeSpecifier.php @@ -35,8 +35,10 @@ use PHPStan\ShouldNotHappenException; use PHPStan\TrinaryLogic; use PHPStan\Type\Accessory\AccessoryArrayListType; +use PHPStan\Type\Accessory\AccessoryLowercaseStringType; use PHPStan\Type\Accessory\AccessoryNonEmptyStringType; use PHPStan\Type\Accessory\AccessoryNonFalsyStringType; +use PHPStan\Type\Accessory\AccessoryUppercaseStringType; use PHPStan\Type\Accessory\HasOffsetType; use PHPStan\Type\Accessory\HasPropertyType; use PHPStan\Type\Accessory\NonEmptyArrayType; @@ -2437,21 +2439,39 @@ private function resolveNormalizedIdentical(Expr\BinaryOp\Identical $expr, Scope $argType = $scope->getType($unwrappedLeftExpr->getArgs()[0]->value); if ($argType->isString()->yes()) { + $specifiedTypes = new SpecifiedTypes(); + if (in_array(strtolower($unwrappedLeftExpr->name->toString()), ['strtolower', 'mb_strtolower'], true)) { + $specifiedTypes = $this->create( + $unwrappedRightExpr, + TypeCombinator::intersect($rightType, new AccessoryLowercaseStringType()), + $context, + $scope, + )->setRootExpr($expr); + } + if (in_array(strtolower($unwrappedLeftExpr->name->toString()), ['strtoupper', 'mb_strtoupper'], true)) { + $specifiedTypes = $this->create( + $unwrappedRightExpr, + TypeCombinator::intersect($rightType, new AccessoryUppercaseStringType()), + $context, + $scope, + )->setRootExpr($expr); + } + if ($rightType->isNonFalsyString()->yes()) { - return $this->create( + return $specifiedTypes->unionWith($this->create( $unwrappedLeftExpr->getArgs()[0]->value, TypeCombinator::intersect($argType, new AccessoryNonFalsyStringType()), $context, $scope, - )->setRootExpr($expr); + )->setRootExpr($expr)); } - return $this->create( + return $specifiedTypes->unionWith($this->create( $unwrappedLeftExpr->getArgs()[0]->value, TypeCombinator::intersect($argType, new AccessoryNonEmptyStringType()), $context, $scope, - )->setRootExpr($expr); + )->setRootExpr($expr)); } } diff --git a/tests/PHPStan/Analyser/nsrt/bug-14047.php b/tests/PHPStan/Analyser/nsrt/bug-14047.php new file mode 100644 index 0000000000..361e40b61f --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-14047.php @@ -0,0 +1,69 @@ +