Skip to content

Commit 0aea9e3

Browse files
committed
Validate private(namespace) visibility modifier combinations
Add validation for private(namespace) modifier usage at compile-time. This commit adds clarifying comments and ensures redundant set visibility is properly removed for private(namespace) private(namespace)(set).
1 parent 91123fb commit 0aea9e3

File tree

2 files changed

+5
-1
lines changed

2 files changed

+5
-1
lines changed

Zend/zend_API.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4472,6 +4472,8 @@ ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, z
44724472
"Property with asymmetric visibility %s::$%s must have type",
44734473
ZSTR_VAL(ce->name), ZSTR_VAL(name));
44744474
}
4475+
/* Validate asymmetric visibility hierarchy: public < protected < private(namespace) < private
4476+
* Set visibility must be equal to or more restrictive than get visibility. */
44754477
uint32_t get_visibility = zend_visibility_to_set_visibility(access_type & ZEND_ACC_PPP_MASK);
44764478
uint32_t set_visibility = access_type & ZEND_ACC_PPP_SET_MASK;
44774479
if (get_visibility > set_visibility) {
@@ -4482,7 +4484,8 @@ ZEND_API zend_property_info *zend_declare_typed_property(zend_class_entry *ce, z
44824484
/* Remove equivalent set visibility. */
44834485
if (((access_type & (ZEND_ACC_PUBLIC|ZEND_ACC_PUBLIC_SET)) == (ZEND_ACC_PUBLIC|ZEND_ACC_PUBLIC_SET))
44844486
|| ((access_type & (ZEND_ACC_PROTECTED|ZEND_ACC_PROTECTED_SET)) == (ZEND_ACC_PROTECTED|ZEND_ACC_PROTECTED_SET))
4485-
|| ((access_type & (ZEND_ACC_PRIVATE|ZEND_ACC_PRIVATE_SET)) == (ZEND_ACC_PRIVATE|ZEND_ACC_PRIVATE_SET))) {
4487+
|| ((access_type & (ZEND_ACC_PRIVATE|ZEND_ACC_PRIVATE_SET)) == (ZEND_ACC_PRIVATE|ZEND_ACC_PRIVATE_SET))
4488+
|| ((access_type & (ZEND_ACC_NAMESPACE_PRIVATE|ZEND_ACC_NAMESPACE_PRIVATE_SET)) == (ZEND_ACC_NAMESPACE_PRIVATE|ZEND_ACC_NAMESPACE_PRIVATE_SET))) {
44864489
access_type &= ~ZEND_ACC_PPP_SET_MASK;
44874490
}
44884491
/* private(set) properties are implicitly final. */

Zend/zend_compile.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,6 +1037,7 @@ uint32_t zend_add_anonymous_class_modifier(uint32_t flags, uint32_t new_flag)
10371037
uint32_t zend_add_member_modifier(uint32_t flags, uint32_t new_flag, zend_modifier_target target) /* {{{ */
10381038
{
10391039
uint32_t new_flags = flags | new_flag;
1040+
/* Prevent combining visibility modifiers (public, protected, private, private(namespace)) */
10401041
if ((flags & ZEND_ACC_PPP_MASK) && (new_flag & ZEND_ACC_PPP_MASK)) {
10411042
zend_throw_exception(zend_ce_compile_error,
10421043
"Multiple access type modifiers are not allowed", 0);

0 commit comments

Comments
 (0)