--- /dev/null
+--TEST--
+implementing the same interface twice
+--FILE--
+<?php
+
+interface foo {
+}
+
+class bar implements foo, foo {
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+Fatal error: Cannot implement previously implemented interface foo in %s on line %d
--- /dev/null
+--TEST--
+extending the same interface twice
+--FILE--
+<?php
+
+interface foo {
+}
+
+interface bar extends foo, foo {
+}
+
+echo "Done\n";
+?>
+--EXPECTF--
+Fatal error: Cannot implement previously implemented interface foo in %s on line %d
ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC)
{
+ zend_uint i, if_num = ce->num_interfaces, cnt = 0;
+
+ for (i = 0; i < if_num; i++) {
+ if (ce->interfaces[i] != NULL && ce->interfaces[i]->name_length == iface->name_length && !memcmp(ce->interfaces[i]->name.v, iface->name.v, UG(unicode)?UBYTES(iface->name_length):iface->name_length)) {
+ cnt++;
+ if (cnt > 1) {
+ zend_error(E_COMPILE_ERROR, "Cannot implement previously implemented interface %v", iface->name);
+ }
+ }
+ }
+
zend_hash_merge_ex(&ce->constants_table, &iface->constants_table, (copy_ctor_func_t) zval_add_ref, sizeof(zval *), (merge_checker_func_t) do_inherit_constant_check, iface);
zend_hash_merge_ex(&ce->function_table, &iface->function_table, (copy_ctor_func_t) do_inherit_method, sizeof(zend_function), (merge_checker_func_t) do_inherit_method_check, ce);