forked from phpstan/phpstan-src
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbug-14484.php
More file actions
70 lines (61 loc) · 1.15 KB
/
bug-14484.php
File metadata and controls
70 lines (61 loc) · 1.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php // lint >= 8.0
namespace Bug14484;
use function PHPStan\Testing\assertType;
class A {}
class B {}
class C {}
class D {}
class Bug
{
/**
* @return int|bool|string|A|B|C|D|list<A>|null
*/
public function getValue(): mixed
{
return null;
}
public function test(): void
{
$value = $this->getValue();
if (!is_string($value)) {
return;
}
assertType('string', $value);
}
}
class Bug2
{
/**
* @return int|bool|string|A|B|C|D|list<A>|null
*/
public function getValue(): mixed
{
return null;
}
public function testInstanceof(): void
{
$value = $this->getValue();
if (!($value instanceof A)) {
return;
}
// Expected: narrowed to A
// Actual in 2.1.49: entire union reported (narrowing lost)
assertType(A::class, $value);
}
public function testIfElseifInstanceof(): void
{
$value = $this->getValue();
if ($value === null) {
return;
}
if ($value instanceof A) {
assertType(A::class, $value);
} elseif ($value instanceof B) {
assertType(B::class, $value);
} elseif (is_array($value)) {
assertType('list<Bug14484\\A>', $value);
} elseif (is_string($value)) {
assertType('string', $value);
}
}
}