@@ -1630,8 +1630,7 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
1630
1630
/* }}} */
1631
1631
1632
1632
static bool do_inherit_constant_check (
1633
- zend_class_entry * ce , zend_class_constant * parent_constant ,
1634
- zend_string * name , const zend_class_entry * iface
1633
+ zend_class_entry * ce , zend_class_constant * parent_constant , zend_string * name
1635
1634
) {
1636
1635
zval * zv = zend_hash_find_ex (& ce -> constants_table , name , 1 );
1637
1636
if (zv == NULL ) {
@@ -1641,12 +1640,17 @@ static bool do_inherit_constant_check(
1641
1640
zend_class_constant * old_constant = Z_PTR_P (zv );
1642
1641
if ((ZEND_CLASS_CONST_FLAGS (parent_constant ) & ZEND_ACC_FINAL )) {
1643
1642
zend_error_noreturn (E_COMPILE_ERROR , "%s::%s cannot override final constant %s::%s" ,
1644
- ZSTR_VAL (old_constant -> ce -> name ), ZSTR_VAL (name ), ZSTR_VAL (iface -> name ), ZSTR_VAL (name )
1643
+ ZSTR_VAL (old_constant -> ce -> name ), ZSTR_VAL (name ),
1644
+ ZSTR_VAL (parent_constant -> ce -> name ), ZSTR_VAL (name )
1645
1645
);
1646
1646
}
1647
1647
1648
1648
if (old_constant -> ce != parent_constant -> ce && old_constant -> ce != ce ) {
1649
- zend_error_noreturn (E_COMPILE_ERROR , "Cannot inherit previously-inherited or override constant %s::%s from interface %s" , ZSTR_VAL (ce -> name ), ZSTR_VAL (name ), ZSTR_VAL (iface -> name ));
1649
+ zend_error_noreturn (E_COMPILE_ERROR ,
1650
+ "Class %s inherits both %s::%s and %s::%s, which is ambiguous" ,
1651
+ ZSTR_VAL (ce -> name ),
1652
+ ZSTR_VAL (old_constant -> ce -> name ), ZSTR_VAL (name ),
1653
+ ZSTR_VAL (parent_constant -> ce -> name ), ZSTR_VAL (name ));
1650
1654
}
1651
1655
1652
1656
return false;
@@ -1655,7 +1659,7 @@ static bool do_inherit_constant_check(
1655
1659
1656
1660
static void do_inherit_iface_constant (zend_string * name , zend_class_constant * c , zend_class_entry * ce , zend_class_entry * iface ) /* {{{ */
1657
1661
{
1658
- if (do_inherit_constant_check (ce , c , name , iface )) {
1662
+ if (do_inherit_constant_check (ce , c , name )) {
1659
1663
zend_class_constant * ct ;
1660
1664
if (Z_TYPE (c -> value ) == IS_CONSTANT_AST ) {
1661
1665
ce -> ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED ;
@@ -1722,7 +1726,7 @@ ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry
1722
1726
if (ignore ) {
1723
1727
/* Check for attempt to redeclare interface constants */
1724
1728
ZEND_HASH_FOREACH_STR_KEY_PTR (& iface -> constants_table , key , c ) {
1725
- do_inherit_constant_check (ce , c , key , iface );
1729
+ do_inherit_constant_check (ce , c , key );
1726
1730
} ZEND_HASH_FOREACH_END ();
1727
1731
} else {
1728
1732
if (ce -> num_interfaces >= current_iface_num ) {
@@ -1767,7 +1771,7 @@ static void zend_do_implement_interfaces(zend_class_entry *ce, zend_class_entry
1767
1771
}
1768
1772
/* skip duplications */
1769
1773
ZEND_HASH_FOREACH_STR_KEY_PTR (& iface -> constants_table , key , c ) {
1770
- do_inherit_constant_check (ce , c , key , iface );
1774
+ do_inherit_constant_check (ce , c , key );
1771
1775
} ZEND_HASH_FOREACH_END ();
1772
1776
1773
1777
iface = NULL ;
0 commit comments