Skip to content

Commit 1227f45

Browse files
Girgiasnikic
authored andcommitted
Revert "Support static type in intersection"
Let's not, this points more to a design bug then anything else This reverts commit 611f0e72ef66a6fbd3f438542e50847817f96bfc.
1 parent f58e2da commit 1227f45

File tree

5 files changed

+16
-78
lines changed

5 files changed

+16
-78
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
--TEST--
2+
static type cannot take part in an intersection type
3+
--FILE--
4+
<?php
5+
6+
class A {
7+
public function foo(): static&Iterator {}
8+
}
9+
10+
?>
11+
--EXPECTF--
12+
Fatal error: Type static cannot be part of an intersection type in %s on line %d

Zend/tests/type_declarations/intersection_types/redundant_types/duplicate_static_type.phpt

Lines changed: 0 additions & 13 deletions
This file was deleted.

Zend/tests/type_declarations/intersection_types/static_in_intersection.phpt

Lines changed: 0 additions & 41 deletions
This file was deleted.

Zend/zend_compile.c

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,7 +1247,7 @@ zend_string *zend_type_to_string_resolved(zend_type type, zend_class_entry *scop
12471247
name = called_scope->name;
12481248
}
12491249
}
1250-
str = add_type_string(str, name, ZEND_TYPE_IS_INTERSECTION(type));
1250+
str = add_type_string(str, name, /* is_intersection */ false);
12511251
}
12521252
if (type_mask & MAY_BE_CALLABLE) {
12531253
str = add_type_string(str, ZSTR_KNOWN(ZEND_STR_CALLABLE), /* is_intersection */ false);
@@ -6301,9 +6301,8 @@ static zend_type zend_compile_typename(
63016301
} else if (ast->kind == ZEND_AST_TYPE_INTERSECTION) {
63026302
zend_ast_list *list = zend_ast_get_list(ast);
63036303
zend_type_list *type_list;
6304-
unsigned int has_static = 0;
63056304

6306-
// TODO static means that one slot may be unused
6305+
// TODO Is this still true if self/parent are accepted?
63076306
/* Allocate the type list directly on the arena as it must be a type
63086307
* list of the same number of elements as the AST list has children */
63096308
type_list = zend_arena_alloc(&CG(arena), ZEND_TYPE_LIST_SIZE(list->children));
@@ -6316,27 +6315,13 @@ static zend_type zend_compile_typename(
63166315
zend_type single_type = zend_compile_single_typename(type_ast);
63176316

63186317
/* An intersection of standard types cannot exist so invalidate it */
6319-
/* Treat "static" as a class type. */
6320-
if (ZEND_TYPE_IS_ONLY_MASK(single_type) && !(ZEND_TYPE_FULL_MASK(single_type) & MAY_BE_STATIC)) {
6318+
if (ZEND_TYPE_IS_ONLY_MASK(single_type)) {
63216319
zend_string *standard_type_str = zend_type_to_string(single_type);
63226320
zend_error_noreturn(E_COMPILE_ERROR,
63236321
"Type %s cannot be part of an intersection type", ZSTR_VAL(standard_type_str));
63246322
zend_string_release_ex(standard_type_str, false);
63256323
}
63266324

6327-
/* If the type is static */
6328-
if (UNEXPECTED(!ZEND_TYPE_IS_COMPLEX(single_type))) {
6329-
/* Check that static doesn't overlap */
6330-
uint32_t type_mask_overlap = ZEND_TYPE_PURE_MASK(type) & MAY_BE_STATIC;
6331-
if (type_mask_overlap) {
6332-
zend_error_noreturn(E_COMPILE_ERROR, "Duplicate type static is redundant");
6333-
}
6334-
ZEND_TYPE_FULL_MASK(type) |= MAY_BE_STATIC;
6335-
ZEND_TYPE_FULL_MASK(single_type) &= ~_ZEND_TYPE_MAY_BE_MASK;
6336-
has_static = 1;
6337-
continue;
6338-
}
6339-
63406325
/* Add type to the type list */
63416326
type_list->types[type_list->num_types++] = single_type;
63426327

@@ -6351,7 +6336,7 @@ static zend_type zend_compile_typename(
63516336
}
63526337
}
63536338

6354-
ZEND_ASSERT((list->children - has_static) == type_list->num_types);
6339+
ZEND_ASSERT(list->children == type_list->num_types);
63556340

63566341
ZEND_TYPE_SET_LIST(type, type_list);
63576342
ZEND_TYPE_FULL_MASK(type) |= _ZEND_TYPE_ARENA_BIT;

Zend/zend_execute.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,6 @@ static bool zend_check_and_resolve_property_class_type(
847847
zend_type *list_type;
848848

849849
if (ZEND_TYPE_IS_INTERSECTION(info->type)) {
850-
/* Property class can't have static as a type so need to check it here */
851850
ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(info->type), list_type) {
852851
if (ZEND_TYPE_HAS_NAME(*list_type)) {
853852
zend_string *name = ZEND_TYPE_NAME(*list_type);
@@ -1022,10 +1021,6 @@ static zend_always_inline bool zend_check_type_slow(
10221021
if (UNEXPECTED(ZEND_TYPE_HAS_LIST(*type))) {
10231022
zend_type *list_type;
10241023
if (ZEND_TYPE_IS_INTERSECTION(*type)) {
1025-
/* Check if intersection has static inside it */
1026-
if ((ZEND_TYPE_FULL_MASK(*type) & MAY_BE_STATIC) && !zend_value_instanceof_static(arg)) {
1027-
return false;
1028-
}
10291024
ZEND_TYPE_LIST_FOREACH(ZEND_TYPE_LIST(*type), list_type) {
10301025
if (HAVE_CACHE_SLOT && *cache_slot) {
10311026
ce = *cache_slot;

0 commit comments

Comments
 (0)