Skip to content

Commit eebd857

Browse files
committed
Add failing test
1 parent 2ceda3f commit eebd857

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
--TEST--
2+
Replacing int type with intersection type
3+
--FILE--
4+
<?php
5+
6+
interface X {}
7+
interface Y {}
8+
9+
class Test {
10+
function method(): int {}
11+
}
12+
class Test2 extends Test {
13+
function method(): X&Y {}
14+
}
15+
16+
?>
17+
--EXPECTF--
18+
Fatal error: Declaration of Test2::method(): X&Y must be compatible with Test::method(): int in %s on line %d
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Replacing object type with intersection type
3+
--FILE--
4+
<?php
5+
6+
interface X {}
7+
interface Y {}
8+
9+
class Test {
10+
function method(): object {}
11+
}
12+
class Test2 extends Test {
13+
function method(): X&Y {}
14+
}
15+
16+
?>
17+
===DONE===
18+
--EXPECTF--
19+
TODO

Zend/zend_inheritance.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,17 @@ static inheritance_status zend_perform_covariant_type_check(
595595
bool have_unresolved = false;
596596

597597
if (ZEND_TYPE_IS_INTERSECTION(fe_type)) {
598+
if (proto_type_mask & MAY_BE_OBJECT) {
599+
/* TODO We can't just return success here, because the class must be loaded. */
600+
}
601+
if (proto_type_mask & MAY_BE_ITERABLE) {
602+
/* TODO */
603+
}
604+
if (proto_type_mask) {
605+
/* An intersection type cannot be a subtype of other builtin types. */
606+
return INHERITANCE_ERROR;
607+
}
608+
598609
/* U_1&...&U_n < V_1&...&V_m if forall V_j. exists U_i. U_i < V_j.
599610
* U_1&...&U_n < V_1|...|V_m if exists V_j. exists U_i. U_i < V_j.
600611
* As such, we need to iterate over proto_type (V_j) first and use a different
@@ -612,8 +623,6 @@ static inheritance_status zend_perform_covariant_type_check(
612623
proto_ce = ZEND_TYPE_CE(*single_type);
613624
proto_class_name = proto_ce->name;
614625
} else {
615-
/* standard type */
616-
ZEND_UNREACHABLE();
617626
continue;
618627
}
619628

0 commit comments

Comments
 (0)