|
6 | 6 |
|
7 | 7 | class Payload {} |
8 | 8 |
|
9 | | -/** |
10 | | - * When the value at index 0 is a union of constants (0|1|2|3), int leaks |
11 | | - * into the resolved type of the adjacent value during intersection. |
12 | | - * The generalization of 0|1|2|3 to int causes getIterableValueType() |
13 | | - * to include int in the value union, leaking it to position 1. |
14 | | - * |
15 | | - * @param array{0|1|2|3, int|Payload|string|null}&array{int, Payload} $x |
16 | | - */ |
| 9 | +/** @param array{0|1|2|3, int|Payload|string|null}&array{int, Payload} $x */ |
17 | 10 | function testIntersectConstantUnionWithInt(mixed $x): void |
18 | 11 | { |
19 | 12 | assertType('array{0|1|2|3, Bug11234\Payload}', $x); |
20 | 13 | } |
21 | 14 |
|
22 | | -/** |
23 | | - * Reverse order. |
24 | | - * |
25 | | - * @param array{int, Payload}&array{0|1|2|3, int|Payload|string|null} $x |
26 | | - */ |
| 15 | +/** @param array{int, Payload}&array{0|1|2|3, int|Payload|string|null} $x */ |
27 | 16 | function testIntersectConstantUnionWithIntReverse(mixed $x): void |
28 | 17 | { |
29 | 18 | assertType('array{0|1|2|3, Bug11234\Payload}', $x); |
30 | 19 | } |
31 | 20 |
|
32 | | -/** |
33 | | - * Both sides have constant unions. |
34 | | - * |
35 | | - * @param array{0|1|2|3, int|Payload|string|null}&array{0|1|2|3, Payload} $x |
36 | | - */ |
| 21 | +/** @param array{0|1|2|3, int|Payload|string|null}&array{0|1|2|3, Payload} $x */ |
37 | 22 | function testIntersectBothConstantUnion(mixed $x): void |
38 | 23 | { |
39 | 24 | assertType('array{0|1|2|3, Bug11234\Payload}', $x); |
40 | 25 | } |
41 | 26 |
|
42 | | -/** |
43 | | - * Works fine when the first value is just int. |
44 | | - * |
45 | | - * @param array{int, int|Payload|string|null}&array{int, Payload} $y |
46 | | - */ |
| 27 | +/** @param array{int, int|Payload|string|null}&array{int, Payload} $y */ |
47 | 28 | function testIntersectPlainInt(mixed $y): void |
48 | 29 | { |
49 | 30 | assertType('array{int, Bug11234\Payload}', $y); |
50 | 31 | } |
51 | 32 |
|
52 | | -/** |
53 | | - * Three-value array shape: leaks should not happen across multiple positions. |
54 | | - * |
55 | | - * @param array{0|1, string|int, Payload|null}&array{int, string, Payload} $z |
56 | | - */ |
| 33 | +/** @param array{0|1, string|int, Payload|null}&array{int, string, Payload} $z */ |
57 | 34 | function testIntersectThreePositions(mixed $z): void |
58 | 35 | { |
59 | 36 | assertType('array{0|1, string, Bug11234\Payload}', $z); |
60 | 37 | } |
61 | 38 |
|
62 | | -/** |
63 | | - * String constant union at first position. |
64 | | - * |
65 | | - * @param array{'a'|'b', int|Payload|string|null}&array{string, Payload} $w |
66 | | - */ |
| 39 | +/** @param array{'a'|'b', int|Payload|string|null}&array{string, Payload} $w */ |
67 | 40 | function testIntersectStringConstantUnion(mixed $w): void |
68 | 41 | { |
69 | 42 | assertType("array{'a'|'b', Bug11234\Payload}", $w); |
70 | 43 | } |
71 | 44 |
|
72 | | -/** |
73 | | - * Different key count — extra keys from one side are dropped. |
74 | | - * |
75 | | - * @param array{0|1, int|string}&array{int, int, extra?: bool} $v |
76 | | - */ |
| 45 | +/** @param array{0|1, int|string}&array{int, int, extra?: bool} $v */ |
77 | 46 | function testIntersectOptionalKey(mixed $v): void |
78 | 47 | { |
79 | 48 | assertType('array{0|1, int}', $v); |
80 | 49 | } |
81 | 50 |
|
82 | | -/** |
83 | | - * Boolean constant union. |
84 | | - * |
85 | | - * @param array{true|false, int|string}&array{bool, string} $u |
86 | | - */ |
| 51 | +/** @param array{true|false, int|string}&array{bool, string} $u */ |
87 | 52 | function testIntersectBoolConstantUnion(mixed $u): void |
88 | 53 | { |
89 | 54 | assertType('array{bool, string}', $u); |
|
0 commit comments