Skip to content

Commit 8dca4e2

Browse files
committed
Fix #13783
1 parent 239c64c commit 8dca4e2

2 files changed

Lines changed: 45 additions & 4 deletions

File tree

src/Analyser/TypeSpecifier.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -645,10 +645,14 @@ public function specifyTypesInCondition(
645645
$rightTypes = $this->specifyTypesInCondition($rightScope, $expr->right, $context)->setRootExpr($expr);
646646
$types = $context->true() ? $leftTypes->unionWith($rightTypes) : $leftTypes->normalize($scope)->intersectWith($rightTypes->normalize($rightScope));
647647
if ($context->false()) {
648-
return (new SpecifiedTypes(
648+
$result = new SpecifiedTypes(
649649
$types->getSureTypes(),
650650
$types->getSureNotTypes(),
651-
))->setNewConditionalExpressionHolders(array_merge(
651+
);
652+
if ($types->shouldOverwrite()) {
653+
$result = $result->setAlwaysOverwriteTypes();
654+
}
655+
return $result->setNewConditionalExpressionHolders(array_merge(
652656
$this->processBooleanNotSureConditionalTypes($scope, $leftTypes, $rightTypes),
653657
$this->processBooleanNotSureConditionalTypes($scope, $rightTypes, $leftTypes),
654658
$this->processBooleanSureConditionalTypes($scope, $leftTypes, $rightTypes),
@@ -683,10 +687,14 @@ public function specifyTypesInCondition(
683687
}
684688

685689
if ($context->true()) {
686-
return (new SpecifiedTypes(
690+
$result = new SpecifiedTypes(
687691
$types->getSureTypes(),
688692
$types->getSureNotTypes(),
689-
))->setNewConditionalExpressionHolders(array_merge(
693+
);
694+
if ($types->shouldOverwrite()) {
695+
$result = $result->setAlwaysOverwriteTypes();
696+
}
697+
return $result->setNewConditionalExpressionHolders(array_merge(
690698
$this->processBooleanNotSureConditionalTypes($scope, $leftTypes, $rightTypes),
691699
$this->processBooleanNotSureConditionalTypes($scope, $rightTypes, $leftTypes),
692700
$this->processBooleanSureConditionalTypes($scope, $leftTypes, $rightTypes),
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Bug13783;
4+
5+
use ReflectionClass;
6+
use function PHPStan\Testing\assertType;
7+
8+
class A {}
9+
class B {}
10+
11+
/**
12+
* @param class-string $c
13+
*/
14+
function sayHello(string $c): void
15+
{
16+
$reflect = new ReflectionClass($c);
17+
if ($reflect->isSubClassOf(A::class) || $reflect->isSubClassOf(B::class)) {
18+
assertType('ReflectionClass<Bug13783\A>|ReflectionClass<Bug13783\B>', $reflect);
19+
}
20+
}
21+
22+
/**
23+
* @param class-string $c
24+
*/
25+
function sayHello2(string $c): void
26+
{
27+
$reflect = new ReflectionClass($c);
28+
if ($reflect->isSubClassOf(A::class)) {
29+
assertType('ReflectionClass<Bug13783\A>', $reflect);
30+
} elseif ($reflect->isSubClassOf(B::class)) {
31+
assertType('ReflectionClass<Bug13783\B>', $reflect);
32+
}
33+
}

0 commit comments

Comments
 (0)