1--TEST--
2Union of two intersection type
3--FILE--
4<?php
5
6interface W {}
7interface X {}
8interface Y {}
9interface Z {}
10
11class A implements X, Y {}
12class B implements W, Z {}
13class C {}
14
15function foo1((X&Y)|(W&Z) $v): (X&Y)|(W&Z) {
16    return $v;
17}
18function foo2((W&Z)|(X&Y) $v): (W&Z)|(X&Y) {
19    return $v;
20}
21
22function bar1(): (X&Y)|(W&Z) {
23    return new C();
24}
25function bar2(): (W&Z)|(X&Y) {
26    return new C();
27}
28
29$a = new A();
30$b = new B();
31
32$o = foo1($a);
33var_dump($o);
34$o = foo2($a);
35var_dump($o);
36$o = foo1($b);
37var_dump($o);
38$o = foo2($b);
39var_dump($o);
40
41try {
42    bar1();
43} catch (\TypeError $e) {
44    echo $e->getMessage(), \PHP_EOL;
45}
46try {
47    bar2();
48} catch (\TypeError $e) {
49    echo $e->getMessage(), \PHP_EOL;
50}
51
52?>
53--EXPECTF--
54object(A)#%d (0) {
55}
56object(A)#%d (0) {
57}
58object(B)#%d (0) {
59}
60object(B)#%d (0) {
61}
62bar1(): Return value must be of type (X&Y)|(W&Z), C returned
63bar2(): Return value must be of type (W&Z)|(X&Y), C returned
64