diff --git a/tests/Template/ClassTemplateTest.php b/tests/Template/ClassTemplateTest.php index 7c34eb33ad6..af2366232fe 100644 --- a/tests/Template/ClassTemplateTest.php +++ b/tests/Template/ClassTemplateTest.php @@ -4265,6 +4265,69 @@ public function enqueue($value): void {} /** @psalm-suppress InvalidArgument */ $a->enqueue("str"); ' + ], + 'testSatisfies2' => [ + 'code' => ' + * + * @param TNewValue $value + * + * @psalm-this-out self<(TValue|TNewValue): satisfied-by> + */ + public function enqueue($value): void {} + + /** @return list */ + public function ret(): array { + return []; + } + } + + /** @param FutureSplQueue $a */ + function take(FutureSplQueue $a): int { + foreach ($a->ret() as $v) { + return $v; + } + return 0; + } + + function takeInt(int $a): int { + return $a; + } + + /** @param 1|2 $a */ + function takeIntExact(int $a): int { + return $a; + } + + /** @var FutureSplQueue */ + $a = new FutureSplQueue; + + /** @psalm-check-type-exact $a = FutureSplQueue */; + + $a->enqueue(1); + + /** @psalm-check-type-exact $a = FutureSplQueue<1: int> */; + + $a->enqueue(2); + + /** @psalm-check-type-exact $a = FutureSplQueue<1|2: int> */; + + foreach ($a->ret() as $v) { + takeInt($v); + takeIntExact($v); + } + + /** @psalm-check-type-exact $a = FutureSplQueue<1|2: int> */; + + take($a); + + /** @psalm-check-type-exact $a = FutureSplQueue */; + ' ] ]; }