Skip to content

Commit 5f565fb

Browse files
committed
Merge branch 2.1.x into 2.2.x
2 parents dd0a8c5 + e3ceaf2 commit 5f565fb

5 files changed

Lines changed: 40 additions & 6 deletions

File tree

phpstan-baseline.neon

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ parameters:
1818
count: 1
1919
path: src/Analyser/ArgumentsNormalizer.php
2020

21+
-
22+
rawMessage: Casting to string something that's already string.
23+
identifier: cast.useless
24+
count: 3
25+
path: src/Analyser/ExprHandler/AssignHandler.php
26+
2127
-
2228
rawMessage: 'Doing instanceof PHPStan\Type\Constant\ConstantStringType is error-prone and deprecated. Use Type::getConstantStrings() instead.'
2329
identifier: phpstanApi.instanceofType

src/Analyser/ExprHandler/AssignHandler.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ public function processAssignVar(
319319
$nodeScopeResolver->callNodeCallback($nodeCallback, new VariableAssignNode($var, $assignedExpr), $scopeBeforeAssignEval, $storage);
320320
$scope = $scope->assignVariable($var->name, $type, $scope->getNativeType($assignedExpr), TrinaryLogic::createYes());
321321
foreach ($conditionalExpressions as $exprString => $holders) {
322-
$scope = $scope->addConditionalExpressions($exprString, $holders);
322+
$scope = $scope->addConditionalExpressions((string) $exprString, $holders);
323323
}
324324

325325
if ($assignedExpr instanceof Expr\Array_) {
@@ -861,6 +861,8 @@ private function processSureTypesForConditionalExpressionsAfterAssign(Scope $sco
861861
continue;
862862
}
863863

864+
$exprString = (string) $exprString;
865+
864866
if (!isset($conditionalExpressions[$exprString])) {
865867
$conditionalExpressions[$exprString] = [];
866868
}
@@ -889,6 +891,8 @@ private function processSureNotTypesForConditionalExpressionsAfterAssign(Scope $
889891
continue;
890892
}
891893

894+
$exprString = (string) $exprString;
895+
892896
if (!isset($conditionalExpressions[$exprString])) {
893897
$conditionalExpressions[$exprString] = [];
894898
}
@@ -938,7 +942,7 @@ private function isExprSafeToProjectThroughVariable(Expr $expr, string $variable
938942
// narrowing targets at a usage site — skip them so they don't collide with PHP's
939943
// numeric-string array-key autocast or leak internal virtual expressions into the
940944
// conditional-expression map.
941-
if ($expr instanceof Node\Scalar || $expr instanceof ConstFetch || $expr instanceof VirtualNode) {
945+
if ($expr instanceof Node\Scalar || $expr instanceof ConstFetch || $expr instanceof VirtualNode || $expr instanceof Expr\UnaryMinus && $expr->expr instanceof Node\Scalar) {
942946
return false;
943947
}
944948

src/Analyser/TypeSpecifier.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -494,7 +494,7 @@ public function specifyTypesInCondition(
494494
}
495495

496496
if ($context->true()) {
497-
if (!$expr->left instanceof Node\Scalar) {
497+
if (!$expr->left instanceof Node\Scalar && !($expr->left instanceof Expr\UnaryMinus && $expr->left->expr instanceof Node\Scalar)) {
498498
$result = $result->unionWith(
499499
$this->create(
500500
$expr->left,
@@ -504,7 +504,7 @@ public function specifyTypesInCondition(
504504
)->setRootExpr($expr),
505505
);
506506
}
507-
if (!$expr->right instanceof Node\Scalar) {
507+
if (!$expr->right instanceof Node\Scalar && !($expr->right instanceof Expr\UnaryMinus && $expr->right->expr instanceof Node\Scalar)) {
508508
$result = $result->unionWith(
509509
$this->create(
510510
$expr->right,
@@ -515,7 +515,7 @@ public function specifyTypesInCondition(
515515
);
516516
}
517517
} elseif ($context->false()) {
518-
if (!$expr->left instanceof Node\Scalar) {
518+
if (!$expr->left instanceof Node\Scalar && !($expr->left instanceof Expr\UnaryMinus && $expr->left->expr instanceof Node\Scalar)) {
519519
$result = $result->unionWith(
520520
$this->create(
521521
$expr->left,
@@ -525,7 +525,7 @@ public function specifyTypesInCondition(
525525
)->setRootExpr($expr),
526526
);
527527
}
528-
if (!$expr->right instanceof Node\Scalar) {
528+
if (!$expr->right instanceof Node\Scalar && !($expr->right instanceof Expr\UnaryMinus && $expr->right->expr instanceof Node\Scalar)) {
529529
$result = $result->unionWith(
530530
$this->create(
531531
$expr->right,

tests/PHPStan/Analyser/AnalyserIntegrationTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,6 +1543,13 @@ public function testBug14501(): void
15431543
$this->assertNoErrors($errors);
15441544
}
15451545

1546+
#[RequiresPhp('>= 8.0.0')]
1547+
public function testBug14542(): void
1548+
{
1549+
$errors = $this->runAnalyse(__DIR__ . '/data/bug-14542.php');
1550+
$this->assertNoErrors($errors);
1551+
}
1552+
15461553
/**
15471554
* @param string[]|null $allAnalysedFiles
15481555
* @return list<Error>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Bug14542;
4+
5+
class IndexComparator
6+
{
7+
/**
8+
* @param array<mixed> $ids
9+
*/
10+
public function compare(mixed $a, mixed $b, array $ids): int
11+
{
12+
$indexA = ($index = \array_search($a, $ids)) > -1 ? $index : \PHP_INT_MAX;
13+
$indexB = ($index = \array_search($b, $ids)) > -1 ? $index : \PHP_INT_MAX;
14+
15+
return \strnatcmp((string) $indexA, (string) $indexB);
16+
}
17+
}

0 commit comments

Comments
 (0)