-
Notifications
You must be signed in to change notification settings - Fork 570
Expand file tree
/
Copy pathbug-12444.php
More file actions
92 lines (79 loc) · 1.66 KB
/
bug-12444.php
File metadata and controls
92 lines (79 loc) · 1.66 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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
declare(strict_types = 1);
namespace Bug12444;
use function PHPStan\Testing\assertType;
/**
* @template-covariant T
*/
interface Covariant {}
/**
* @template T of object
* @param class-string<T> $class
* @return Covariant<T>
*/
function covariant(string $class): Covariant
{
throw new \Exception();
}
/**
* @template-contravariant T
*/
interface Contravariant {}
/**
* @template T of object
* @param class-string<T> $class
* @return Contravariant<T>
*/
function contravariant(string $class): Contravariant
{
throw new \Exception();
}
/**
* @template T
* @extends Covariant<T>
* @extends Contravariant<T>
*/
interface Invariant extends Covariant, Contravariant {}
/**
* @template T of object
* @param class-string<T> $class
* @return Invariant<T>
*/
function invariant(string $class): Invariant
{
throw new \Exception();
}
/**
* @template T
* @param T $value
* @param Covariant<T> ...$covariants
* @return T
*/
function testCovariant(mixed $value, Covariant ...$covariants): mixed
{
return $value;
}
/**
* @template T
* @param T $value
* @param Contravariant<T> ...$contravariants
* @return T
*/
function testContravariant(mixed $value, Contravariant ...$contravariants): mixed
{
return $value;
}
// Contravariant with direct Contravariant args
$r3 = testContravariant(
new \RuntimeException(),
contravariant(\Throwable::class),
contravariant(\Exception::class),
);
assertType('RuntimeException', $r3);
// Contravariant with Invariant args (extending Contravariant) - this is the reported bug
$r4 = testContravariant(
new \RuntimeException(),
invariant(\Throwable::class),
invariant(\Exception::class),
);
assertType('RuntimeException', $r4);