@@ -3608,6 +3608,11 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
36083608 zend_do_traits_method_binding (ce , traits_and_interfaces , trait_exclude_tables , trait_aliases , false, & trait_contains_abstract_methods );
36093609 zend_do_traits_constant_binding (ce , traits_and_interfaces );
36103610 zend_do_traits_property_binding (ce , traits_and_interfaces );
3611+
3612+ zend_function * fn ;
3613+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , fn ) {
3614+ zend_fixup_trait_method (fn , ce );
3615+ } ZEND_HASH_FOREACH_END ();
36113616 }
36123617 if (parent ) {
36133618 if (!(parent -> ce_flags & ZEND_ACC_LINKED )) {
@@ -3618,6 +3623,13 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
36183623 if (ce -> num_traits ) {
36193624 if (trait_contains_abstract_methods ) {
36203625 zend_do_traits_method_binding (ce , traits_and_interfaces , trait_exclude_tables , trait_aliases , true, & trait_contains_abstract_methods );
3626+
3627+ /* New abstract methods may have been added, make sure to add
3628+ * ZEND_ACC_IMPLICIT_ABSTRACT_CLASS to ce. */
3629+ zend_function * fn ;
3630+ ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , fn ) {
3631+ zend_fixup_trait_method (fn , ce );
3632+ } ZEND_HASH_FOREACH_END ();
36213633 }
36223634
36233635 if (trait_exclude_tables ) {
@@ -3634,11 +3646,6 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
36343646 if (trait_aliases ) {
36353647 efree (trait_aliases );
36363648 }
3637-
3638- zend_function * fn ;
3639- ZEND_HASH_MAP_FOREACH_PTR (& ce -> function_table , fn ) {
3640- zend_fixup_trait_method (fn , ce );
3641- } ZEND_HASH_FOREACH_END ();
36423649 }
36433650 if (ce -> num_interfaces ) {
36443651 /* Also copy the parent interfaces here, so we don't need to reallocate later. */
0 commit comments